(合併前)
這裏我做了N個小球 疊加在一起
可以看到這些小球的mesh很複雜。
運行起來看一下
batches達到了549,這是一個毀滅性的現象。會造成大量的draw call,導致性能降低。
接下來進行 mergemesh
Batching Static
其實可以設置爲Batching Static 來達到相似的目的,但是這樣有個侷限性,就是這樣設定了的物體不能移動,因爲相當於強制讓他執行靜態批處理。
(合併後)
可以發現batches降低爲9.
觀察合併後的Filter,和之前沒什麼兩樣,而且可以移動
using UnityEngine;
public class ChinarMergeMesh : MonoBehaviour
{
void Start()
{
MeshFilter[] meshFilters = GetComponentsInChildren<MeshFilter>(); //獲取 所有子物體的網格
CombineInstance[] combineInstances = new CombineInstance[meshFilters.Length]; //新建一個合併組,長度與 meshfilters一致
for (int i = 0; i < meshFilters.Length; i++) //遍歷
{
combineInstances[i].mesh = meshFilters[i].sharedMesh; //將共享mesh,賦值
combineInstances[i].transform = meshFilters[i].transform.localToWorldMatrix; //本地座標轉矩陣,賦值
}
Mesh newMesh = new Mesh(); //聲明一個新網格對象
newMesh.CombineMeshes(combineInstances); //將combineInstances數組傳入函數
gameObject.AddComponent<MeshFilter>().sharedMesh = newMesh; //給當前空物體,添加網格組件;將合併後的網格,給到自身網格
//到這裏,新模型的網格就已經生成了。運行模式下,可以點擊物體的 MeshFilter 進行查看網格
#region 以下是對新模型做的一些處理:添加材質,關閉所有子物體,添加自轉腳本和控制相機的腳本
gameObject.AddComponent<MeshRenderer>().material = Resources.Load<Material>("Materials/Koala"); //給當前空物體添加渲染組件,給新模型網格上色;
foreach (Transform t in transform) t.gameObject.SetActive(false); //禁用掉所有子物體
#endregion
}
}