1. 程式人生 > >【Unity3d基礎】Unity換裝系統(2)

【Unity3d基礎】Unity換裝系統(2)

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);
    }
}
執行結果: