HybridCLRSettingProvider.cs 8.3 KB

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