using UnityEngine;using System.Collections;using System.Collections.Generic;public class CombineMesh : MonoBehaviour{ void OnGUI() { if (GUI.Button(new Rect(0, 0, 200, 30), "CombineMeshes")) { CombineMeshes(); } } public void CombineMeshes() { SkinnedMeshRenderer[] smr = gameObject.GetComponentsInChildren<SkinnedMeshRenderer>(); List<CombineInstance> combineInstances = new List<CombineInstance>(); List<Material> materials = new List<Material>(); List<Transform> bones = new List<Transform>(); for (int i = 0; i < smr.Length; i++) { materials.AddRange(smr[i].materials); bones.AddRange(smr[i].bones); // 收集待合并的對(duì)象信息 for (int k = 0; k < smr[i].sharedMesh.subMeshCount; k++) { CombineInstance ci = new CombineInstance(); ci.mesh = smr[i].sharedMesh; ci.subMeshIndex = k; combineInstances.Add(ci); } // 刪除原有模型的對(duì)象(如果有還原外觀的需求,也可以暫時(shí)將對(duì)象的活動(dòng)狀態(tài)設(shè)置為false,代碼如下) // smr[i].gameObject.SetActive(false); Destroy(smr[i].gameObject); } // 創(chuàng)建新的SkinnedMeshRenderer,合并后的mesh數(shù)據(jù)都在該對(duì)象下 SkinnedMeshRenderer combinedSMR = gameObject.GetComponent<SkinnedMeshRenderer>(); if (combinedSMR == null) { combinedSMR = gameObject.AddComponent<SkinnedMeshRenderer>(); } combinedSMR.sharedMesh = new Mesh(); combinedSMR.bones = bones.ToArray(); combinedSMR.materials = materials.ToArray(); combinedSMR.rootBone = gameObject.transform; // 由于合并mesh的material數(shù)據(jù)不統(tǒng)一,因此第二項(xiàng)參數(shù)不能設(shè)置為true combinedSMR.sharedMesh.CombineMeshes(combineInstances.ToArray(), false, false); }}運(yùn)行結(jié)果:
可以看到合并后人物的各個(gè)部件都合并到新創(chuàng)建的skinnenMeshRenderer下了,Unity Editor中Statistics中visible skinned meshes的數(shù)量也由9個(gè)變成了1個(gè)。總結(jié)分析性能方面會(huì)由于skinned mesh renderer的減少而減輕cpu的負(fù)擔(dān),而在代碼中然而在導(dǎo)入模型資源時(shí),需要將read/write enabled打鉤。
而該選項(xiàng)會(huì)增加內(nèi)存的占用,mesh為了可以在代碼中進(jìn)行修改,需要保留一份拷貝而駐留內(nèi)存。官方的說(shuō)明如下:Read/Write EnabledIf enabled, Mesh data is kept in memory so that a custom script can read and change it. Disabling this option saves memory, because Unity can unload a copy of Mesh data in the game. However, in certain cases when the Mesh is used with a Mesh Collider, this option must be enabled.
新聞熱點(diǎn)
疑難解答
圖片精選
網(wǎng)友關(guān)注