| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280 |
- using System;
- using System.Collections.Generic;
- using System.IO;
- using UnityEditor;
- using UnityEditor.Callbacks;
- namespace SUnityEditorTools
- {
- /// <summary>
- /// 用于捕捉编辑器变更事件,不做具体逻辑处理,只暴露各种封装事件
- ///
- /// 注意不要加具体逻辑在这里,namespace KAdminTools 没有具体逻辑依赖具体逻辑塞到KGameAdminEditor里
- ///
- /// 具体逻辑使用时,注意加上[InitializeOnLoad]
- /// </summary>
- [InitializeOnLoad]
- public class KUnityEditorEventCatcher
- {
- /// <summary>
- /// Editor update事件
- /// </summary>
- private static System.Action _OnEditorUpdateEvent;
- public static System.Action OnEditorUpdateEvent
- {
- get
- {
- return _OnEditorUpdateEvent;
- }
- set
- {
- _OnEditorUpdateEvent = value;
- if (IsInited && _OnEditorUpdateEvent != null)
- _OnEditorUpdateEvent();
- }
- }
- /// <summary>
- /// 将要播放游戏事件
- /// </summary>
- private static System.Action _OnWillPlayEvent;
- public static System.Action OnWillPlayEvent
- {
- get { return _OnWillPlayEvent; }
- set
- {
- _OnWillPlayEvent = value;
- //if (IsInited && _OnWillPlayEvent != null)
- // _OnWillPlayEvent();
- }
- }
- /// <summary>
- /// 进入播放时刻事件
- /// </summary>
- private static System.Action _OnBeginPlayEvent;
- public static System.Action OnBeginPlayEvent
- {
- get { return _OnBeginPlayEvent; }
- set
- {
- _OnBeginPlayEvent = value;
- //if (IsInited && _OnBeginPlayEvent != null)
- // _OnBeginPlayEvent();
- }
- }
- /// <summary>
- /// 将要停止游戏 (不包括暂停哦)
- /// </summary>
- private static System.Action _OnWillStopEvent;
- public static System.Action OnWillStopEvent
- {
- get { return _OnWillStopEvent; }
- set
- {
- _OnWillStopEvent = value;
- //if (IsInited && _OnWillStopEvent != null)
- // _OnWillStopEvent();
- }
- }
- /// <summary>
- /// 程序集锁定事件,事件中可以进行DLL的注入修改
- /// </summary>
- private static System.Action _OnLockingAssembly;
- public static System.Action OnLockingAssembly
- {
- get { return _OnLockingAssembly; }
- set
- {
- _OnLockingAssembly = value;
- if (IsInited && _OnLockingAssembly != null)
- _OnLockingAssembly();
- }
- }
- /// <summary>
- /// 编译前事件,比较特殊的处理,配合了PostBuildProcess和PostBuildScene
- /// </summary>
- public static Action OnBeforeBuildPlayerEvent;
- /// <summary>
- /// 编译完成后事件
- /// </summary>
- private static System.Action<BuildTarget, string> _OnPostBuildPlayerEvent;
- public static System.Action<BuildTarget, string> OnPostBuildPlayerEvent
- {
- get { return _OnPostBuildPlayerEvent;}
- set
- {
- _OnPostBuildPlayerEvent = value;
- }
- }
- /// <summary>
- /// Save Scene事件
- /// </summary>
- internal static System.Action _onSaveSceneEvent;
- public static System.Action OnSaveSceneEvent
- {
- get
- {
- return _onSaveSceneEvent;
- }
- set
- {
- _onSaveSceneEvent= value;
- }
- }
- /// <summary>
- /// 是否静态构造完成
- /// </summary>
- 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;
- }
- /// <summary>
- /// For BeforeBuildEvent, Because in Unity: PostProcessScene -> PostProcessScene ->.... PostProcessScene -> PostProcessBuild
- /// When true, waiting PostProcessBuild to revert to false
- /// </summary>
- private static bool _beforeBuildFlag = false;
- [PostProcessScene]
- private static void OnProcessScene()
- {
- if (!_beforeBuildFlag && !EditorApplication.isPlayingOrWillChangePlaymode)
- {
- _beforeBuildFlag = true;
- if (OnBeforeBuildPlayerEvent != null)
- OnBeforeBuildPlayerEvent();
- }
- }
- /// <summary>
- /// Unity标准Build后处理函数
- /// </summary>
- [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));
- }
- /// <summary>
- /// 播放状态改变,进行一些编译性的东西, 比如点击播放,编译文件、编译脚本、编译配置等
- /// </summary>
- 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();
- }
- }
- }
- }
- /// <summary>
- /// 捕捉编译过程中、同时播放游戏的状态,强制暂停,避免运行出错
- /// </summary>
- /// <param name="view"></param>
- //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;
- }
- }
- }
|