123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178 |
- using System;
- using System.Reflection;
- using UnityEditor;
- using UnityEditor.Presets;
- using UnityEngine;
- using UnityEngine.UIElements;
- namespace HybridCLR.Editor.Settings
- {
- public class HybridCLRSettingsProvider : SettingsProvider
- {
- private SerializedObject _serializedObject;
- private SerializedProperty _enable;
- private SerializedProperty _useGlobalIl2cpp;
- private SerializedProperty _hybridclrRepoURL;
- private SerializedProperty _il2cppPlusRepoURL;
- private SerializedProperty _hotUpdateAssemblyDefinitions;
- private SerializedProperty _hotUpdateAssemblies;
- private SerializedProperty _preserveHotUpdateAssemblies;
- private SerializedProperty _hotUpdateDllCompileOutputRootDir;
- private SerializedProperty _externalHotUpdateAssembliyDirs;
- private SerializedProperty _strippedAOTDllOutputRootDir;
- private SerializedProperty _patchAOTAssemblies;
- private SerializedProperty _outputLinkFile;
- private SerializedProperty _outputAOTGenericReferenceFile;
- private SerializedProperty _maxGenericReferenceIteration;
- private SerializedProperty _maxMethodBridgeGenericIteration;
- private GUIStyle buttonStyle;
- public HybridCLRSettingsProvider() : base("Project/HybridCLR Settings", SettingsScope.Project) { }
- public override void OnActivate(string searchContext, VisualElement rootElement)
- {
- EditorStatusWatcher.OnEditorFocused += OnEditorFocused;
- InitGUI();
- }
- private void InitGUI()
- {
- var setting = HybridCLRSettings.LoadOrCreate();
- _serializedObject?.Dispose();
- _serializedObject = new SerializedObject(setting);
- _enable = _serializedObject.FindProperty("enable");
- _useGlobalIl2cpp = _serializedObject.FindProperty("useGlobalIl2cpp");
- _hybridclrRepoURL = _serializedObject.FindProperty("hybridclrRepoURL");
- _il2cppPlusRepoURL = _serializedObject.FindProperty("il2cppPlusRepoURL");
- _hotUpdateAssemblyDefinitions = _serializedObject.FindProperty("hotUpdateAssemblyDefinitions");
- _hotUpdateAssemblies = _serializedObject.FindProperty("hotUpdateAssemblies");
- _preserveHotUpdateAssemblies = _serializedObject.FindProperty("preserveHotUpdateAssemblies");
- _hotUpdateDllCompileOutputRootDir = _serializedObject.FindProperty("hotUpdateDllCompileOutputRootDir");
- _externalHotUpdateAssembliyDirs = _serializedObject.FindProperty("externalHotUpdateAssembliyDirs");
- _strippedAOTDllOutputRootDir = _serializedObject.FindProperty("strippedAOTDllOutputRootDir");
- _patchAOTAssemblies = _serializedObject.FindProperty("patchAOTAssemblies");
- _outputLinkFile = _serializedObject.FindProperty("outputLinkFile");
- _outputAOTGenericReferenceFile = _serializedObject.FindProperty("outputAOTGenericReferenceFile");
- _maxGenericReferenceIteration = _serializedObject.FindProperty("maxGenericReferenceIteration");
- _maxMethodBridgeGenericIteration = _serializedObject.FindProperty("maxMethodBridgeGenericIteration");
- }
- private void OnEditorFocused()
- {
- InitGUI();
- Repaint();
- }
- public override void OnTitleBarGUI()
- {
- base.OnTitleBarGUI();
- var rect = GUILayoutUtility.GetLastRect();
- buttonStyle = buttonStyle ?? GUI.skin.GetStyle("IconButton");
- #region 绘制官方网站跳转按钮
- var w = rect.x + rect.width;
- rect.x = w - 57;
- rect.y += 6;
- rect.width = rect.height = 18;
- var content = EditorGUIUtility.IconContent("_Help");
- content.tooltip = "点击访问 HybridCLR 官方文档";
- if (GUI.Button(rect, content, buttonStyle))
- {
- Application.OpenURL("https://focus-creative-games.github.io/hybridclr/");
- }
- #endregion
- #region 绘制 Preset
- rect.x += 19;
- content = EditorGUIUtility.IconContent("Preset.Context");
- content.tooltip = "点击存储或加载 Preset .";
- if (GUI.Button(rect, content, buttonStyle))
- {
- var target = HybridCLRSettings.Instance;
- var receiver = ScriptableObject.CreateInstance<SettingsPresetReceiver>();
- receiver.Init(target, this);
- PresetSelector.ShowSelector(target, null, true, receiver);
- }
- #endregion
- #region 绘制 Reset
- rect.x += 19;
- content = EditorGUIUtility.IconContent(
- #if UNITY_2021_3_OR_NEWER
- "pane options"
- #else
- "_Popup"
- #endif
- );
- content.tooltip = "Reset";
- if (GUI.Button(rect, content, buttonStyle))
- {
- GenericMenu menu = new GenericMenu();
- menu.AddItem(new GUIContent("Reset"), false, () =>
- {
- Undo.RecordObject(HybridCLRSettings.Instance, "Capture Value for Reset");
- var dv = ScriptableObject.CreateInstance<HybridCLRSettings>();
- var json = EditorJsonUtility.ToJson(dv);
- UnityEngine.Object.DestroyImmediate(dv);
- EditorJsonUtility.FromJsonOverwrite(json, HybridCLRSettings.Instance);
- HybridCLRSettings.Save();
- });
- menu.ShowAsContext();
- }
- #endregion
- }
- public override void OnGUI(string searchContext)
- {
- using (CreateSettingsWindowGUIScope())
- {
- //解决编辑器打包时出现的 _serializedObject.targetObject 意外销毁的情况
- if (_serializedObject == null||!_serializedObject.targetObject)
- {
- InitGUI();
- }
- _serializedObject.Update();
- EditorGUI.BeginChangeCheck();
- EditorGUILayout.PropertyField(_enable);
- EditorGUILayout.PropertyField(_hybridclrRepoURL);
- EditorGUILayout.PropertyField(_il2cppPlusRepoURL);
- EditorGUILayout.PropertyField(_useGlobalIl2cpp);
- EditorGUILayout.PropertyField(_hotUpdateAssemblyDefinitions);
- EditorGUILayout.PropertyField(_hotUpdateAssemblies);
- EditorGUILayout.PropertyField(_preserveHotUpdateAssemblies);
- EditorGUILayout.PropertyField(_hotUpdateDllCompileOutputRootDir);
- EditorGUILayout.PropertyField(_externalHotUpdateAssembliyDirs);
- EditorGUILayout.PropertyField(_strippedAOTDllOutputRootDir);
- EditorGUILayout.PropertyField(_patchAOTAssemblies);
- EditorGUILayout.PropertyField(_outputLinkFile);
- EditorGUILayout.PropertyField(_outputAOTGenericReferenceFile);
- EditorGUILayout.PropertyField(_maxGenericReferenceIteration);
- EditorGUILayout.PropertyField(_maxMethodBridgeGenericIteration);
- if (EditorGUI.EndChangeCheck())
- {
- _serializedObject.ApplyModifiedProperties();
- HybridCLRSettings.Save();
- }
- }
- }
- private IDisposable CreateSettingsWindowGUIScope()
- {
- var unityEditorAssembly = Assembly.GetAssembly(typeof(EditorWindow));
- var type = unityEditorAssembly.GetType("UnityEditor.SettingsWindow+GUIScope");
- return Activator.CreateInstance(type) as IDisposable;
- }
- public override void OnDeactivate()
- {
- base.OnDeactivate();
- EditorStatusWatcher.OnEditorFocused -= OnEditorFocused;
- HybridCLRSettings.Save();
- }
- static HybridCLRSettingsProvider provider;
- [SettingsProvider]
- public static SettingsProvider CreateMyCustomSettingsProvider()
- {
- if (HybridCLRSettings.Instance && provider == null)
- {
- provider = new HybridCLRSettingsProvider();
- using (var so = new SerializedObject(HybridCLRSettings.Instance))
- {
- provider.keywords = GetSearchKeywordsFromSerializedObject(so);
- }
- }
- return provider;
- }
- }
- }
|