using System.Collections; using System.Collections.Generic; using System.IO; using UnityEditor; using UnityEngine; public class PrefabPostProcessor : PostProcessor { private GameObject Prefab { get; set; } private GameObject ClonedPrefab { get; set; } private string PrefabPath => PrefabUtility.GetPrefabAssetPathOfNearestInstanceRoot(_processInstructor); protected override string ResourcesBaseDir => PREFAB_POSTPROCESS_DIR; protected override string PostProcessFolderName => Path.GetFileNameWithoutExtension(PrefabPath.Replace("/", "_")); protected override Object AssetToPostProcess => AssetDatabase.LoadAssetAtPath(PrefabPath); protected override string OutputAssetPath => $"{ProcessedResourceDir}/{Prefab.name}_{SCENE_POST_PROCESS_NAME}.prefab"; protected override void Init(PostProcessInstructor postProcessInstructor) { base.Init(postProcessInstructor); Prefab = PrefabUtility.GetNearestPrefabInstanceRoot(postProcessInstructor); } protected override PostProcessInstructor Clone() { PrefabUtility.ApplyPrefabInstance(Prefab, InteractionMode.AutomatedAction); AssetDatabase.CopyAsset(PrefabPath, OutputAssetPath); AssetDatabase.Refresh(); ClonedPrefab = PrefabUtility.InstantiatePrefab(AssetDatabase.LoadAssetAtPath(OutputAssetPath)) as GameObject; if (ClonedPrefab == null) { Debug.LogError("Clone Prefab is null"); return null; } var result = ClonedPrefab.GetComponentInChildren(); return result; } protected override void AfterAll(bool destroyAfterPostProcess) { PrefabUtility.ApplyPrefabInstance(ClonedPrefab, InteractionMode.AutomatedAction); EditorUtil.AddPathToAddressable(ProcessedResourceDir, PREFAB_ADDRESSABLE_GROUP); if (destroyAfterPostProcess) Object.DestroyImmediate(ClonedPrefab); //EditorGUIUtility.PingObject(ClonedPrefab); } }