/// <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); } } }
/// <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 + "へ揺れ物系をコピーしました。"); }