【Unity3d基礎】Unity換裝系統(2)
阿新 • • 發佈:2019-02-05
執行結果: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); // 收集待合併的物件資訊 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); } // 刪除原有模型的物件(如果有還原外觀的需求,也可以暫時將物件的活動狀態設定為false,程式碼如下) // smr[i].gameObject.SetActive(false); Destroy(smr[i].gameObject); } // 建立新的SkinnedMeshRenderer,合併後的mesh資料都在該物件下 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資料不統一,因此第二項引數不能設定為true combinedSMR.sharedMesh.CombineMeshes(combineInstances.ToArray(), false, false); } }