Revert "8.2版本上传"

This reverts commit 6a881f2e8a.
This commit is contained in:
2025-06-18 17:37:53 +08:00
parent 7fe716baab
commit e9af7221de
261 changed files with 1340 additions and 9065 deletions

View File

@@ -0,0 +1,32 @@
using HybridCLR.Editor;
using System;
using UnityEditor;
using UnityEditorInternal;
namespace HybridCLR.Editor.Settings
{
/// <summary>
/// 监听编辑器状态,当编辑器重新 focus 时,重新加载实例,避免某些情景下 svn 、git 等外部修改了数据却无法同步的异常。
/// </summary>
[InitializeOnLoad]
public static class EditorStatusWatcher
{
public static Action OnEditorFocused;
static bool isFocused;
static EditorStatusWatcher() => EditorApplication.update += Update;
static void Update()
{
if (isFocused != InternalEditorUtility.isApplicationActive)
{
isFocused = InternalEditorUtility.isApplicationActive;
if (isFocused)
{
HybridCLRSettings.LoadOrCreate();
OnEditorFocused?.Invoke();
}
}
}
}
}

View File

@@ -0,0 +1,11 @@
fileFormatVersion: 2
guid: 69cc82d0341662846987a1fb1df4b8a5
MonoImporter:
externalObjects: {}
serializedVersion: 2
defaultReferences: []
executionOrder: 0
icon: {instanceID: 0}
userData:
assetBundleName:
assetBundleVariant:

View File

@@ -18,21 +18,20 @@ namespace HybridCLR.Editor.Settings
private SerializedProperty _hotUpdateAssemblies;
private SerializedProperty _preserveHotUpdateAssemblies;
private SerializedProperty _hotUpdateDllCompileOutputRootDir;
private SerializedProperty _externalHotUpdateAssemblyDirs;
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();
@@ -46,7 +45,7 @@ namespace HybridCLR.Editor.Settings
_hotUpdateAssemblies = _serializedObject.FindProperty("hotUpdateAssemblies");
_preserveHotUpdateAssemblies = _serializedObject.FindProperty("preserveHotUpdateAssemblies");
_hotUpdateDllCompileOutputRootDir = _serializedObject.FindProperty("hotUpdateDllCompileOutputRootDir");
_externalHotUpdateAssemblyDirs = _serializedObject.FindProperty("externalHotUpdateAssembliyDirs");
_externalHotUpdateAssembliyDirs = _serializedObject.FindProperty("externalHotUpdateAssembliyDirs");
_strippedAOTDllOutputRootDir = _serializedObject.FindProperty("strippedAOTDllOutputRootDir");
_patchAOTAssemblies = _serializedObject.FindProperty("patchAOTAssemblies");
_outputLinkFile = _serializedObject.FindProperty("outputLinkFile");
@@ -54,53 +53,126 @@ namespace HybridCLR.Editor.Settings
_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)
{
if (_serializedObject == null || !_serializedObject.targetObject)
using (CreateSettingsWindowGUIScope())
{
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(_externalHotUpdateAssemblyDirs);
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();
//解决编辑器打包时出现的 _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 s_provider;
static HybridCLRSettingsProvider provider;
[SettingsProvider]
public static SettingsProvider CreateMyCustomSettingsProvider()
{
if (s_provider == null)
if (HybridCLRSettings.Instance && provider == null)
{
s_provider = new HybridCLRSettingsProvider();
provider = new HybridCLRSettingsProvider();
using (var so = new SerializedObject(HybridCLRSettings.Instance))
{
provider.keywords = GetSearchKeywordsFromSerializedObject(so);
}
}
return s_provider;
return provider;
}
}
}

View File

@@ -1,5 +1,5 @@
fileFormatVersion: 2
guid: d2bd1694fedc8b54c88bb9f6c67907d3
guid: fad9b3139b5943b44acf2305d739db81
MonoImporter:
externalObjects: {}
serializedVersion: 2

View File

