This commit is contained in:
陈思海 2025-03-07 18:00:59 +08:00
parent 61e0bc547b
commit 9033d5abff
63 changed files with 657 additions and 462 deletions

View File

@ -0,0 +1 @@
{"HotUpdateAssemblies":["GameLib.dll","GameProto.dll","GameBase.dll","GameLogic.dll"],"AOTMetaAssemblies":["mscorlib.dll","System.dll","System.Core.dll","UnityEngine.CoreModule.dll","YooAsset.dll","UniTask.Runtime.dll","ZString.dll"]}

View File

@ -1,8 +1,7 @@
fileFormatVersion: 2
guid: efd2da5560bdcde42a91ff632fccad20
NativeFormatImporter:
guid: 69d8fe4890823d140950a9c8adce8ff8
TextScriptImporter:
externalObjects: {}
mainObjectFileID: 11400000
userData:
assetBundleName:
assetBundleVariant:

View File

@ -1,30 +0,0 @@
%YAML 1.1
%TAG !u! tag:unity3d.com,2011:
--- !u!114 &11400000
MonoBehaviour:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 0}
m_Enabled: 1
m_EditorHideFlags: 0
m_Script: {fileID: 11500000, guid: 7c0f00a264c34df985e6c6b6e3f8b353, type: 3}
m_Name: FrameworkHotUpdateSettings
m_EditorClassIdentifier:
HotUpdateAssemblies:
- GameLib.dll
- GameProto.dll
- GameBase.dll
- GameLogic.dll
AOTMetaAssemblies:
- mscorlib.dll
- System.dll
- System.Core.dll
- UnityEngine.CoreModule.dll
- YooAsset.dll
- UniTask.Runtime.dll
- ZString.dll
LogicMainDllName: GameLogic.dll
AssemblyTextAssetExtension: .bytes
AssemblyTextAssetPath: AssetRaw/DLL

View File

@ -1,24 +0,0 @@
%YAML 1.1
%TAG !u! tag:unity3d.com,2011:
--- !u!114 &11400000
MonoBehaviour:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 0}
m_Enabled: 1
m_EditorHideFlags: 0
m_Script: {fileID: 11500000, guid: 7f734b9c80c9475690a0edad9a7626bd, type: 3}
m_Name: FrameworkPublishSettings
m_EditorClassIdentifier:
Configs:
- Version_Type: Release
CheckUrl: http://127.0.0.1:8080/UpdateData.json
- Version_Type: Dev
CheckUrl: http://127.0.0.1:8080/UpdateData.json
- Version_Type: Test
CheckUrl: http://127.0.0.1:8080/UpdateData.json
AppStageType: Dev
ResMode: 2
Language: 1

View File

@ -1,8 +1,8 @@
fileFormatVersion: 2
guid: db8426664259b2946b313fa434c0e847
NativeFormatImporter:
guid: ac7f00f949ed1764db4176b08446dac4
folderAsset: yes
DefaultImporter:
externalObjects: {}
mainObjectFileID: 11400000
userData:
assetBundleName:
assetBundleVariant:

View File

