using UnityEngine; #if UNITY_EDITOR using System; using System.Collections.Generic; using UnityEditor.Experimental.SceneManagement; #endif public sealed class PrefabInPrefabSwapper : MonoBehaviour { #if UNITY_EDITOR [SerializableAttribute] public sealed class SwapInfo { [SerializeField] private string swapTargetName = default; public string SwapTargetName { get{ return swapTargetName; } } [SerializeField] private GameObject swapPrefab = default; public GameObject SwapPrefab { get{ return swapPrefab; } } } [SerializeField] private SwapInfo[] swapInfoArray = new SwapInfo[1]; [ContextMenu("SwapPrefab")] private void SwapPrefab(){ foreach(var info in swapInfoArray){ if(info.SwapTargetName.Length <= 0) continue; if(info.SwapPrefab == null) continue; var swapList = new List(); transform.AllChildrens(t => { if(t.name.Contains(info.SwapTargetName)){ swapList.Add(t); } }); foreach(var from in swapList){ var to = (UnityEditor.PrefabUtility.InstantiatePrefab(info.SwapPrefab, PrefabStageUtility.GetCurrentPrefabStage().scene) as GameObject).transform; to.parent = from.parent; to.localPosition = from.localPosition; to.localRotation = from.localRotation; to.localScale = from.localScale; DestroyImmediate(from.gameObject); } } } #endif }