using System; using System.Collections.Generic; using System.IO; using UnityEditor; using UnityEditor.Callbacks; namespace SUnityEditorTools { /// /// 用于捕捉编辑器变更事件,不做具体逻辑处理,只暴露各种封装事件 /// /// 注意不要加具体逻辑在这里,namespace KAdminTools 没有具体逻辑依赖具体逻辑塞到KGameAdminEditor里 /// /// 具体逻辑使用时,注意加上[InitializeOnLoad] /// [InitializeOnLoad] public class KUnityEditorEventCatcher { /// /// Editor update事件 /// private static System.Action _OnEditorUpdateEvent; public static System.Action OnEditorUpdateEvent { get { return _OnEditorUpdateEvent; } set { _OnEditorUpdateEvent = value; if (IsInited && _OnEditorUpdateEvent != null) _OnEditorUpdateEvent(); } } /// /// 将要播放游戏事件 /// private static System.Action _OnWillPlayEvent; public static System.Action OnWillPlayEvent { get { return _OnWillPlayEvent; } set { _OnWillPlayEvent = value; //if (IsInited && _OnWillPlayEvent != null) // _OnWillPlayEvent(); } } /// /// 进入播放时刻事件 /// private static System.Action _OnBeginPlayEvent; public static System.Action OnBeginPlayEvent { get { return _OnBeginPlayEvent; } set { _OnBeginPlayEvent = value; //if (IsInited && _OnBeginPlayEvent != null) // _OnBeginPlayEvent(); } } /// /// 将要停止游戏 (不包括暂停哦) /// private static System.Action _OnWillStopEvent; public static System.Action OnWillStopEvent { get { return _OnWillStopEvent; } set { _OnWillStopEvent = value; //if (IsInited && _OnWillStopEvent != null) // _OnWillStopEvent(); } } /// /// 程序集锁定事件,事件中可以进行DLL的注入修改 /// private static System.Action _OnLockingAssembly; public static System.Action OnLockingAssembly { get { return _OnLockingAssembly; } set { _OnLockingAssembly = value; if (IsInited && _OnLockingAssembly != null) _OnLockingAssembly(); } } /// /// 编译前事件,比较特殊的处理,配合了PostBuildProcess和PostBuildScene /// public static Action OnBeforeBuildPlayerEvent; /// /// 编译完成后事件 /// private static System.Action _OnPostBuildPlayerEvent; public static System.Action OnPostBuildPlayerEvent { get { return _OnPostBuildPlayerEvent;} set { _OnPostBuildPlayerEvent = value; } } /// /// Save Scene事件 /// internal static System.Action _onSaveSceneEvent; public static System.Action OnSaveSceneEvent { get { return _onSaveSceneEvent; } set { _onSaveSceneEvent= value; } } /// /// 是否静态构造完成 /// public static bool IsInited { get; private set; } static KUnityEditorEventCatcher() { EditorApplication.update -= OnEditorUpdate; EditorApplication.update += OnEditorUpdate; // change by sunxun on 20211011 for warnning; //SceneView.onSceneGUIDelegate -= OnSceneViewGUI; SceneView.duringSceneGui -= OnSceneViewGUI; //SceneView.onSceneGUIDelegate += OnSceneViewGUI; SceneView.duringSceneGui += OnSceneViewGUI; // change by sunxun on 20181019 for warnning; //EditorApplication.playmodeStateChanged -= OnPlayModeStateChanged; EditorApplication.playModeStateChanged -= OnPlayModeStateChanged; //EditorApplication.playmodeStateChanged += OnPlayModeStateChanged; EditorApplication.playModeStateChanged += OnPlayModeStateChanged; if (OnLockingAssembly != null) { EditorApplication.LockReloadAssemblies(); OnLockingAssembly(); EditorApplication.UnlockReloadAssemblies(); } IsInited = true; } /// /// For BeforeBuildEvent, Because in Unity: PostProcessScene -> PostProcessScene ->.... PostProcessScene -> PostProcessBuild /// When true, waiting PostProcessBuild to revert to false /// private static bool _beforeBuildFlag = false; [PostProcessScene] private static void OnProcessScene() { if (!_beforeBuildFlag && !EditorApplication.isPlayingOrWillChangePlaymode) { _beforeBuildFlag = true; if (OnBeforeBuildPlayerEvent != null) OnBeforeBuildPlayerEvent(); } } /// /// Unity标准Build后处理函数 /// [PostProcessBuild()] private static void OnPostBuildPlayer(BuildTarget target, string pathToBuiltProject) { if (OnPostBuildPlayerEvent != null) { OnPostBuildPlayerEvent(target, pathToBuiltProject); } UnityEngine.Debug.Log(string.Format("Success build ({0}) : {1}", target, pathToBuiltProject)); } /// /// 播放状态改变,进行一些编译性的东西, 比如点击播放,编译文件、编译脚本、编译配置等 /// private static void OnPlayModeStateChanged(PlayModeStateChange state) { if (EditorApplication.isPlayingOrWillChangePlaymode) { if (!EditorApplication.isPlaying) // means Will Change to Playmode { if (OnWillPlayEvent != null) { OnWillPlayEvent(); } } else { if (OnBeginPlayEvent != null) { OnBeginPlayEvent(); } } } else { if (EditorApplication.isPlaying) { if (OnWillStopEvent != null) { OnWillStopEvent(); } } } } /// /// 捕捉编译过程中、同时播放游戏的状态,强制暂停,避免运行出错 /// /// //static void OnSceneViewGUI(SceneView view) static void OnEditorUpdate() { CheckComplie(); if (OnEditorUpdateEvent != null) { OnEditorUpdateEvent(); } } private static void OnSceneViewGUI(SceneView sceneview) { CheckComplie(); } static void CheckComplie() { // 检查编译中,立刻暂停游戏! if (EditorApplication.isCompiling) { if (EditorApplication.isPlaying) { UnityEngine.Debug.Log("Force Stop Play, because of Compiling."); EditorApplication.isPlaying = false; } } } } internal class SaveSceneAssetModificationProcessor : UnityEditor.AssetModificationProcessor { public static string[] OnWillSaveAssets(string[] paths) { foreach (string path in paths) { if (path.Contains(".unity")) { //scenePath = Path.GetDirectoryName(path); //sceneName = Path.GetFileNameWithoutExtension(path); // KUnityEditorEventCatcher._onSaveSceneEvent(); } } return paths; } } }