NLDClient-yudde/ProjectNLD/Assets/Editor/Scene/PostProcesser/ScenePostProcessor.cs

118 lines
3.5 KiB
C#

using System.Collections;
using System.Collections.Generic;
using System.IO;
using UnityEditor;
using UnityEditor.SceneManagement;
using UnityEngine;
using UnityEngine.SceneManagement;
public class ScenePostProcessor : PostProcessor
{
/// <summary>
/// 原场景
/// </summary>
private Scene Scene { get; set; }
/// <summary>
/// 后处理场景
/// </summary>
private Scene ClonedScene { get; set; }
/// <summary>
/// 后处理场景根路径
/// </summary>
private const string SCENE_POSTPROCESS_DIR = "Assets/Art_Out/AutoGen/PostProcessScenes";
/// <summary>
/// 场景后处理根文件路径
/// </summary>
protected override string ResourcesBaseDir => SCENE_POSTPROCESS_DIR;
/// <summary>
/// 后处理场景父路径
/// </summary>
protected override string PostProcessFolderName => Path.GetFileNameWithoutExtension(scenePath.Replace("/", "_"));
/// <summary>
/// 原场景资源
/// </summary>
protected override Object AssetToPostProcess => AssetDatabase.LoadAssetAtPath<SceneAsset>(scenePath);
/// <summary>
/// 后处理场景路径
/// </summary>
protected override string OutputAssetPath => $"{ProcessedResourceDir}/{sceneName}_{SCENE_POST_PROCESS_NAME}.unity";
/// <summary>
/// 原场景路径
/// </summary>
private string scenePath;
/// <summary>
/// 原场景名字
/// </summary>
private string sceneName;
protected override void Init(PostProcessInstructor postProcessInstructor)
{
base.Init(postProcessInstructor);
Scene = postProcessInstructor.gameObject.scene;
// 保存场景名字及路径
scenePath = Scene.path;
sceneName = Scene.name;
}
protected override PostProcessInstructor Clone()
{
var sceneCount = SceneManager.sceneCount;
for (int i = 0; i < sceneCount; i++)
{
var scene = SceneManager.GetSceneAt(i);
if (scene.name.Contains(SCENE_POST_PROCESS_NAME))
EditorSceneManager.CloseScene(scene, true);
}
AssetDatabase.CopyAsset(Scene.path, OutputAssetPath);
AssetDatabase.Refresh();
ClonedScene = EditorSceneManager.OpenScene(OutputAssetPath, OpenSceneMode.Additive);
EditorSceneManager.MarkAllScenesDirty();
var result = FindInstructorInScene(ClonedScene);
// 关闭原始场景
CloseOriginalScene();
return result;
}
/// <summary>
/// 关闭原始场景
/// </summary>
private void CloseOriginalScene()
{
try
{
if (SceneManager.sceneCount > 1)
{
Debug.Log($"关闭原始场景: {Scene.name}");
EditorSceneManager.CloseScene(Scene, true);
}
else
{
Debug.LogWarning("只有一个场景打开,无法关闭原始场景,需要至少保留一个场景。");
}
}
catch (System.Exception ex)
{
Debug.LogError($"关闭原始场景时出错: {ex.Message}");
}
}
protected override void AfterAll(bool destroyAfterPostProcess)
{
EditorSceneManager.SaveOpenScenes();
EditorUtil.AddPathToAddressable(ProcessedResourceDir, SCENE_ADDRESSABLE_GROUP);
if (destroyAfterPostProcess)
EditorSceneManager.CloseScene(ClonedScene, true);
EditorGUIUtility.PingObject(AssetDatabase.LoadAssetAtPath<SceneAsset>(ClonedScene.path));
}
}