@@ -1,98 +1,54 @@
using System.IO;
using UnityEditorInternal;
using UnityEngine;
namespace HybridCLR.Editor.Settings
{
public class HybridCLRSettings : ScriptableObject
[FilePath("ProjectSettings/HybridCLRSettings.asset")]
public class HybridCLRSettings : ScriptableSingleton<HybridCLRSettings>
{
[Tooltip("enable HybridCLR")]
[Header("开启HybridCLR插件")]
public bool enable = true;
[Tooltip("use il2cpp in unity editor installation location")]
[Header("使用全局安装的il2cpp")]
public bool useGlobalIl2cpp;
[Tooltip("hybridclr repo URL")]
[Header("hybridclr 仓库 URL")]
public string hybridclrRepoURL = "https://gitee.com/focus-creative-games/hybridclr";
[Tooltip("il2cpp_plus repo URL")]
[Header("il2cpp_plus 仓库 URL")]
public string il2cppPlusRepoURL = "https://gitee.com/focus-creative-games/il2cpp_plus";
[Tooltip("hot update assembly definitions(asd)")]
[Header("热更新Assembly Definitions")]
public AssemblyDefinitionAsset[] hotUpdateAssemblyDefinitions;
[Tooltip("hot update assembly names(without .dll suffix)")]
[Header("热更新dlls")]
public string[] hotUpdateAssemblies;
[Tooltip("preserved hot update assembly names(without .dll suffix)")]
[Header("预留的热更新dlls")]
public string[] preserveHotUpdateAssemblies;
[Tooltip("output directory of compiling hot update assemblies")]
[Header("热更新dll编译输出根目录")]
public string hotUpdateDllCompileOutputRootDir = "HybridCLRData/HotUpdateDlls";
[Tooltip("searching paths of external hot update assemblies")]
[Header("外部热更新dll搜索路径")]
public string[] externalHotUpdateAssembliyDirs;
[Tooltip("output directory of stripped AOT assemblies")]
[Header("裁减后AOT dll输出根目录")]
public string strippedAOTDllOutputRootDir = "HybridCLRData/AssembliesPostIl2CppStrip";
[Tooltip("supplementary metadata assembly names(without .dll suffix)")]
[Header("补充元数据AOT dlls")]
public string[] patchAOTAssemblies;
[Tooltip("output file of automatic generated link.xml by scanning hot update assemblies")]
[Header("生成的link.xml路径")]
public string outputLinkFile = "HybridCLRGenerate/link.xml";
[Tooltip("output file of automatic generated AOTGenericReferences.cs")]
[Header("自动扫描生成的AOTGenericReferences.cs路径")]
public string outputAOTGenericReferenceFile = "HybridCLRGenerate/AOTGenericReferences.cs";
[Tooltip("max iteration count of searching generic methods in hot update assemblies")]
[Header("AOT泛型实例化搜索迭代次数")]
public int maxGenericReferenceIteration = 10;
[Tooltip("max iteration count of searching method bridge generic methods in AOT assemblies")]
[Header("MethodBridge泛型搜索迭代次数")]
public int maxMethodBridgeGenericIteration = 10;
private static HybridCLRSettings s_Instance;
public static HybridCLRSettings Instance
{
get
{
if (!s_Instance)
{
LoadOrCreate();
}
return s_Instance;
}
}
private static string GetFilePath()
{
return "ProjectSettings/HybridCLRSettings.asset";
}
public static HybridCLRSettings LoadOrCreate()
{
string filePath = GetFilePath();
Object[] objs = InternalEditorUtility.LoadSerializedFileAndForget(filePath);
s_Instance = objs.Length > 0 ? (HybridCLRSettings)objs[0] : (s_Instance ?? CreateInstance<HybridCLRSettings>());
return s_Instance;
}
public static void Save()
{
if (!s_Instance)
{
return;
}
string filePath = GetFilePath();
string directoryName = Path.GetDirectoryName(filePath);
Directory.CreateDirectory(directoryName);
var obj = new Object[1] { s_Instance };
InternalEditorUtility.SaveToSerializedFileAndForget(obj, filePath, true);
}
}
}

View File

@@ -1,5 +1,5 @@
fileFormatVersion: 2
guid: e189374413a3f00468e49d51d8b27a09
guid: 9b81f022f5b244f4cb93a2f7956e0b1f
MonoImporter:
externalObjects: {}
serializedVersion: 2

