118 lines
3.5 KiB
C#
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));
|
|
}
|
|
} |