HybridCLRSettingProvider.cs 8.5 KB

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