@ -7,7 +7,8 @@
"GUID:df8e45d6cf544f2693a36da8779a9fc9",
"GUID:8d62da4aabd2a19419c7378d23ea5849",
"GUID:acfef7cabed3b0a42b25edb1cd4fa259",
"GUID:be2f20a77f3232f44b9711ef43234aac"
"GUID:be2f20a77f3232f44b9711ef43234aac",
"GUID:75b6f2078d190f14dbda4a5b747d709c"
],
"includePlatforms": [
"Editor"

View File

@ -0,0 +1,3 @@
fileFormatVersion: 2
guid: bc3f948f15304085b3623e95529402b2
timeCreated: 1741335009

View File

@ -0,0 +1,16 @@
using UnityEditor;
using UnityEngine;
namespace AlicizaX.Editor.Extension
{
public abstract class EditorToolBase : EditorWindow
{
public abstract string ToolName { get; }
public abstract Vector2Int WinSize { get; }
private void Awake()
{
this.titleContent = new GUIContent(ToolName);
this.position.Set(this.position.x, this.position.y, this.WinSize.x, this.WinSize.y);
}
}
}

View File

@ -0,0 +1,3 @@
fileFormatVersion: 2
guid: c5059ae8ffe14e83adc79687bb2f6128
timeCreated: 1741335011

View File

@ -0,0 +1,92 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Reflection;
using UnityEditor;
using UnityEngine;
namespace AlicizaX.Editor.Extension
{
[AttributeUsage(AttributeTargets.Method, AllowMultiple = false, Inherited = false)]
public class EditorToolFunctionAttribute : Attribute
{
public string ToolMenuPath { get; private set; }
public int MenuOrder { get; private set; }
public Type OwnerType { get; private set; }
public MethodInfo MethodInfo { get; private set; }
public EditorToolFunctionAttribute(string menu, Type owner, int menuOrder = 0)
{
this.ToolMenuPath = menu;
OwnerType = owner;
MenuOrder = menuOrder;
}
public void SetMethodInfo(MethodInfo methodInfo)
{
MethodInfo = methodInfo;
}
}
internal static class EditorToolFunctionAttributeCollector
{
public static List<EditorToolFunctionAttribute> Attributes = new List<EditorToolFunctionAttribute>();
public static void Register(EditorToolFunctionAttribute attribute)
{
Attributes.Add(attribute);
Attributes.Sort((x, y) => x.MenuOrder.CompareTo(y.MenuOrder));
}
/// <summary>
/// 扫描所有程序集中的类和方法,自动注册带有 EditorToolFunctionAttribute 的方法。
/// </summary>
[InitializeOnLoadMethod]
public static void ScanAndRegisterAllMethods()
{
// 获取当前应用程序域中的所有程序集
var assemblies = AppDomain.CurrentDomain.GetAssemblies();
foreach (var assembly in assemblies)
{
try
{
// 获取程序集中的所有类型
var types = assembly.GetTypes();
foreach (var type in types)
{
try
{
// 获取类型中的所有方法
var methods =
type.GetMethods(BindingFlags.Static | BindingFlags.Public | BindingFlags.NonPublic);
foreach (var method in methods)
{
// 检查方法是否带有 EditorToolFunctionAttribute
var attribute = method.GetCustomAttribute<EditorToolFunctionAttribute>();
if (attribute != null)
{
// 设置方法的 MethodInfo
attribute.SetMethodInfo(method);
Register(attribute);
}
}
}
catch (Exception ex)
{
Debug.LogError($"Failed to process type {type.FullName}: {ex.Message}");
}
}
}
catch (Exception ex)
{
Debug.LogError($"Failed to process assembly {assembly.FullName}: {ex.Message}");
}
}
// Debug.Log($"Registered {Attributes.Count} methods with EditorToolFunctionAttribute.");
}
}
}

View File

@ -0,0 +1,3 @@
fileFormatVersion: 2
guid: aea4eaf9f6aa4109bb9a01f4537ee060
timeCreated: 1741335052

View File

@ -16,7 +16,6 @@ public class AdvancedBuildWindow : EditorWindow
private Vector2 _scrollPosition;
private EditorWindowTabBase showTab;
[MenuItem("开发工具/打包工具")]
public static void ShowWindow()
{
GetWindow<AdvancedBuildWindow>("Build Window", true);

View File

@ -1,5 +1,6 @@
// AtlasEditorWindow.cs
using AlicizaX.Editor.Extension;
using UnityEditor;
using UnityEngine;
@ -8,7 +9,7 @@ public class AtlasEditorWindow : EditorWindow
private AtlasConfiguration config;
private Vector2 scrollPos;
[MenuItem("开发工具/Atlas Tool")]
[EditorToolFunction("图集工具",typeof(AtlasEditorWindow))]
public static void ShowWindow()
{
GetWindow<AtlasEditorWindow>("图集打包");

View File

@ -0,0 +1,25 @@
using Paps.UnityToolbarExtenderUIToolkit;
using UnityEditor;
using UnityEngine;
using UnityEngine.UIElements;
[MainToolbarElement(id: "BuildSettingWindow", alignment: ToolbarAlign.Right, order: 1)]
public class BuildSettingWindow : IMGUIContainer
{
private GUIContent buildBtContent;
public void InitializeElement()
{
buildBtContent = EditorGUIUtility.TrTextContentWithIcon("Build App/Hotfix", "打新包/打热更", EditorGUIUtility.IconContent("d_BuildSettings.Standalone").image);
onGUIHandler = MyGUIMethod;
}
private void MyGUIMethod()
{
GUILayout.BeginHorizontal();
if (GUILayout.Button(buildBtContent, EditorStyles.toolbarButton, GUILayout.MaxWidth(125)))
Debug.Log("GUI Button clicked");
GUILayout.EndHorizontal();
}
}

View File

@ -0,0 +1,3 @@
fileFormatVersion: 2
guid: af03d991c6e34e8bbfbf861b558aa11b
timeCreated: 1741240351

View File

@ -0,0 +1,62 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Reflection;
using Paps.UnityToolbarExtenderUIToolkit;
using UnityEditor;
using UnityEngine;
using UnityEngine.UIElements;
namespace AlicizaX.Editor.Extension
{
[MainToolbarElement("EditorQuickToolBar", alignment: ToolbarAlign.Right, order: 0)]
public class EditorQuickToolBar : IMGUIContainer
{
private static GUIContent toolsDropBtContent;
public void InitializeElement()
{
toolsDropBtContent = EditorGUIUtility.TrTextContentWithIcon("Tools", "工具箱", "CustomTool");
onGUIHandler = MyGUIMethod;
}
private void MyGUIMethod()
{
GUILayout.BeginHorizontal();
if (EditorGUILayout.DropdownButton(toolsDropBtContent, FocusType.Passive, EditorStyles.toolbarPopup,
GUILayout.MaxWidth(90)))
{
DrawEditorToolDropdownMenus();
}
GUILayout.Space(5);
GUILayout.EndHorizontal();
}
static void DrawEditorToolDropdownMenus()
{
GenericMenu popMenu = new GenericMenu();
for (int i = 0; i < EditorToolFunctionAttributeCollector.Attributes.Count; i++)
{
var toolAttr = EditorToolFunctionAttributeCollector.Attributes[i];
popMenu.AddItem(new GUIContent(toolAttr.ToolMenuPath), false,
menuIdx => { ClickToolsSubmenu((int)menuIdx); }, i);
}
popMenu.ShowAsContext();
}
static void ClickToolsSubmenu(int menuIdx)
{
var editorTp = EditorToolFunctionAttributeCollector.Attributes[menuIdx];
if (editorTp.MethodInfo != null && editorTp.MethodInfo.IsStatic)
{
editorTp.MethodInfo.Invoke(null, null); // Invoke the static method
}
else
{
Debug.LogError("Method is not static or not found.");
}
}
}
}

View File

@ -0,0 +1,3 @@
fileFormatVersion: 2
guid: 6862584178a44687ab6912b5bbac36b4
timeCreated: 1741334878

View File

@ -1,18 +0,0 @@
using Paps.UnityToolbarExtenderUIToolkit;
using UnityEngine;
using UnityEngine.UIElements;
namespace AlicizaX.Editor.Extension
{
[MainToolbarElement(id: "OfflinePlayModeToolBar", alignment: ToolbarAlign.Left, order: 0)]
public class OfflinePlayModeToolBar : Button
{
public void InitializeElement()
{
text = "G";
style.fontSize = 14;
tooltip = "";
}
}
}

View File

@ -1,3 +0,0 @@
fileFormatVersion: 2
guid: 1ff74180b05648269a06f3de75428b13
timeCreated: 1741065566

View File

@ -3,14 +3,17 @@ using System.Linq;
using AlicizaX.Resource.Runtime;
using Paps.UnityToolbarExtenderUIToolkit;
using UnityEditor;
using UnityEditor.Toolbars;
using UnityEngine;
using UnityEngine.UIElements;
namespace AlicizaX.Editor.Extension
{
[MainToolbarElement("ResourceModeDropdownField", alignment: ToolbarAlign.Right, order: 0)]
public class ResourceModeDropdownField : DropdownField
public class ResourceModeDropdownField : IMGUIContainer
{
private static GUIContent appConfigBtContent;
private static readonly string[] _resourceModeNames =
{
"Editor",
@ -20,16 +23,43 @@ namespace AlicizaX.Editor.Extension
public void InitializeElement()
{
label = "";
choices = _resourceModeNames.ToList();
style.fontSize = 12;
int index = EditorPrefs.GetInt(ResourceComponent.PrefsKey, 0);
SetValueWithoutNotify(choices[index]);
RegisterCallback<ChangeEvent<string>>(evt =>
appConfigBtContent =
EditorGUIUtility.TrTextContentWithIcon("Res:", "配置App运行时所需DataTable/Config/Procedure",
"Settings");
onGUIHandler = MyGUIMethod;
}
private void MyGUIMethod()
{
GUILayout.BeginHorizontal();
string title = "Res:" + _resourceModeNames[EditorPrefs.GetInt(ResourceComponent.PrefsKey, 0)];
appConfigBtContent.text = title;
if (EditorGUILayout.DropdownButton(appConfigBtContent, FocusType.Passive, EditorStyles.toolbarPopup, GUILayout.MaxWidth(90)))
{
int newIndex = _resourceModeNames.ToList().IndexOf(evt.newValue);
EditorPrefs.SetInt(ResourceComponent.PrefsKey, newIndex);
});
DrawEditorToolDropdownMenus();
}
GUILayout.Space(5);
GUILayout.EndHorizontal();
}
static void DrawEditorToolDropdownMenus()
{
int index = EditorPrefs.GetInt(ResourceComponent.PrefsKey, 0);
GenericMenu popMenu = new GenericMenu();
for (int i = 0; i < _resourceModeNames.Length; i++)
{
var selected = index == i;
var toolAttr = _resourceModeNames[i];
popMenu.AddItem(new GUIContent(toolAttr), selected, menuIdx => { ClickToolsSubmenu((int)menuIdx); }, i);
}
popMenu.ShowAsContext();
}
static void ClickToolsSubmenu(int menuIdx)
{
EditorPrefs.SetInt(ResourceComponent.PrefsKey, menuIdx);
}
}
}

View File

@ -0,0 +1,101 @@
using System.Collections.Generic;
using Paps.UnityToolbarExtenderUIToolkit;
using UnityEditor;
using UnityEditor.SceneManagement;
using UnityEngine;
using UnityEngine.SceneManagement;
using UnityEngine.UIElements;
[MainToolbarElement(id: "SwitchSceneToolBar", alignment: ToolbarAlign.Left, order: 1)]
public class SwitchSceneToolBar : IMGUIContainer
{
private GUIContent switchSceneBtContent;
public void InitializeElement()
{
var curOpenSceneName = EditorSceneManager.GetActiveScene().name;
switchSceneBtContent = EditorGUIUtility.TrTextContentWithIcon(
string.IsNullOrEmpty(curOpenSceneName) ? "Switch Scene" : curOpenSceneName, "切换场景", "UnityLogo");
onGUIHandler = MyGUIMethod;
EditorSceneManager.sceneOpened += OnSceneOpened;
}
private void OnSceneOpened(Scene scene, OpenSceneMode mode)
{
switchSceneBtContent.text = scene.name;
}
private static List<string> sceneAssetList = new List<string>();
private void MyGUIMethod()
{
GUILayout.BeginHorizontal();
if (EditorGUILayout.DropdownButton(switchSceneBtContent, FocusType.Passive, EditorStyles.toolbarPopup,
GUILayout.MaxWidth(150)))
{
DrawSwithSceneDropdownMenus();
}
GUILayout.EndHorizontal();
}
static string[] ScenePath = new[] { "Assets/Bundles/Scenes/", "Assets/Scenes/" };
private static string RootScenePath = "Assets/Bundles/Scenes/";
private static string BundleScenePath = "Assets/Scenes/";
static void DrawSwithSceneDropdownMenus()
{
GenericMenu popMenu = new GenericMenu();
popMenu.allowDuplicateNames = true;
var sceneGuids = AssetDatabase.FindAssets("t:Scene", ScenePath);
sceneAssetList.Clear();
for (int i = 0; i < sceneGuids.Length; i++)
{
var scenePath = AssetDatabase.GUIDToAssetPath(sceneGuids[i]);
sceneAssetList.Add(scenePath);
string fileDir = System.IO.Path.GetDirectoryName(scenePath);
bool isInRootDir = AlicizaX.Runtime.Utility.Path.GetRegularPath(BundleScenePath).TrimEnd('/') ==
AlicizaX.Runtime.Utility.Path.GetRegularPath(fileDir).TrimEnd('/');
var sceneName = System.IO.Path.GetFileNameWithoutExtension(scenePath);
string displayName = sceneName;
if (!isInRootDir)
{
var sceneDir = System.IO.Path.GetRelativePath(RootScenePath, fileDir);
displayName = $"{sceneDir}/{sceneName}";
}
popMenu.AddItem(new GUIContent(displayName), false, menuIdx => { SwitchScene((int)menuIdx); }, i);
}
popMenu.ShowAsContext();
}
private static void SwitchScene(int menuIdx)
{
if (menuIdx >= 0 && menuIdx < sceneAssetList.Count)
{
var scenePath = sceneAssetList[menuIdx];
var curScene = EditorSceneManager.GetActiveScene();
if (curScene != null && curScene.isDirty)
{
int opIndex =
EditorUtility.DisplayDialogComplex("警告", $"当前场景{curScene.name}未保存,是否保存?", "保存", "取消", "不保存");
switch (opIndex)
{
case 0:
if (!EditorSceneManager.SaveOpenScenes())
{
return;
}
break;
case 1:
return;
}
}
EditorSceneManager.OpenScene(scenePath, OpenSceneMode.Single);
}
}
}

View File

@ -0,0 +1,3 @@
fileFormatVersion: 2
guid: 558a3f0219eb4dc498ca3ef90446af34
timeCreated: 1741329998

View File

@ -1,6 +0,0 @@
using AlicizaX.Resource.Runtime;
public static class GlobalConfig
{
public static ResourcePatchData PatchData;
}

View File

@ -0,0 +1,9 @@
using AlicizaX.Resource.Runtime;
public static class GlobalSetting
{
public static ResourcePatchData PatchData;
public const string EntranceDll = "GameLogic.dll";
public const string EntranceClass = "GameLogic.HotfixEntry";
public const string EntranceMethod = "Entrance";
}

View File

@ -32,7 +32,7 @@ namespace Unity.Startup.Procedure
async void Start(IFsm<IProcedureManager> procedureOwner)
{
string bundleUrl = GlobalConfig.PatchData.BundleUrl;
string bundleUrl = GlobalSetting.PatchData.BundleUrl;
Log.Info("下载资源的路径:" + bundleUrl);
await GameApp.Resource.InitPackageAsync(string.Empty, bundleUrl, bundleUrl, true);

View File

@ -32,16 +32,16 @@ namespace Unity.Startup.Procedure
{
try
{
if (GlobalConfig.PatchData == null)
if (GlobalSetting.PatchData == null)
{
Log.Error("GlobalConfig PatchData Is Null!");
return;
}
if (GlobalConfig.PatchData.Version != AppVersion.GameVersion)
if (GlobalSetting.PatchData.Version != AppVersion.GameVersion)
{
Log.Warning($"Version inconsistency : {AppVersion.GameVersion}->{GlobalConfig.PatchData.Version} ");
Log.Warning($"Version inconsistency : {AppVersion.GameVersion}->{GlobalSetting.PatchData.Version} ");
#if UNITY_EDITOR
UnityEditor.EditorApplication.isPlaying = false;
#else

View File

@ -58,7 +58,7 @@ namespace Unity.Startup.Procedure
return;
}
GlobalConfig.PatchData = Utility.Json.ToObject<ResourcePatchData>(updateDataStr);
GlobalSetting.PatchData = Utility.Json.ToObject<ResourcePatchData>(updateDataStr);
ChangeState<ProcedureGetAppVersionInfoState>(procedureOwner);
}

View File

@ -13,7 +13,7 @@ namespace Unity.Startup.Procedure
{
public sealed class ProcedureLoadAssembly : ProcedureBase
{
private bool m_enableAddressable = true;
// private bool m_enableAddressable = true;
private int m_LoadAssetCount;
private int m_LoadMetadataAssetCount;
private int m_FailureAssetCount;
@ -35,7 +35,7 @@ namespace Unity.Startup.Procedure
m_HotfixAssemblys = new List<Assembly>();
//AOT Assembly加载原始metadata
if (FrameworkSettingsUtils.FrameworkHotUpdateSettings.Enable)
if (AssemblyLoadData.Enable)
{
#if !UNITY_EDITOR
m_LoadMetadataAssemblyComplete = false;
@ -49,25 +49,27 @@ namespace Unity.Startup.Procedure
m_LoadMetadataAssemblyComplete = true;
}
if (!FrameworkSettingsUtils.FrameworkHotUpdateSettings.Enable || GameApp.Resource.GamePlayMode == EPlayMode.EditorSimulateMode)
if (!AssemblyLoadData.Enable ||
GameApp.Resource.GamePlayMode == EPlayMode.EditorSimulateMode)
{
m_MainLogicAssembly = GetMainLogicAssembly();
}
else
{
if (FrameworkSettingsUtils.FrameworkHotUpdateSettings.Enable)
if (AssemblyLoadData.Enable)
{
foreach (string hotUpdateDllName in FrameworkSettingsUtils.FrameworkHotUpdateSettings.HotUpdateAssemblies)
foreach (string hotUpdateDllName in AssemblyLoadData.Instance
.HotUpdateAssemblies)
{
var assetLocation = hotUpdateDllName;
if (!m_enableAddressable)
{
assetLocation = Utility.Path.GetRegularPath(
Path.Combine(
"Assets",
FrameworkSettingsUtils.FrameworkHotUpdateSettings.AssemblyTextAssetPath,
$"{hotUpdateDllName}{FrameworkSettingsUtils.FrameworkHotUpdateSettings.AssemblyTextAssetExtension}"));
}
// if (!m_enableAddressable)
// {
// assetLocation = Utility.Path.GetRegularPath(
// Path.Combine(
// "Assets",
// FrameworkHotUpdateSettings.Instance.AssemblyTextAssetPath,
// $"{hotUpdateDllName}{FrameworkHotUpdateSettings.Instance.AssemblyTextAssetExtension}"));
// }
Log.Info($"LoadAsset: [ {assetLocation} ]");
m_LoadAssetCount++;
@ -90,7 +92,8 @@ namespace Unity.Startup.Procedure
}
protected override void OnUpdate(IFsm<IProcedureManager> procedureOwner, float elapseSeconds, float realElapseSeconds)
protected override void OnUpdate(IFsm<IProcedureManager> procedureOwner, float elapseSeconds,
float realElapseSeconds)
{
if (!m_LoadAssemblyComplete)
{
@ -117,17 +120,17 @@ namespace Unity.Startup.Procedure
return;
}
var appType = m_MainLogicAssembly.GetType("GameLogic.HotfixEntry");
var appType = m_MainLogicAssembly.GetType(GlobalSetting.EntranceClass);
if (appType == null)
{
Log.Warning($"Main logic type 'HotfixEntry' missing.");
Log.Warning($"Main logic type '{GlobalSetting.EntranceClass}' missing.");
return;
}
var entryMethod = appType.GetMethod("Entrance");
var entryMethod = appType.GetMethod(GlobalSetting.EntranceMethod);
if (entryMethod == null)
{
Log.Warning($"Main logic entry method 'Entrance' missing.");
Log.Warning($"Main logic entry method '{GlobalSetting.EntranceMethod}' missing.");
return;
}
@ -141,13 +144,13 @@ namespace Unity.Startup.Procedure
Assembly mainLogicAssembly = null;
foreach (var assembly in AppDomain.CurrentDomain.GetAssemblies())
{
if (string.Compare(FrameworkSettingsUtils.FrameworkHotUpdateSettings.LogicMainDllName, $"{assembly.GetName().Name}.dll",
if (string.Compare(GlobalSetting.EntranceDll, $"{assembly.GetName().Name}.dll",
StringComparison.Ordinal) == 0)
{
mainLogicAssembly = assembly;
}
foreach (var hotUpdateDllName in FrameworkSettingsUtils.FrameworkHotUpdateSettings.HotUpdateAssemblies)
foreach (var hotUpdateDllName in AssemblyLoadData.Instance.HotUpdateAssemblies)
{
if (hotUpdateDllName == $"{assembly.GetName().Name}.dll")
{
@ -155,7 +158,8 @@ namespace Unity.Startup.Procedure
}
}
if (mainLogicAssembly != null && m_HotfixAssemblys.Count == FrameworkSettingsUtils.FrameworkHotUpdateSettings.HotUpdateAssemblies.Count)
if (mainLogicAssembly != null && m_HotfixAssemblys.Count ==
AssemblyLoadData.Instance.HotUpdateAssemblies.Count)
{
break;
}
@ -183,7 +187,7 @@ namespace Unity.Startup.Procedure
try
{
var assembly = Assembly.Load(textAsset.bytes);
if (string.Compare(FrameworkSettingsUtils.FrameworkHotUpdateSettings.LogicMainDllName, assetName, StringComparison.Ordinal) == 0)
if (string.Compare(GlobalSetting.EntranceDll, assetName, StringComparison.Ordinal) == 0)
{
m_MainLogicAssembly = assembly;
}
@ -216,23 +220,23 @@ namespace Unity.Startup.Procedure
// 注意补充元数据是给AOT dll补充元数据而不是给热更新dll补充元数据。
// 热更新dll不缺元数据不需要补充如果调用LoadMetadataForAOTAssembly会返回错误
if (FrameworkSettingsUtils.FrameworkHotUpdateSettings.AOTMetaAssemblies.Count == 0)
if (AssemblyLoadData.Instance.AOTMetaAssemblies.Count == 0)
{
m_LoadMetadataAssemblyComplete = true;
return;
}
foreach (string aotDllName in FrameworkSettingsUtils.FrameworkHotUpdateSettings.AOTMetaAssemblies)
foreach (string aotDllName in AssemblyLoadData.Instance.AOTMetaAssemblies)
{
var assetLocation = aotDllName;
if (!m_enableAddressable)
{
assetLocation = Utility.Path.GetRegularPath(
Path.Combine(
"Assets",
FrameworkSettingsUtils.FrameworkHotUpdateSettings.AssemblyTextAssetPath,
$"{aotDllName}{FrameworkSettingsUtils.FrameworkHotUpdateSettings.AssemblyTextAssetExtension}"));
}
// if (!m_enableAddressable)
// {
// assetLocation = Utility.Path.GetRegularPath(
// Path.Combine(
// "Assets",
// FrameworkHotUpdateSettings.Instance.AssemblyTextAssetPath,
// $"{aotDllName}{FrameworkHotUpdateSettings.Instance.AssemblyTextAssetExtension}"));
// }
Log.Info($"LoadMetadataAsset: [ {assetLocation} ]");
@ -266,7 +270,8 @@ namespace Unity.Startup.Procedure
#if ENABLE_HYBRIDCLR
// 加载assembly对应的dll会自动为它hook。一旦Aot泛型函数的native函数不存在用解释器版本代码
HomologousImageMode mode = HomologousImageMode.SuperSet;
LoadImageErrorCode err = (LoadImageErrorCode)HybridCLR.RuntimeApi.LoadMetadataForAOTAssembly(dllBytes, mode);
LoadImageErrorCode err =
(LoadImageErrorCode)HybridCLR.RuntimeApi.LoadMetadataForAOTAssembly(dllBytes, mode);
Log.Warning($"LoadMetadataForAOTAssembly:{assetName}. mode:{mode} ret:{err}");
#endif
}

Binary file not shown.

Binary file not shown.

View File

@ -1,17 +1,30 @@
using System.Collections.Generic;
using System.IO;
using AlicizaX.Editor;
using System.Collections.Generic;
using Newtonsoft.Json;
using Sirenix.OdinInspector;
using Sirenix.OdinInspector.Editor;
using UnityEditor;
using UnityEngine;
namespace AlicizaX.UI.Editor
{
[System.Serializable]
[DisplayName("UI构建设置")]
internal sealed class UIGenerateConfigurationTab : GameFrameworkTabBase
public class UISettingEditorWindow : OdinEditorWindow
{
[MenuItem("Tools/AlicizaX/UI Setting Window")]
private static void OpenWindow()
{
GetWindow<UISettingEditorWindow>().Show();
}
protected override void Initialize()
{
uiGenerateConfiguration = UIGenerateConfiguration.Instance;
UIGenerateCommonData = uiGenerateConfiguration.UIGenerateCommonData;
UIScriptGenerateConfigs = uiGenerateConfiguration.UIScriptGenerateConfigs;
UIElementRegexConfigs = uiGenerateConfiguration.UIElementRegexConfigs;
RefreshLabel();
}
// [Required] [InlineEditor(InlineEditorObjectFieldModes.CompletelyHidden)] [DisableInPlayMode] [HideLabel]
private UIGenerateConfiguration uiGenerateConfiguration;
@ -21,8 +34,7 @@ namespace AlicizaX.UI.Editor
[TabGroup("UI基础设置")] [LabelText("脚本生成预览")] [ShowInInspector] [ReadOnly] [OnValueChanged("RefreshLabel")]
private string previewLabel;
[TabGroup("UI基础设置")] [LabelText("组件生成预览")] [ShowInInspector] [ReadOnly] [OnValueChanged("RefreshLabel")]
[SuffixLabel("(下标0开始)")]
[TabGroup("UI基础设置")] [LabelText("组件生成预览")] [ShowInInspector] [ReadOnly] [OnValueChanged("RefreshLabel")] [SuffixLabel("(下标0开始)")]
private string previewCompLabel;
[Required] [DisableInPlayMode] [HideLabel] [TabGroup("UI构建配置")] [SerializeField] [TableList(ShowIndexLabels = false, DrawScrollView = true, AlwaysExpanded = true)]
@ -48,18 +60,21 @@ namespace AlicizaX.UI.Editor
UIElementRegexConfigs = JsonConvert.DeserializeObject<List<UIEelementRegexData>>(text);
}
public UIGenerateConfigurationTab()
protected override void OnDisable()
{
uiGenerateConfiguration = UIGenerateConfiguration.Instance;
UIGenerateCommonData = uiGenerateConfiguration.UIGenerateCommonData;
UIScriptGenerateConfigs = uiGenerateConfiguration.UIScriptGenerateConfigs;
UIElementRegexConfigs = uiGenerateConfiguration.UIElementRegexConfigs;
RefreshLabel();
base.OnDisable();
uiGenerateConfiguration.UIGenerateCommonData = UIGenerateCommonData;
uiGenerateConfiguration.UIScriptGenerateConfigs = UIScriptGenerateConfigs;
uiGenerateConfiguration.UIElementRegexConfigs = UIElementRegexConfigs;
EditorUtility.SetDirty(uiGenerateConfiguration);
AssetDatabase.SaveAssets();
UIGenerateConfiguration.Save();
}
protected override void Save()
protected override void OnDestroy()
{
base.Save();
base.OnDestroy();
uiGenerateConfiguration.UIGenerateCommonData = UIGenerateCommonData;
uiGenerateConfiguration.UIScriptGenerateConfigs = UIScriptGenerateConfigs;
uiGenerateConfiguration.UIElementRegexConfigs = UIElementRegexConfigs;

View File

@ -0,0 +1,3 @@
fileFormatVersion: 2
guid: d6e004459b3645d4b3022bdde89795b9
timeCreated: 1741340568

View File

@ -29,7 +29,7 @@ namespace AlicizaX.UI.Editor
}
[System.Serializable]
internal class UIEelementRegexData
public class UIEelementRegexData
{
public string uiElementRegex;
@ -66,7 +66,7 @@ namespace AlicizaX.UI.Editor
}
[System.Serializable]
internal class UIScriptGenerateData
public class UIScriptGenerateData
{
public string ConfigName;

View File

@ -1,3 +0,0 @@
fileFormatVersion: 2
guid: c093bf237b3e4243a52e04a5db36f86d
timeCreated: 1737705566

View File

@ -6,7 +6,7 @@
"version": "1.0.1",
"unity": "2025.1",
"keywords": [
"Game Framework X"
"Aliciza X"
],
"repository": {
"name": "com.alicizax.unity",

View File

@ -1,36 +0,0 @@
using System.IO;
using AlicizaX.Runtime;
using UnityEditor;
using UnityEngine;
namespace AlicizaX.Editor
{
static class FrameworkAssetInitlized
{
[InitializeOnLoadMethod]
static void Initlize()
{
string FloderPath = "Assets/Resources/";
if (!Directory.Exists(FloderPath))
{
Directory.CreateDirectory(FloderPath);
}
string publisherPath = Path.Combine(FloderPath, "FrameworkPublishSettings.asset");
string hotPath = Path.Combine(FloderPath, "FrameworkHotUpdateSettings.asset");
if (!File.Exists(publisherPath))
{
var publisherObject = ScriptableObject.CreateInstance<FrameworkPublishSettings>();
AssetDatabase.CreateAsset(publisherObject, publisherPath);
}
if (!File.Exists(hotPath))
{
var hotObject = ScriptableObject.CreateInstance<FrameworkHotUpdateSettings>();
AssetDatabase.CreateAsset(hotObject, hotPath);
}
AssetDatabase.Refresh();
}
}
}

View File

@ -1,3 +0,0 @@
fileFormatVersion: 2
guid: 9e6620d843d745fba3213017d052d5e1
timeCreated: 1739170824

View File

@ -1,97 +1,97 @@
using UnityEditor;
using UnityEngine;
using System;
using System.Linq;
using System.Reflection;
using System.Collections.Generic;
using AlicizaX.Runtime;
using Sirenix.OdinInspector.Editor;
namespace AlicizaX.Editor
{
public class GameFrameworkPreferenceWindow : OdinMenuEditorWindow
{
private List<Type> m_TabTypes;
private readonly Dictionary<Type, GameFrameworkTabBase> _tabBases = new();
[MenuItem("Tools/AlicizaX/Preference Window")]
public static void ShowWindow()
{
GetWindow<GameFrameworkPreferenceWindow>(true, "Preference Window");
}
protected override void OnEnable()
{
base.OnEnable();
this.position = new Rect(this.position.x, this.position.y, 800, 600);
var assemblies = Utility.Assembly.GetAssemblies();
m_TabTypes = new List<Type>();
foreach (var assembly in assemblies)
{
var types = assembly.GetTypes();
foreach (var type in types)
{
if (typeof(GameFrameworkTabBase).IsAssignableFrom(type) && type.IsClass && !type.IsAbstract)
{
var displayNameAttr = (DisplayNameAttribute)Attribute.GetCustomAttribute(type, typeof(DisplayNameAttribute));
if (displayNameAttr != null)
{
m_TabTypes.Add(type);
}
}
}
}
m_TabTypes = m_TabTypes.OrderBy(t => ((DisplayNameAttribute)Attribute.GetCustomAttribute(t, typeof(DisplayNameAttribute))).DisplayName).ToList();
}
protected override void OnDestroy()
{
base.OnDestroy();
if (this.MenuTree != null && this.MenuTree.Selection.SelectedValue != null)
{
var selectTarget = this.MenuTree.Selection.SelectedValue;
if (selectTarget != null)
{
var selectType = selectTarget.GetType();
if (_tabBases.TryGetValue(selectType, out GameFrameworkTabBase tab))
{
tab.Save();
}
}
}
}
protected override OdinMenuTree BuildMenuTree()
{
var tree = new OdinMenuTree();
foreach (var tabType in m_TabTypes)
{
DisplayNameAttribute displayNameAttribute = (DisplayNameAttribute)Attribute.GetCustomAttribute(tabType, typeof(DisplayNameAttribute));
GameFrameworkTabBase instance = (GameFrameworkTabBase)Activator.CreateInstance(tabType);
_tabBases.Add(tabType, instance);
tree.Add(displayNameAttribute.DisplayName, instance);
}
tree.Selection.SelectionChanged += SelectionOnSelectionChanged;
return tree;
}
private void SelectionOnSelectionChanged(SelectionChangedType obj)
{
var selectTarget = this.MenuTree.Selection.SelectedValue;
if (selectTarget != null)
{
var selectType = selectTarget.GetType();
if (_tabBases.TryGetValue(selectType, out GameFrameworkTabBase tab))
{
tab.Save();
}
}
}
}
}
// using UnityEditor;
// using UnityEngine;
// using System;
// using System.Linq;
// using System.Reflection;
// using System.Collections.Generic;
// using AlicizaX.Runtime;
// using Sirenix.OdinInspector.Editor;
//
// namespace AlicizaX.Editor
// {
// public class GameFrameworkPreferenceWindow : OdinMenuEditorWindow
// {
// private List<Type> m_TabTypes;
// private readonly Dictionary<Type, GameFrameworkTabBase> _tabBases = new();
//
// [MenuItem("Tools/AlicizaX/Preference Window")]
// public static void ShowWindow()
// {
// GetWindow<GameFrameworkPreferenceWindow>(true, "Preference Window");
// }
//
// protected override void OnEnable()
// {
// base.OnEnable();
// this.position = new Rect(this.position.x, this.position.y, 800, 600);
//
// var assemblies = Utility.Assembly.GetAssemblies();
//
// m_TabTypes = new List<Type>();
//
// foreach (var assembly in assemblies)
// {
// var types = assembly.GetTypes();
// foreach (var type in types)
// {
// if (typeof(GameFrameworkTabBase).IsAssignableFrom(type) && type.IsClass && !type.IsAbstract)
// {
// var displayNameAttr = (DisplayNameAttribute)Attribute.GetCustomAttribute(type, typeof(DisplayNameAttribute));
// if (displayNameAttr != null)
// {
// m_TabTypes.Add(type);
// }
// }
// }
// }
//
// m_TabTypes = m_TabTypes.OrderBy(t => ((DisplayNameAttribute)Attribute.GetCustomAttribute(t, typeof(DisplayNameAttribute))).DisplayName).ToList();
// }
//
//
// protected override void OnDestroy()
// {
// base.OnDestroy();
// if (this.MenuTree != null && this.MenuTree.Selection.SelectedValue != null)
// {
// var selectTarget = this.MenuTree.Selection.SelectedValue;
// if (selectTarget != null)
// {
// var selectType = selectTarget.GetType();
// if (_tabBases.TryGetValue(selectType, out GameFrameworkTabBase tab))
// {
// tab.Save();
// }
// }
// }
// }
//
// protected override OdinMenuTree BuildMenuTree()
// {
// var tree = new OdinMenuTree();
// foreach (var tabType in m_TabTypes)
// {
// DisplayNameAttribute displayNameAttribute = (DisplayNameAttribute)Attribute.GetCustomAttribute(tabType, typeof(DisplayNameAttribute));
// GameFrameworkTabBase instance = (GameFrameworkTabBase)Activator.CreateInstance(tabType);
// _tabBases.Add(tabType, instance);
// tree.Add(displayNameAttribute.DisplayName, instance);
// }
//
// tree.Selection.SelectionChanged += SelectionOnSelectionChanged;
// return tree;
// }
//
// private void SelectionOnSelectionChanged(SelectionChangedType obj)
// {
// var selectTarget = this.MenuTree.Selection.SelectedValue;
// if (selectTarget != null)
// {
// var selectType = selectTarget.GetType();
// if (_tabBases.TryGetValue(selectType, out GameFrameworkTabBase tab))
// {
// tab.Save();
// }
// }
// }
// }
// }

View File

@ -10,6 +10,7 @@ using UnityEngine;
public static class BuildDLLCommand
{
private const string EnableHybridClrScriptingDefineSymbol = "ENABLE_HYBRIDCLR";
public const string AssemblyTextAssetPath = "Bundles/DLL";
static BuildDLLCommand()
{
@ -18,7 +19,7 @@ public static class BuildDLLCommand
/// <summary>
/// 禁用HybridCLR宏定义。
/// </summary>
[MenuItem("Tools/AlicizaX/HybridCLR/Define Symbols/Disable HybridCLR", false, 30)]
[MenuItem("HybridCLR/Tools/Define Symbols/Disable HybridCLR", false, 30)]
public static void Disable()
{
ScriptingDefineSymbols.RemoveScriptingDefineSymbol(EnableHybridClrScriptingDefineSymbol);
@ -29,7 +30,7 @@ public static class BuildDLLCommand
/// <summary>
/// 开启HybridCLR宏定义。
/// </summary>
[MenuItem("Tools/AlicizaX/HybridCLR/Define Symbols/Enable HybridCLR", false, 31)]
[MenuItem("HybridCLR/Tools/Tools/Define Symbols/Enable HybridCLR", false, 31)]
public static void Enable()
{
ScriptingDefineSymbols.RemoveScriptingDefineSymbol(EnableHybridClrScriptingDefineSymbol);
@ -39,10 +40,9 @@ public static class BuildDLLCommand
}
#if ENABLE_HYBRIDCLR
[MenuItem("Tools/AlicizaX/HybridCLR/Build/BuildAssets And CopyTo AssemblyTextAssetPath")]
[MenuItem("HybridCLR/Tools/Build/BuildAssets And CopyTo AssemblyTextAssetPath")]
public static void BuildAndCopyDlls()
{
BuildTarget target = EditorUserBuildSettings.activeBuildTarget;
CompileDllCommand.CompileDll(target);
CopyAOTHotUpdateDlls(target);
@ -69,14 +69,15 @@ public static class BuildDLLCommand
#if ENABLE_HYBRIDCLR
var target = EditorUserBuildSettings.activeBuildTarget;
string aotAssembliesSrcDir = SettingsUtil.GetAssembliesPostIl2CppStripDir(target);
string aotAssembliesDstDir = Application.dataPath + "/" + ScriptableSingletonUtil.Get<FrameworkHotUpdateSettings>().AssemblyTextAssetPath;
string aotAssembliesDstDir = Application.dataPath + "/" + AssemblyTextAssetPath;
foreach (var dll in ScriptableSingletonUtil.Get<FrameworkHotUpdateSettings>().AOTMetaAssemblies)
foreach (var dll in AssemblyLoadData.Instance.AOTMetaAssemblies)
{
string srcDllPath = $"{aotAssembliesSrcDir}/{dll}";
if (!System.IO.File.Exists(srcDllPath))
{
Debug.LogError($"ab中添加AOT补充元数据dll:{srcDllPath} 时发生错误,文件不存在。裁剪后的AOT dll在BuildPlayer时才能生成因此需要你先构建一次游戏App后再打包。");
Debug.LogError(
$"ab中添加AOT补充元数据dll:{srcDllPath} 时发生错误,文件不存在。裁剪后的AOT dll在BuildPlayer时才能生成因此需要你先构建一次游戏App后再打包。");
continue;
}
@ -93,7 +94,7 @@ public static class BuildDLLCommand
var target = EditorUserBuildSettings.activeBuildTarget;
string hotfixDllSrcDir = SettingsUtil.GetHotUpdateDllsOutputDirByTarget(target);
string hotfixAssembliesDstDir = Application.dataPath + "/" + ScriptableSingletonUtil.Get<FrameworkHotUpdateSettings>().AssemblyTextAssetPath;
string hotfixAssembliesDstDir = Application.dataPath + "/" + AssemblyTextAssetPath;
foreach (var dll in SettingsUtil.HotUpdateAssemblyFilesExcludePreserved)
{
string dllPath = $"{hotfixDllSrcDir}/{dll}";

View File

@ -1,37 +0,0 @@
using System;
using System.Collections.Generic;
using AlicizaX.Editor;
using Sirenix.OdinInspector;
using Sirenix.OdinInspector.Editor;
using Sirenix.Serialization;
using UnityEditor;
using UnityEngine;
namespace AlicizaX.Runtime
{
[DisplayName("热更设置")]
[Serializable]
internal sealed class HybridCLRSettingTab : GameFrameworkTabBase
{
[Required][InlineEditor(InlineEditorObjectFieldModes.CompletelyHidden)][DisableInPlayMode] [HideLabel]
public FrameworkHotUpdateSettings FrameworkHotUpdateSettings;
public HybridCLRSettingTab()
{
FrameworkHotUpdateSettings = ScriptableSingletonUtil.Get<FrameworkHotUpdateSettings>();
}
[Sirenix.OdinInspector.Button(ButtonSizes.Large)]
private void RefreshAssembly()
{
SyncAssemblyContent.RefreshAssembly();
}
protected internal override void Save()
{
base.Save();
EditorUtility.SetDirty(FrameworkHotUpdateSettings);
AssetDatabase.SaveAssets();
}
}
}

View File

@ -1,3 +0,0 @@
fileFormatVersion: 2
guid: ab21809ce8ad4d5ebe950b70107deb00
timeCreated: 1737525094

View File

@ -1,15 +1,20 @@
using System.IO;
using AlicizaX.Runtime;
using UnityEditor;
namespace AlicizaX.Editor
{
public static class SyncAssemblyContent
{
[MenuItem("HybridCLR/Sync Assembly")]
public static void RefreshAssembly()
{
ScriptableSingletonUtil.Get<FrameworkHotUpdateSettings>().HotUpdateAssemblies = HybridCLR.Editor.SettingsUtil.HotUpdateAssemblyFilesIncludePreserved;
ScriptableSingletonUtil.Get<FrameworkHotUpdateSettings>().AOTMetaAssemblies = HybridCLR.Editor.SettingsUtil.AOTAssemblyNames;
AssemblyLoadData assemblyLoadData = new AssemblyLoadData();
assemblyLoadData.HotUpdateAssemblies = HybridCLR.Editor.SettingsUtil.HotUpdateAssemblyFilesIncludePreserved;
assemblyLoadData.AOTMetaAssemblies = HybridCLR.Editor.SettingsUtil.AOTAssemblyNames;
File.WriteAllText("Assets/Resources/AssemblyLoadData.json", Utility.Json.ToJson(assemblyLoadData));
AssetDatabase.Refresh();
AssetDatabase.SaveAssets();
}
}
}
}

View File

@ -0,0 +1,29 @@
using System;
using UnityEngine;
namespace AlicizaX.Runtime
{
[Serializable]
public class AppBuilderSetting
{
public static AppBuilderSetting Instance
{
get
{
if (_instance == null)
{
TextAsset text = Resources.Load<TextAsset>("AppBuilderSetting");
_instance = Utility.Json.ToObject<AppBuilderSetting>(text.text);
}
return _instance;
}
}
private static AppBuilderSetting _instance;
public bool DebugMode = false;
public int ResMode = 0;
public Language Language = Runtime.Language.ChineseSimplified;
}
}

View File

@ -0,0 +1,46 @@
using System;
using System.Collections.Generic;
using AlicizaX.Runtime;
using UnityEngine;
using UnityEngine.Serialization;
/// <summary>
/// HybridCLRCustomGlobalSettings.
/// </summary>
[Serializable]
public class AssemblyLoadData
{
public static bool Enable
{
get
{
#if ENABLE_HYBRIDCLR
return true;
#else
return false;
#endif
}
}
public static AssemblyLoadData Instance
{
get
{
if (_instance == null)
{
TextAsset text = Resources.Load<TextAsset>("AssemblyLoadData");
_instance = Utility.Json.ToObject<AssemblyLoadData>(text.text);
}
return _instance;
}
}
private static AssemblyLoadData _instance;
public List<string> HotUpdateAssemblies = new List<string>()
{ "GameLib.dll", "GameProto.dll", "GameBase.dll", "GameLogic.dll" };
public List<string> AOTMetaAssemblies = new List<string>() { "mscorlib.dll", "System.dll", "System.Core.dll" };
}

View File

@ -1,44 +0,0 @@
using System;
using System.Collections.Generic;
using AlicizaX.Runtime;
using UnityEngine;
using UnityEngine.Serialization;
/// <summary>
/// HybridCLRCustomGlobalSettings.
/// </summary>
[Serializable]
public class FrameworkHotUpdateSettings : ScriptableObject
{
public bool Enable
{
get
{
#if ENABLE_HYBRIDCLR
return true;
#else
return false;
#endif
}
}
[Header("Auto sync with [HybridCLRGlobalSettings]")] [Tooltip("You should modify the file form file path [Assets/CustomHybridCLR/Settings/HybridCLRGlobalSettings.asset]")]
public List<string> HotUpdateAssemblies = new List<string>() { "GameLib.dll", "GameProto.dll", "GameBase.dll", "GameLogic.dll" };
[Header("Need manual setting!")] public List<string> AOTMetaAssemblies = new List<string>() { "mscorlib.dll", "System.dll", "System.Core.dll" };
/// <summary>
/// Dll of main business logic assembly
/// </summary>
public string LogicMainDllName = "GameLogic.dll";
/// <summary>
/// 程序集文本资产打包Asset后缀名
/// </summary>
public string AssemblyTextAssetExtension = ".bytes";
/// <summary>
/// 程序集文本资产资源目录
/// </summary>
public string AssemblyTextAssetPath = "Bundles/DLL";
}

View File

@ -1,15 +0,0 @@
using System;
using System.Collections.Generic;
using System.Linq;
using Sirenix.OdinInspector;
using UnityEngine;
namespace AlicizaX.Runtime
{
[Serializable]
public class FrameworkPublishSettings : ScriptableObject
{
public int ResMode = 0;
public Language Language = Runtime.Language.ChineseSimplified;
}
}

View File

@ -1,38 +0,0 @@
using UnityEngine;
namespace AlicizaX.Runtime
{
public static class FrameworkSettingsUtils
{
public static FrameworkHotUpdateSettings FrameworkHotUpdateSettings
{
get
{
if (_frameworkHotUpdateSettings == null)
{
_frameworkHotUpdateSettings = Resources.Load<FrameworkHotUpdateSettings>("FrameworkHotUpdateSettings");
}
return _frameworkHotUpdateSettings;
}
}
private static FrameworkHotUpdateSettings _frameworkHotUpdateSettings;
public static FrameworkPublishSettings FrameworkPublishSettings
{
get
{
if (_frameworkPublishSettings == null)
{
_frameworkPublishSettings = Resources.Load<FrameworkPublishSettings>("FrameworkPublishSettings");
}
return _frameworkPublishSettings;
}
}
private static FrameworkPublishSettings _frameworkPublishSettings;
}
}

View File

@ -1,3 +0,0 @@
fileFormatVersion: 2
guid: 2cd40b376b4a493faea997eb0ecf31c7
timeCreated: 1737532661

View File

@ -1,6 +1,6 @@
{
"dependencies": {
"com.code-philosophy.hybridclr": "https://github.com/focus-creative-games/hybridclr_unity.git",
"com.code-philosophy.hybridclr": "https://gitee.com/focus-creative-games/hybridclr_unity.git",
"com.fantasy.unity": "http://101.34.252.46:3000/AlicizaX/Fantasy.Unity.git",
"com.paps.unity-toolbar-extender-ui-toolkit": "http://101.34.252.46:3000/AlicizaX/com.paps.unity-toolbar-extender-ui-toolkit.git",
"com.unity.ai.navigation": "2.0.4",

View File

@ -152,7 +152,7 @@
"dependencies": {}
},
"com.code-philosophy.hybridclr": {
"version": "https://github.com/focus-creative-games/hybridclr_unity.git",
"version": "https://gitee.com/focus-creative-games/hybridclr_unity.git",
"depth": 0,
"source": "git",
"dependencies": {},

View File

@ -6,7 +6,7 @@ EditorBuildSettings:
serializedVersion: 2
m_Scenes:
- enabled: 1
path: Assets/Main.unity
path: Assets/Scenes/Main.unity
guid: 3a0b1916be2731d44840741d972ef135
m_configObjects:
com.unity.input.settings.actions: {fileID: -944628639613478452, guid: 052faaac586de48259a63d0c4782560b, type: 3}

View File

@ -302,8 +302,8 @@ MonoBehaviour:
m_TextWithWhitespace: "Game\u200B"
m_Pos:
serializedVersion: 2
x: 1920
y: 84
x: 0
y: 24
width: 528
height: 915
m_SerializedDataModeController:
@ -1152,8 +1152,8 @@ MonoBehaviour:
m_TextWithWhitespace: "Hierarchy\u200B"
m_Pos:
serializedVersion: 2
x: 2449
y: 84
x: 1
y: 24
width: 438
height: 430
m_SerializedDataModeController:
@ -1218,8 +1218,8 @@ MonoBehaviour:
m_TextWithWhitespace: "Console\u200B"
m_Pos:
serializedVersion: 2
x: 2449
y: 540
x: 1
y: 480
width: 438
height: 459
m_SerializedDataModeController:
@ -1254,8 +1254,8 @@ MonoBehaviour:
m_TextWithWhitespace: "Project\u200B"
m_Pos:
serializedVersion: 2
x: 2889
y: 84
x: 970
y: 24
width: 282
height: 915
m_SerializedDataModeController:
@ -1297,7 +1297,7 @@ MonoBehaviour:
scrollPos: {x: 0, y: 0}
m_SelectedIDs: e48c0000
m_LastClickedID: 36068
m_ExpandedIDs: 00000000b8bc0000bebc000074be000076be000078be00007abe00007cbe00007ebe000080be000082be000084be000086be000088be00008abe00008cbe00008ebe000090be000092be000094be000096be000098be00009abe00009cbe00009ebe0000a0be0000a2be0000a4be0000a6be0000a8be0000aabe0000acbe0000aebe0000b0be0000b2be0000b4be0000b6be0000b8be0000babe0000bcbe0000bebe0000c0be0000c2be0000c4be0000c6be0000c8be0000cabe0000ccbe0000cebe0000d0be0000d2be0000d4be0000d6be0000d8be0000dabe0000dcbe0000debe0000e0be0000e2be0000e4be0000e6be0000e8be0000eabe0000ecbe0000eebe0000f0be0000f2be0000f4be0000f6be0000f8be0000fabe0000fcbe0000febe000000bf000002bf000004bf000006bf000008bf00000abf00000cbf00000ebf000010bf000012bf000014bf000016bf000018bf00001abf00001cbf00001ebf000020bf000022bf000024bf000026bf000028bf00002abf00002cbf00002ebf000030bf000032bf000034bf000036bf000038bf00003abf00003cbf00003ebf000040bf000042bf000044bf000046bf000048bf00004abf00004cbf00004ebf000050bf000052bf000054bf000056bf000058bf00005abf00005cbf00005ebf000060bf000062bf000064bf000066bf000068bf00006abf00006cbf00006ebf000070bf000072bf000074bf000076bf000078bf00007abf00007cbf00007ebf000080bf000082bf000084bf000086bf000088bf00008abf00008cbf00008ebf000090bf000092bf000094bf000096bf000098bf00009abf00009cbf00009ebf0000a0bf0000a2bf0000a4bf0000a6bf0000a8bf0000aabf0000acbf0000aebf0000b0bf0000b2bf0000b4bf0000b6bf0000b8bf0000babf0000bcbf0000bebf0000c0bf0000c2bf0000c4bf0000c6bf0000c8bf0000cabf0000ccbf0000cebf0000d0bf0000d2bf0000d4bf0000d6bf0000d8bf0000
m_ExpandedIDs:
m_RenameOverlay:
m_UserAcceptedRename: 0
m_Name:
@ -1326,7 +1326,7 @@ MonoBehaviour:
scrollPos: {x: 0, y: 0}
m_SelectedIDs:
m_LastClickedID: 0
m_ExpandedIDs: ffffffff00000000b8bc0000bebc000074be000076be000078be00007abe00007cbe00007ebe000080be000082be000084be000086be000088be00008abe00008cbe00008ebe000090be000092be000094be000096be000098be00009abe00009cbe00009ebe0000a0be0000a2be0000a4be0000a6be0000a8be0000aabe0000acbe0000aebe0000b0be0000b2be0000b4be0000b6be0000b8be0000babe0000bcbe0000bebe0000c0be0000c2be0000c4be0000c6be0000c8be0000cabe0000ccbe0000cebe0000d0be0000d2be0000d4be0000d6be0000d8be0000dabe0000dcbe0000debe0000e0be0000e2be0000e4be0000e6be0000e8be0000eabe0000ecbe0000eebe0000f0be0000f2be0000f4be0000f6be0000f8be0000fabe0000fcbe0000febe000000bf000002bf000004bf000006bf000008bf00000abf00000cbf00000ebf000010bf000012bf000014bf000016bf000018bf00001abf00001cbf00001ebf000020bf000022bf000024bf000026bf000028bf00002abf00002cbf00002ebf000030bf000032bf000034bf000036bf000038bf00003abf00003cbf00003ebf000040bf000042bf000044bf000046bf000048bf00004abf00004cbf00004ebf000050bf000052bf000054bf000056bf000058bf00005abf00005cbf00005ebf000060bf000062bf000066bf000068bf00006abf00006cbf00006ebf000070bf000072bf000074bf000076bf000078bf00007abf00007cbf00007ebf000080bf000082bf000084bf000086bf000088bf00008abf00008cbf00008ebf000090bf000092bf000094bf000098bf00009abf00009cbf0000a0bf0000a2bf0000a4bf0000a6bf0000a8bf0000aabf0000acbf0000aebf0000b0bf0000b2bf0000b4bf0000b6bf0000b8bf0000babf0000bcbf0000bebf0000c0bf0000c2bf0000c4bf0000c6bf0000c8bf0000cabf0000ccbf0000cebf0000d0bf0000d4bf0000d6bf0000d8bf0000a2c00000a4c00000b2c00000bac00000c0c00000aec50000
m_ExpandedIDs:
m_RenameOverlay:
m_UserAcceptedRename: 0
m_Name:
@ -1405,8 +1405,8 @@ MonoBehaviour:
m_TextWithWhitespace: "Inspector\u200B"
m_Pos:
serializedVersion: 2
x: 3173
y: 84
x: 1254
y: 24
width: 666
height: 915
m_SerializedDataModeController: