HybridCLRSettingProvider.cs 8.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185
  1. using System;
  2. using System.Reflection;
  3. using UnityEditor;
  4. using UnityEditor.Presets;
  5. using UnityEngine;
  6. using UnityEngine.UIElements;
  7. namespace HybridCLR.Editor.Settings
  8. {
  9. public class HybridCLRSettingsProvider : SettingsProvider
  10. {
  11. private SerializedObject _serializedObject;
  12. private SerializedProperty _enable;
  13. private SerializedProperty _useGlobalIl2cpp;
  14. private SerializedProperty _hybridclrRepoURL;
  15. private SerializedProperty _il2cppPlusRepoURL;
  16. private SerializedProperty _hotUpdateAssemblyDefinitions;
  17. private SerializedProperty _hotUpdateAssemblies;
  18. private SerializedProperty _preserveHotUpdateAssemblies;
  19. private SerializedProperty _hotUpdateDllCompileOutputRootDir;
  20. private SerializedProperty _externalHotUpdateAssembliyDirs;
  21. private SerializedProperty _strippedAOTDllOutputRootDir;
  22. private SerializedProperty _patchAOTAssemblies;
  23. private SerializedProperty _outputLinkFile;
  24. private SerializedProperty _outputAOTGenericReferenceFile;
  25. private SerializedProperty _maxGenericReferenceIteration;
  26. private SerializedProperty _maxMethodBridgeGenericIteration;
  27. private SerializedProperty _enableProfilerInReleaseBuild;
  28. private SerializedProperty enableStraceTraceInWebGLReleaseBuild;
  29. private GUIStyle buttonStyle;
  30. public HybridCLRSettingsProvider() : base("Project/HybridCLR Settings", SettingsScope.Project) { }
  31. public override void OnActivate(string searchContext, VisualElement rootElement)
  32. {
  33. EditorStatusWatcher.OnEditorFocused += OnEditorFocused;
  34. InitGUI();
  35. }
  36. private void InitGUI()
  37. {
  38. var setting = HybridCLRSettings.LoadOrCreate();
  39. _serializedObject?.Dispose();
  40. _serializedObject = new SerializedObject(setting);
  41. _enable = _serializedObject.FindProperty("enable");
  42. _useGlobalIl2cpp = _serializedObject.FindProperty("useGlobalIl2cpp");
  43. _hybridclrRepoURL = _serializedObject.FindProperty("hybridclrRepoURL");
  44. _il2cppPlusRepoURL = _serializedObject.FindProperty("il2cppPlusRepoURL");
  45. _hotUpdateAssemblyDefinitions = _serializedObject.FindProperty("hotUpdateAssemblyDefinitions");
  46. _hotUpdateAssemblies = _serializedObject.FindProperty("hotUpdateAssemblies");
  47. _preserveHotUpdateAssemblies = _serializedObject.FindProperty("preserveHotUpdateAssemblies");
  48. _hotUpdateDllCompileOutputRootDir = _serializedObject.FindProperty("hotUpdateDllCompileOutputRootDir");
  49. _externalHotUpdateAssembliyDirs = _serializedObject.FindProperty("externalHotUpdateAssembliyDirs");
  50. _strippedAOTDllOutputRootDir = _serializedObject.FindProperty("strippedAOTDllOutputRootDir");
  51. _patchAOTAssemblies = _serializedObject.FindProperty("patchAOTAssemblies");
  52. _outputLinkFile = _serializedObject.FindProperty("outputLinkFile");
  53. _outputAOTGenericReferenceFile = _serializedObject.FindProperty("outputAOTGenericReferenceFile");
  54. _maxGenericReferenceIteration = _serializedObject.FindProperty("maxGenericReferenceIteration");
  55. _maxMethodBridgeGenericIteration = _serializedObject.FindProperty("maxMethodBridgeGenericIteration");
  56. _enableProfilerInReleaseBuild = _serializedObject.FindProperty("enableProfilerInReleaseBuild");
  57. enableStraceTraceInWebGLReleaseBuild = _serializedObject.FindProperty("enableStraceTraceInWebGLReleaseBuild");
  58. }
  59. private void OnEditorFocused()
  60. {
  61. InitGUI();
  62. Repaint();
  63. }
  64. public override void OnTitleBarGUI()
  65. {
  66. base.OnTitleBarGUI();
  67. var rect = GUILayoutUtility.GetLastRect();
  68. buttonStyle = buttonStyle ?? GUI.skin.GetStyle("IconButton");
  69. #region 绘制官方网站跳转按钮
  70. var w = rect.x + rect.width;
  71. rect.x = w - 57;
  72. rect.y += 6;
  73. rect.width = rect.height = 18;
  74. var content = EditorGUIUtility.IconContent("_Help");
  75. content.tooltip = "点击访问 HybridCLR 官方文档";
  76. if (GUI.Button(rect, content, buttonStyle))
  77. {
  78. Application.OpenURL("https://hybridclr.doc.code-philosophy.com/");
  79. }
  80. #endregion
  81. #region 绘制 Preset
  82. rect.x += 19;
  83. content = EditorGUIUtility.IconContent("Preset.Context");
  84. content.tooltip = "点击存储或加载 Preset .";
  85. if (GUI.Button(rect, content, buttonStyle))
  86. {
  87. var target = HybridCLRSettings.Instance;
  88. var receiver = ScriptableObject.CreateInstance<SettingsPresetReceiver>();
  89. receiver.Init(target, this);
  90. PresetSelector.ShowSelector(target, null, true, receiver);
  91. }
  92. #endregion
  93. #region 绘制 Reset
  94. rect.x += 19;
  95. content = EditorGUIUtility.IconContent(
  96. #if UNITY_2021_3_OR_NEWER
  97. "pane options"
  98. #else
  99. "_Popup"
  100. #endif
  101. );
  102. content.tooltip = "Reset";
  103. if (GUI.Button(rect, content, buttonStyle))
  104. {
  105. GenericMenu menu = new GenericMenu();
  106. menu.AddItem(new GUIContent("Reset"), false, () =>
  107. {
  108. Undo.RecordObject(HybridCLRSettings.Instance, "Capture Value for Reset");
  109. var dv = ScriptableObject.CreateInstance<HybridCLRSettings>();
  110. var json = EditorJsonUtility.ToJson(dv);
  111. UnityEngine.Object.DestroyImmediate(dv);
  112. EditorJsonUtility.FromJsonOverwrite(json, HybridCLRSettings.Instance);
  113. HybridCLRSettings.Save();
  114. });
  115. menu.ShowAsContext();
  116. }
  117. #endregion
  118. }
  119. public override void OnGUI(string searchContext)
  120. {
  121. using (CreateSettingsWindowGUIScope())
  122. {
  123. //解决编辑器打包时出现的 _serializedObject.targetObject 意外销毁的情况
  124. if (_serializedObject == null||!_serializedObject.targetObject)
  125. {
  126. InitGUI();
  127. }
  128. _serializedObject.Update();
  129. EditorGUI.BeginChangeCheck();
  130. EditorGUILayout.PropertyField(_enable);
  131. EditorGUILayout.PropertyField(_hybridclrRepoURL);
  132. EditorGUILayout.PropertyField(_il2cppPlusRepoURL);
  133. EditorGUILayout.PropertyField(_useGlobalIl2cpp);
  134. EditorGUILayout.PropertyField(_hotUpdateAssemblyDefinitions);
  135. EditorGUILayout.PropertyField(_hotUpdateAssemblies);
  136. EditorGUILayout.PropertyField(_preserveHotUpdateAssemblies);
  137. EditorGUILayout.PropertyField(_hotUpdateDllCompileOutputRootDir);
  138. EditorGUILayout.PropertyField(_externalHotUpdateAssembliyDirs);
  139. EditorGUILayout.PropertyField(_strippedAOTDllOutputRootDir);
  140. EditorGUILayout.PropertyField(_patchAOTAssemblies);
  141. EditorGUILayout.PropertyField(_outputLinkFile);
  142. EditorGUILayout.PropertyField(_outputAOTGenericReferenceFile);
  143. EditorGUILayout.PropertyField(_maxGenericReferenceIteration);
  144. EditorGUILayout.PropertyField(_maxMethodBridgeGenericIteration);
  145. EditorGUILayout.PropertyField(_enableProfilerInReleaseBuild);
  146. EditorGUILayout.PropertyField(enableStraceTraceInWebGLReleaseBuild);
  147. if (EditorGUI.EndChangeCheck())
  148. {
  149. _serializedObject.ApplyModifiedProperties();
  150. HybridCLRSettings.Save();
  151. }
  152. }
  153. }
  154. private IDisposable CreateSettingsWindowGUIScope()
  155. {
  156. var unityEditorAssembly = Assembly.GetAssembly(typeof(EditorWindow));
  157. var type = unityEditorAssembly.GetType("UnityEditor.SettingsWindow+GUIScope");
  158. return Activator.CreateInstance(type) as IDisposable;
  159. }
  160. public override void OnDeactivate()
  161. {
  162. base.OnDeactivate();
  163. EditorStatusWatcher.OnEditorFocused -= OnEditorFocused;
  164. HybridCLRSettings.Save();
  165. }
  166. static HybridCLRSettingsProvider provider;
  167. [SettingsProvider]
  168. public static SettingsProvider CreateMyCustomSettingsProvider()
  169. {
  170. if (HybridCLRSettings.Instance && provider == null)
  171. {
  172. provider = new HybridCLRSettingsProvider();
  173. using (var so = new SerializedObject(HybridCLRSettings.Instance))
  174. {
  175. provider.keywords = GetSearchKeywordsFromSerializedObject(so);
  176. }
  177. }
  178. return provider;
  179. }
  180. }
  181. }