Unity Model Stitching improved script .cs

Model Stitching .cs with Tag find function.

Code (csharp): ClothStitching
  1. using System.Collections.Generic;
    using UnityEngine;

    public class AvatarStitching : MonoBehaviour
    {
        public GameObject objPlayer;

        private ClothClass clothClassName;

        private void Awake()
        {
            if (!objPlayer) objPlayer = this.gameObject;
        }

        /// <summary>
        /// public add cloth function
        /// </summary>
        /// <param name="clothObj">Object to add</param>
        public void AddCloth(GameObject clothObj, ClothClass partType , bool bAttach)
        {

            if (!bAttach) { AddCloth(clothObj, partType.ToString(), objPlayer); }
            else { AddCloth(clothObj, partType.ToString(), partType.ToString()); }
        }
        /// <summary>
        ///  private attach cloth function
        /// </summary>
        /// <param name="clothOBJ"></param>
        /// <param name="rootName"></param>
        void AddCloth(GameObject clothOBJ, string tag, string rootName)
        {
            DestroyChildren(FindChildByName(tag, this.transform));
            Transform rootTransform = FindChildByName(rootName, this.transform);
            GameObject obj = Instantiate(clothOBJ, rootTransform);
            obj.transform.parent = rootTransform;
            obj.tag = tag;
        }

        /// <summary>
        /// private add cloth main function
        /// </summary>
        /// <param name="boneOBJ">Object to add</param>
        /// <param name="rootOBJ">Character object</param>
        void AddCloth(GameObject boneOBJ, string tag, GameObject rootOBJ)
        {
            DestroyOld(tag);
            var boneOBJs = boneOBJ.gameObject.GetComponentsInChildren<SkinnedMeshRenderer>();
            foreach (var skinnedRenderer in boneOBJs)
            {
                ProcessBoneObject(skinnedRenderer, rootOBJ, tag);
            }
        }

        void ProcessBoneObject( SkinnedMeshRenderer thisRenderer, GameObject rootObj, string tag)
        {
            //Create the SubObject
            var newObj = new GameObject(thisRenderer.gameObject.name);
            newObj.transform.parent = rootObj.transform;
            newObj.tag = tag;

            //Add the renderer
            newObj.AddComponent<SkinnedMeshRenderer>();
            var newRenderer = newObj.GetComponent<SkinnedMeshRenderer>();

            //Assemble Bone Structure
            var myBones = new Transform[thisRenderer.bones.Length];
            for(var i = 0; i < thisRenderer.bones.Length; i++)
                myBones[i] = FindChildByName(thisRenderer.bones[i].name, rootObj.transform);

            //Assemble Renderer
            newRenderer.bones = myBones;
            newRenderer.sharedMesh = thisRenderer.sharedMesh;
            newRenderer.sharedMaterials = thisRenderer.sharedMaterials;
        }

        /// <summary>
        /// Iterator for finding child class
        /// </summary>
        /// <param name="thisName"></param>
        /// <param name="thisGameObject"></param>
        /// <returns></returns>
         private Transform FindChildByName(string thisName, Transform thisGameObject)
        {
            Transform returnOBJ;
            if (thisGameObject.name == thisName)
                return thisGameObject;
            foreach(Transform child in thisGameObject)
            {
                returnOBJ = FindChildByName(thisName, child);
                if (returnOBJ) return returnOBJ;
            }
            return null;
        }

        private Transform[] FindChildsByTag(string thisTag, Transform thisGameObject)
        {
            List<Transform> returnOBJs = new List<Transform>();
            if (thisGameObject.tag == thisTag) returnOBJs.Add(thisGameObject);

            foreach (Transform child in thisGameObject)
            {
                if (child.tag == thisTag) returnOBJs.Add(child);
            }

            return returnOBJs.ToArray();
        }

        private void DestroyChildren(Transform rootTransform) {
            foreach (Transform child in rootTransform) Destroy(child.gameObject);
        }


    /*    private Transform FindChildByTag(string thisTag, Transform thisGameObject)
        {
            Transform returnOBJ;
            if (thisGameObject.tag == thisTag)
                return thisGameObject;
            foreach (Transform child in thisGameObject)
            {
                returnOBJ = FindChildByTag(thisTag, child);
                if (returnOBJ) return returnOBJ;
            }
            return null;
        }*/

        void DestroyOld(string name)
        {
            DestroyWithTag(name, objPlayer.transform);
            //ClothTagCheck(name, ref clothClassName);
        }

        void DestroyWithTag(string tagName, Transform parent)
        {
            Transform[] destroyTarget = FindChildsByTag(tagName, parent);

            foreach(var content in destroyTarget)
            {
                Destroy(content.gameObject);
            }
        }

    /*    void ClothTagCheck(string name, ref ClothClass clothClassOut)
        {
            foreach (ClothClass clothClass in System.Enum.GetValues(typeof(ClothClass)))
            {
                if (StringContains(name, clothClass.ToString()))
                {
                    clothClassOut = clothClass;
                    DestroyWithTag(clothClass, objPlayer.transform);
                }
            }
            return;
        }*/

        bool StringContains(string name, string search)
        {
            if (name.Contains(search)) return true;
            else return false;
        }
    }


Code (csharp): DataSet
  1. public enum ClothClass { Hair = 0, Upper, Lower, Onepiece , Shoes, Socks }





 

댓글

이 블로그의 인기 게시물

About AActor!!! "UObject" has no member "BeginPlay"

UNREAL Android build information

C++ 생성자 위임 (delegating constructor)