View File

@@ -1,5 +1,5 @@
fileFormatVersion: 2
guid: a475a5f281298b84da32373694704c68
guid: 90e2038b306a79e4c99d7fc2dce9531e
MonoImporter:
externalObjects: {}
serializedVersion: 2

View File

@@ -0,0 +1,89 @@
using System;
using System.IO;
using System.Linq;
using UnityEditor;
using UnityEditorInternal;
using UnityEngine;
namespace HybridCLR.Editor.Settings
{
public class ScriptableSingleton<T> : ScriptableObject where T : ScriptableObject
{
private static T s_Instance;
public static T Instance
{
get
{
if (!s_Instance)
{
LoadOrCreate();
}
return s_Instance;
}
}
public static T LoadOrCreate()
{
string filePath = GetFilePath();
if (!string.IsNullOrEmpty(filePath))
{
var arr = InternalEditorUtility.LoadSerializedFileAndForget(filePath);
s_Instance = arr.Length > 0 ? arr[0] as T : s_Instance??CreateInstance<T>();
}
else
{
Debug.LogError($"save location of {nameof(ScriptableSingleton<T>)} is invalid");
}
return s_Instance;
}
public static void Save(bool saveAsText = true)
{
if (!s_Instance)
{
Debug.LogError("Cannot save ScriptableSingleton: no instance!");
return;
}
string filePath = GetFilePath();
if (!string.IsNullOrEmpty(filePath))
{
string directoryName = Path.GetDirectoryName(filePath);
if (!Directory.Exists(directoryName))
{
Directory.CreateDirectory(directoryName);
}
UnityEngine.Object[] obj = new T[1] { s_Instance };
InternalEditorUtility.SaveToSerializedFileAndForget(obj, filePath, saveAsText);
}
}
protected static string GetFilePath()
{
return typeof(T).GetCustomAttributes(inherit: true)
.Where(v => v is FilePathAttribute)
.Cast<FilePathAttribute>()
.FirstOrDefault()
?.filepath;
}
}
[AttributeUsage(AttributeTargets.Class)]
public class FilePathAttribute : Attribute
{
internal string filepath;
/// <summary>
/// 单例存放路径
/// </summary>
/// <param name="path">相对 Project 路径</param>
public FilePathAttribute(string path)
{
if (string.IsNullOrEmpty(path))
{
throw new ArgumentException("Invalid relative path (it is empty)");
}
if (path[0] == '/')
{
path = path.Substring(1);
}
filepath = path;
}
}
}

View File

@@ -0,0 +1,11 @@
fileFormatVersion: 2
guid: c1ae1000efb4b504db3abc582c03a830
MonoImporter:
externalObjects: {}
serializedVersion: 2
defaultReferences: []
executionOrder: 0
icon: {instanceID: 0}
userData:
assetBundleName:
assetBundleVariant:

View File

@@ -0,0 +1,39 @@
using UnityEditor;
using UnityEditor.Presets;
using UnityEngine;
namespace HybridCLR.Editor.Settings
{
public class SettingsPresetReceiver : PresetSelectorReceiver
{
private Object m_Target;
private Preset m_InitialValue;
private SettingsProvider m_Provider;
internal void Init(Object target, SettingsProvider provider)
{
m_Target = target;
m_InitialValue = new Preset(target);
m_Provider = provider;
}
public override void OnSelectionChanged(Preset selection)
{
if (selection != null)
{
Undo.RecordObject(m_Target, "Apply Preset " + selection.name);
selection.ApplyTo(m_Target);
}
else
{
Undo.RecordObject(m_Target, "Cancel Preset");
m_InitialValue.ApplyTo(m_Target);
}
m_Provider.Repaint();
}
public override void OnSelectionClosed(Preset selection)
{
OnSelectionChanged(selection);
Object.DestroyImmediate(this);
}
}
}

View File

@@ -0,0 +1,11 @@
fileFormatVersion: 2
guid: 05cacd9b2248a85449b4c6b4646ed74c
MonoImporter:
externalObjects: {}
serializedVersion: 2
defaultReferences: []
executionOrder: 0
icon: {instanceID: 0}
userData:
assetBundleName:
assetBundleVariant: