SUnityEditorEventCatcher.cs 8.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280
  1. using System;
  2. using System.Collections.Generic;
  3. using System.IO;
  4. using UnityEditor;
  5. using UnityEditor.Callbacks;
  6. namespace SUnityEditorTools
  7. {
  8. /// <summary>
  9. /// 用于捕捉编辑器变更事件,不做具体逻辑处理,只暴露各种封装事件
  10. ///
  11. /// 注意不要加具体逻辑在这里,namespace KAdminTools 没有具体逻辑依赖具体逻辑塞到KGameAdminEditor里
  12. ///
  13. /// 具体逻辑使用时,注意加上[InitializeOnLoad]
  14. /// </summary>
  15. [InitializeOnLoad]
  16. public class KUnityEditorEventCatcher
  17. {
  18. /// <summary>
  19. /// Editor update事件
  20. /// </summary>
  21. private static System.Action _OnEditorUpdateEvent;
  22. public static System.Action OnEditorUpdateEvent
  23. {
  24. get
  25. {
  26. return _OnEditorUpdateEvent;
  27. }
  28. set
  29. {
  30. _OnEditorUpdateEvent = value;
  31. if (IsInited && _OnEditorUpdateEvent != null)
  32. _OnEditorUpdateEvent();
  33. }
  34. }
  35. /// <summary>
  36. /// 将要播放游戏事件
  37. /// </summary>
  38. private static System.Action _OnWillPlayEvent;
  39. public static System.Action OnWillPlayEvent
  40. {
  41. get { return _OnWillPlayEvent; }
  42. set
  43. {
  44. _OnWillPlayEvent = value;
  45. //if (IsInited && _OnWillPlayEvent != null)
  46. // _OnWillPlayEvent();
  47. }
  48. }
  49. /// <summary>
  50. /// 进入播放时刻事件
  51. /// </summary>
  52. private static System.Action _OnBeginPlayEvent;
  53. public static System.Action OnBeginPlayEvent
  54. {
  55. get { return _OnBeginPlayEvent; }
  56. set
  57. {
  58. _OnBeginPlayEvent = value;
  59. //if (IsInited && _OnBeginPlayEvent != null)
  60. // _OnBeginPlayEvent();
  61. }
  62. }
  63. /// <summary>
  64. /// 将要停止游戏 (不包括暂停哦)
  65. /// </summary>
  66. private static System.Action _OnWillStopEvent;
  67. public static System.Action OnWillStopEvent
  68. {
  69. get { return _OnWillStopEvent; }
  70. set
  71. {
  72. _OnWillStopEvent = value;
  73. //if (IsInited && _OnWillStopEvent != null)
  74. // _OnWillStopEvent();
  75. }
  76. }
  77. /// <summary>
  78. /// 程序集锁定事件,事件中可以进行DLL的注入修改
  79. /// </summary>
  80. private static System.Action _OnLockingAssembly;
  81. public static System.Action OnLockingAssembly
  82. {
  83. get { return _OnLockingAssembly; }
  84. set
  85. {
  86. _OnLockingAssembly = value;
  87. if (IsInited && _OnLockingAssembly != null)
  88. _OnLockingAssembly();
  89. }
  90. }
  91. /// <summary>
  92. /// 编译前事件,比较特殊的处理,配合了PostBuildProcess和PostBuildScene
  93. /// </summary>
  94. public static Action OnBeforeBuildPlayerEvent;
  95. /// <summary>
  96. /// 编译完成后事件
  97. /// </summary>
  98. private static System.Action<BuildTarget, string> _OnPostBuildPlayerEvent;
  99. public static System.Action<BuildTarget, string> OnPostBuildPlayerEvent
  100. {
  101. get { return _OnPostBuildPlayerEvent;}
  102. set
  103. {
  104. _OnPostBuildPlayerEvent = value;
  105. }
  106. }
  107. /// <summary>
  108. /// Save Scene事件
  109. /// </summary>
  110. internal static System.Action _onSaveSceneEvent;
  111. public static System.Action OnSaveSceneEvent
  112. {
  113. get
  114. {
  115. return _onSaveSceneEvent;
  116. }
  117. set
  118. {
  119. _onSaveSceneEvent= value;
  120. }
  121. }
  122. /// <summary>
  123. /// 是否静态构造完成
  124. /// </summary>
  125. public static bool IsInited { get; private set; }
  126. static KUnityEditorEventCatcher()
  127. {
  128. EditorApplication.update -= OnEditorUpdate;
  129. EditorApplication.update += OnEditorUpdate;
  130. // change by sunxun on 20211011 for warnning;
  131. //SceneView.onSceneGUIDelegate -= OnSceneViewGUI;
  132. SceneView.duringSceneGui -= OnSceneViewGUI;
  133. //SceneView.onSceneGUIDelegate += OnSceneViewGUI;
  134. SceneView.duringSceneGui += OnSceneViewGUI;
  135. // change by sunxun on 20181019 for warnning;
  136. //EditorApplication.playmodeStateChanged -= OnPlayModeStateChanged;
  137. EditorApplication.playModeStateChanged -= OnPlayModeStateChanged;
  138. //EditorApplication.playmodeStateChanged += OnPlayModeStateChanged;
  139. EditorApplication.playModeStateChanged += OnPlayModeStateChanged;
  140. if (OnLockingAssembly != null)
  141. {
  142. EditorApplication.LockReloadAssemblies();
  143. OnLockingAssembly();
  144. EditorApplication.UnlockReloadAssemblies();
  145. }
  146. IsInited = true;
  147. }
  148. /// <summary>
  149. /// For BeforeBuildEvent, Because in Unity: PostProcessScene -> PostProcessScene ->.... PostProcessScene -> PostProcessBuild
  150. /// When true, waiting PostProcessBuild to revert to false
  151. /// </summary>
  152. private static bool _beforeBuildFlag = false;
  153. [PostProcessScene]
  154. private static void OnProcessScene()
  155. {
  156. if (!_beforeBuildFlag && !EditorApplication.isPlayingOrWillChangePlaymode)
  157. {
  158. _beforeBuildFlag = true;
  159. if (OnBeforeBuildPlayerEvent != null)
  160. OnBeforeBuildPlayerEvent();
  161. }
  162. }
  163. /// <summary>
  164. /// Unity标准Build后处理函数
  165. /// </summary>
  166. [PostProcessBuild()]
  167. private static void OnPostBuildPlayer(BuildTarget target, string pathToBuiltProject)
  168. {
  169. if (OnPostBuildPlayerEvent != null)
  170. {
  171. OnPostBuildPlayerEvent(target, pathToBuiltProject);
  172. }
  173. UnityEngine.Debug.Log(string.Format("Success build ({0}) : {1}", target, pathToBuiltProject));
  174. }
  175. /// <summary>
  176. /// 播放状态改变,进行一些编译性的东西, 比如点击播放,编译文件、编译脚本、编译配置等
  177. /// </summary>
  178. private static void OnPlayModeStateChanged(PlayModeStateChange state)
  179. {
  180. if (EditorApplication.isPlayingOrWillChangePlaymode)
  181. {
  182. if (!EditorApplication.isPlaying) // means Will Change to Playmode
  183. {
  184. if (OnWillPlayEvent != null)
  185. {
  186. OnWillPlayEvent();
  187. }
  188. }
  189. else
  190. {
  191. if (OnBeginPlayEvent != null)
  192. {
  193. OnBeginPlayEvent();
  194. }
  195. }
  196. }
  197. else
  198. {
  199. if (EditorApplication.isPlaying)
  200. {
  201. if (OnWillStopEvent != null)
  202. {
  203. OnWillStopEvent();
  204. }
  205. }
  206. }
  207. }
  208. /// <summary>
  209. /// 捕捉编译过程中、同时播放游戏的状态,强制暂停,避免运行出错
  210. /// </summary>
  211. /// <param name="view"></param>
  212. //static void OnSceneViewGUI(SceneView view)
  213. static void OnEditorUpdate()
  214. {
  215. CheckComplie();
  216. if (OnEditorUpdateEvent != null)
  217. {
  218. OnEditorUpdateEvent();
  219. }
  220. }
  221. private static void OnSceneViewGUI(SceneView sceneview)
  222. {
  223. CheckComplie();
  224. }
  225. static void CheckComplie()
  226. {
  227. // 检查编译中,立刻暂停游戏!
  228. if (EditorApplication.isCompiling)
  229. {
  230. if (EditorApplication.isPlaying)
  231. {
  232. UnityEngine.Debug.Log("Force Stop Play, because of Compiling.");
  233. EditorApplication.isPlaying = false;
  234. }
  235. }
  236. }
  237. }
  238. internal class SaveSceneAssetModificationProcessor : UnityEditor.AssetModificationProcessor
  239. {
  240. public static string[] OnWillSaveAssets(string[] paths)
  241. {
  242. foreach (string path in paths)
  243. {
  244. if (path.Contains(".unity"))
  245. {
  246. //scenePath = Path.GetDirectoryName(path);
  247. //sceneName = Path.GetFileNameWithoutExtension(path);
  248. // KUnityEditorEventCatcher._onSaveSceneEvent();
  249. }
  250. }
  251. return paths;
  252. }
  253. }
  254. }