TERPGDemo/RPGDemo/Assets/TEngine/Editor/Utility/UpdateSettingEditor.cs
2025-04-22 17:16:40 +08:00

103 lines
4.0 KiB
C#

#if ENABLE_HYBRIDCLR
using System.Collections.Generic;
using System.Linq;
using UnityEditor;
using UnityEngine;
using HybridCLR.Editor.Settings;
namespace TEngine.Editor
{
[CustomEditor(typeof(UpdateSetting), true)]
public class UpdateSettingEditor : UnityEditor.Editor
{
public List<string> HotUpdateAssemblies = new() {};
public List<string> AOTMetaAssemblies = new() {};
private void OnEnable()
{
// 获取当前编辑的 ScriptableObject 实例
UpdateSetting updateSetting = (UpdateSetting)target;
if (updateSetting != null)
{
HotUpdateAssemblies.AddRange(updateSetting.HotUpdateAssemblies);
AOTMetaAssemblies.AddRange(updateSetting.AOTMetaAssemblies);
}
}
public override void OnInspectorGUI()
{
// 记录对象修改前的状态
EditorGUI.BeginChangeCheck();
// 绘制默认的 Inspector 界面
base.OnInspectorGUI();
// 检测是否有字段被修改
if (EditorGUI.EndChangeCheck())
{
// 获取当前编辑的 ScriptableObject 实例
UpdateSetting updateSetting = (UpdateSetting)target;
// 标记对象为“已修改”,确保修改能被保存
EditorUtility.SetDirty(updateSetting);
bool isHotChanged = !HotUpdateAssemblies.SequenceEqual(updateSetting.HotUpdateAssemblies);
bool isAOTChanged = !AOTMetaAssemblies.SequenceEqual(updateSetting.AOTMetaAssemblies);
if (isHotChanged)
{
HybridCLRSettings.Instance.hotUpdateAssemblies = updateSetting.HotUpdateAssemblies.ToArray();
for (int i = 0; i < updateSetting.HotUpdateAssemblies.Count; i++)
{
var assemblyName = updateSetting.HotUpdateAssemblies[i];
string assemblyNameWithoutExtension = assemblyName.Substring(0, assemblyName.LastIndexOf('.'));
HybridCLRSettings.Instance.hotUpdateAssemblies[i] = assemblyNameWithoutExtension;
}
Debug.Log("HotUpdateAssemblies changed");
}
if (isAOTChanged)
{
HybridCLRSettings.Instance.patchAOTAssemblies = updateSetting.AOTMetaAssemblies.ToArray();
Debug.Log("AOTMetaAssemblies changed");
}
if (isAOTChanged || isHotChanged)
{
// 在修改HybridCLRSettings后添加
EditorUtility.SetDirty(HybridCLRSettings.Instance);
AssetDatabase.SaveAssets();
}
}
}
public static void ForceUpdateAssemblies()
{
UpdateSetting updateSetting = null;
string[] guids = AssetDatabase.FindAssets("t:UpdateSetting");
if (guids.Length >= 1)
{
string path = AssetDatabase.GUIDToAssetPath(guids[0]);
updateSetting = AssetDatabase.LoadAssetAtPath<UpdateSetting>(path);
}
if (updateSetting == null)
{
Log.Error("Can not find UpdateSetting");
return;
}
HybridCLRSettings.Instance.hotUpdateAssemblies = updateSetting.HotUpdateAssemblies.ToArray();
for (int i = 0; i < updateSetting.HotUpdateAssemblies.Count; i++)
{
var assemblyName = updateSetting.HotUpdateAssemblies[i];
string assemblyNameWithoutExtension = assemblyName.Substring(0, assemblyName.LastIndexOf('.'));
HybridCLRSettings.Instance.hotUpdateAssemblies[i] = assemblyNameWithoutExtension;
}
HybridCLRSettings.Instance.patchAOTAssemblies = updateSetting.AOTMetaAssemblies.ToArray();
Debug.Log("HotUpdateAssemblies changed");
}
}
}
#endif