Ejemplo n.º 1
0
        /// <summary>
        /// Spring系コンポーネントを削除する
        /// </summary>
        private static void RemoveSpringComponents(GameObject obj)
        {
            // 指定オブジェクトのルート取得
            var root = obj.GetRoot();

            // root下の全オブジェクトを取得
            GameObject[] objs = GameObjectExtensions.GetChildren(root);

            // DynamicBoneを削除
            objs.Select(a => a.GetComponent <DynamicBone>()).Where(a => a != null).ToList().ForEach(Undo.DestroyObjectImmediate);
            // DynamicBoneColliderを削除

            // RootObjの子をすべて探索し格納
            List <GameObject> rootObjList = GetAllChildren.GetAll(root);

            // コピー先を探索しDynamicBoneColliderがあったら参照
            foreach (GameObject child in rootObjList)
            {
                if (child.GetComponent <DynamicBoneCollider>())
                {
                    Undo.DestroyObjectImmediate(child);
                }
            }
        }
Ejemplo n.º 2
0
        /// <summary>
        /// オリジナルからコピー先へコピーする
        /// </summary>
        public static void Copy(GameObject original, GameObject copy)
        {
            // 念のためオブジェクトのrootを取得
            original = GameObjectExtensions.GetRoot(original);
            copy     = GameObjectExtensions.GetRoot(copy);

            // originalのSpring系のコンポーネントがアタッチされている全オブジェクトを取得する

            // originalの全オブジェクトを取得
            var originalChildrens = GameObjectExtensions.GetChildren(original);

            // copyの全オブジェクトを取得
            var copyChildrens = GameObjectExtensions.GetChildren(copy);

            //************************
            // DynamicBoneColliderのコピー
            //************************

            // originalからDynamicBoneColliderがアタッチされているオブジェクトを取得
            var colliders = originalChildrens.Where(a => a.GetComponent <DynamicBoneCollider>()).ToList();

            // colliderListの親を取得
            var colliderParents = colliders.Select(a => a.GetParent()).ToList();

            // Boneの配列に受け渡す用
            List <GameObject> colliderObjs = new List <GameObject>();

            foreach (var child in copyChildrens)
            {
                foreach (var parent in colliderParents)
                {
                    foreach (var collider in colliders)
                    {
                        if (child.name.Equals(parent.name) && parent.name.Equals(collider.GetParent().name))
                        {
                            // 同じ階層に複数Colliderがあると重複分複製してしまうので判定
                            bool isDuplication = false;

                            foreach (var obj in colliderObjs)
                            {
                                if (collider.name.Contains(obj.name))
                                {
                                    isDuplication = true;
                                    break;
                                }
                            }

                            if (!isDuplication)
                            {
                                colliderObjs.Add(CreateCopyObject(collider, child));
                            }
                        }
                    }
                }
            }

            // Colliderのオブジェクトを追加したので更新
            originalChildrens = GameObjectExtensions.GetChildren(original);
            copyChildrens     = GameObjectExtensions.GetChildren(copy);

            //************************
            // DynamicBoneのコピー
            //************************

            // originalからDynamicBoneがアタッチされているオブジェクトを取得
            var bones = originalChildrens.Where(a => a.GetComponent <DynamicBone>()).ToList();

            List <DynamicBone> boneObjs = new List <DynamicBone>();

            foreach (var child in copyChildrens)
            {
                foreach (var bone in bones)
                {
                    if (child.name.Equals(bone.name))
                    {
                        DynamicBone boneCompo = null;


                        boneCompo = AddBoneComponent(bone, copyChildrens, child);

                        if (boneCompo != null)
                        {
                            boneObjs.Add(boneCompo);
                        }
                    }
                }
            }



            // Colliderのオブジェクトを追加したので更新
            originalChildrens = GameObjectExtensions.GetChildren(original);
            copyChildrens     = GameObjectExtensions.GetChildren(copy);

            //************************
            // SpringManagerのコピー
            //************************

            // SpringMangerをもつオブジェクトを抜き出す
            var managerlist = originalChildrens.Where(a => a.GetComponent <SpringManager>()).ToList();

            managerlist.ForEach(print);

            foreach (var item in managerlist)
            {
                var obj = GameObjectExtensions.SearchGameObject(copy, item.name);

                if (obj != null)
                {
                    AddMangerComponent(obj, copyChildrens, item);
                }
            }

            print(original.name + "から" + copy.name + "へ揺れ物系をコピーしました。");
        }