Mesh—合并网格提升性能
生活随笔
收集整理的這篇文章主要介紹了
Mesh—合并网格提升性能
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
將多個網格合并為一個網格,即將多個模型合并為一個模型。
如下面兩個模型:
從右邊可以看出它是由兩個模型組成。有些時候我們會希望這兩個模型使用同一個Collider,但是我們不
可能還要美術從新做一個碰撞,因為物體的擺放不是固定的。
所以我們就要使用到Untiy的一個API——CombineMeshes。
具體可以查看https://docs.unity3d.com/ScriptReference/Mesh.CombineMeshes.html
現在實現這個功能,我們選取圖中某個對象做為父對象,將其他一個對象作為它的子對象。新建一個腳
本,添加到父對象上。
using UnityEngine; using System.Collections;public class CombineMeshes : MonoBehaviour {void Start(){GetMesh(transform);}void GetMesh(Transform ts){MeshFilter[] meshFilters = ts.GetComponentsInChildren<MeshFilter>(); //獲取自身和所有子物體中所有MeshFilter組件CombineInstance[] combine = new CombineInstance[meshFilters.Length]; //新建CombineInstance數組MeshRenderer[] Renderer = ts.GetComponentsInChildren<MeshRenderer>(); //獲取自身和所有子物體中所有MeshRenderer組件Material[] mats = new Material[Renderer.Length]; //新建材質球數組for (int i = 0; i < meshFilters.Length; i++){mats[i] = Renderer[i].sharedMaterial; //獲取材質球列表combine[i].mesh = meshFilters[i].sharedMesh;//矩陣(Matrix)自身空間坐標的點轉換成世界空間坐標的點 //combines[i].transform = meshFilters[i].transform.localToWorldMatrix;//變換矩陣的問題,要保持相對位置不變,要轉換為父節點的本地坐標,combines[i].transform = ts.worldToLocalMatrix * meshFilters[i].transform.localToWorldMatrix;if (meshFilters[i].gameObject.name != gameObject.name) //除了根物體,其他物體統統銷毀{Destroy(meshFilters[i].gameObject);}}ts.GetComponent<MeshFilter>().mesh = new Mesh();ts.GetComponent<MeshFilter>().mesh.CombineMeshes(combine, false);/*為mesh.CombineMeshes添加一個 false 參數,表示并不是合并為一個網格,而是一個子網格列表,可以讓擁有多個材質球,如果要合并的網格用的是同一材質,false改為true,同時將上面的獲取Material的代碼去掉*/ts.GetComponent<MeshRenderer>().sharedMaterials = mats; //為合并后的GameObject指定材質球數組}}我們這里選取Cube為父物體,Sphere為子物體,同時將腳本添加到Cube身上。
現在運行,你會發現,Sphere被刪除了,而它的模型卻還依然存在,他的網格已經和Cube合并在一起
了,同時Cube也擁有了兩個材質球。
另外盡量保證根物體的縮放是1:1:1,不然就會發現合并完的模型完全變形了。
總結
以上是生活随笔為你收集整理的Mesh—合并网格提升性能的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: web网页设计期末课程大作业:环境保护主
- 下一篇: 2021年图灵奖简介