對於靜態對象,Unity能夠使用經過勾選Static,而後讓Unity自身進行優化Draw Calls,可是對於動態對象,Unity在這方面沒有處理,這就須要咱們本身去實現,實現的原理就是首先去遍歷每一個對象的SkinnderMeshRenderer,而後將其全部的動態對象組合成一個大的對象而且將骨骼動畫賦值給他,這樣,咱們就實現了動態對象的優化,代碼以下:c#
public static void CombineToMesh(GameObject _go) { SkinnedMeshRenderer[] _smr = _go.GetComponentsInChildren<SkinnedMeshRenderer>(); List<CombineInstance> lcom = new List<CombineInstance>(); List<Material> lmat = new List<Material>(); List<Transform> ltra = new List<Transform>(); for (int i = 0; i < _smr.Length; i++) { lmat.AddRange(_smr[i].materials); ltra.AddRange(_smr[i].bones); for (int sub = 0; sub < _smr[i].sharedMesh.subMeshCount; sub++ ) { CombineInstance ci = new CombineInstance(); ci.mesh = _smr[i].sharedMesh; ci.subMeshIndex = sub; lcom.Add(ci); } Destroy(_smr[i].gameObject); } SkinnedMeshRenderer _r = _go.GetComponent<SkinnedMeshRenderer>(); if (_r == null) _r = _go.AddComponent<SkinnedMeshRenderer>(); _r.sharedMesh = new Mesh(); _r.bones = ltra.ToArray(); _r.materials = new Material[] { lmat[0] }; _r.rootBone = _go.transform; _r.sharedMesh.CombineMeshes(lcom.ToArray(), true, false); }
以上是完整的源代碼,你們只要將其調用便可。ide