その先にあるもの…

CombineMeshes 본문

프로그래밍/Unity

CombineMeshes

specialJ 2015. 10. 7. 17:02

* 본만 들어있는 프리팹에 동일한 본을 사용하는 캐릭터 파트들을 읽어 캐릭터 조립하기


   //Load prefab

        GameObject rootGo = Reousrces.Load( rootFile );

        rootGo = GameObject.Instantiate(rootGo) as GameObject;


        // bone list

        Transform[] transforms = rootGo.GetComponentsInChildren<Transform>();


        // delete parts prefabs list

        List<GameObject> listObj = new List<GameObject>();


        //parts skinmesh list

        List<SkinnedMeshRenderer> skinnedMesh = new List<SkinnedMeshRenderer>();


        //load part

   GameObject obj = Resources.LoadbodyPart );

        obj = GameObject.Instantiate(obj) as GameObject;

        listObj.Add(obj);


   // part의 스킨메쉬 모으기

        for (int i = 0; i < obj.GetComponentsInChildren<SkinnedMeshRenderer>().Length; i++)

        {

            skinnedMesh.Add(obj.GetComponentsInChildren<SkinnedMeshRenderer>()[i]);

        }


   //load part

   objResources.Load( facePart );

        obj = GameObject.Instantiate(obj) as GameObject;

        listObj.Add(obj);


   // part의 스킨메쉬 모으기

        for (int i = 0; i < obj.GetComponentsInChildren<SkinnedMeshRenderer>().Length; i++)

        {

            skinnedMesh.Add(obj.GetComponentsInChildren<SkinnedMeshRenderer>()[i]);

        }


   //load part

   obj = Resources.LoadhairPart );

        obj = GameObject.Instantiate(obj) as GameObject;

        listObj.Add(obj);


   // part의 스킨메쉬 모으기

        for (int i = 0; i < obj.GetComponentsInChildren<SkinnedMeshRenderer>().Length; i++)

        {

            skinnedMesh.Add(obj.GetComponentsInChildren<SkinnedMeshRenderer>()[i]);

        }


   // 모은 스킨 메쉬에 본 정보 변경하기

        foreach (SkinnedMeshRenderer element in skinnedMesh)    

        {

            SkinnedMeshRenderer smr = element;


            Transform rootBone = null;

            List<Transform> bones = new List<Transform>();


            //파트에 있는 본 정보와 프리팹의 본 정보 비교

            foreach (Transform bone in smr.bones)

            {

                foreach (Transform trans in transforms)

                {

                    if (trans.name != bone.name) continue;

                    if (smr.rootBone.name == trans.name)

                        rootBone = trans;

                    bones.Add(trans);

                }

            }


  //변경된 본 정보를 스킨매쉬로

            smr.bones = bones.ToArray();

            smr.rootBone = rootBone;


  // CombineInstance 생성 후 팥의 sharedMesh정보 연결

            List<CombineInstance> combineInstances = new List<CombineInstance>();

            CombineInstance ci = new CombineInstance();

            ci.mesh = smr.sharedMesh;

            combineInstances.Add(ci);


  // 새로운 skinnedMeshRenderer생성 후 파트 renderer 정보 복사

            GameObject skinned = new GameObject();

            SkinnedMeshRenderer r1 = skinned.AddComponent<SkinnedMeshRenderer>();

            SkinnedMeshRenderer r = GetCopyOf<SkinnedMeshRenderer>(smr, r1);


  // 새로운 SkinnedMeshRenderer에 정보 갱신

            r.bones = bones.ToArray();

            r.rootBone = rootBone;

            r.localBounds = smr.localBounds;

            r.quality = smr.quality;

            r.sharedMesh = new Mesh();

            r.sharedMesh.CombineMeshes(combineInstances.ToArray(), false, false);

            r.materials = smr.materials;


            r.updateWhenOffscreen = smr.updateWhenOffscreen;

            r.transform.parent = rootGo.transform;


            GameObject.Destroy(r1.transform.root.gameObject);

        }


   // 읽어온 파트들 지우기

        for (int i = 0; i < listObj.Count; i++)

        {

            GameObject.Destroy(listObj[i]);

        }


        Animator ani = rootGo.GetComponent<Animator>();

        if( ani == null )

            rootGo.AddComponent<Animator>();


   // 실시간으로 생성하서 보여주면 애니가 적용안되어

   // 껐다 켜주면 애니가 적용됨.

        rootGo.SetActive(false);

        rootGo.SetActive(true);


        return rootGo;


'프로그래밍 > Unity' 카테고리의 다른 글

LayerMask  (0) 2015.12.22
LightMap 스크립트에서 불러오기  (0) 2015.09.14
Surface Shader  (0) 2015.09.02
shuriken rotation  (0) 2015.09.01
Caemra::CopyFrom  (0) 2015.08.19
Comments