Files

94 lines
2.6 KiB
C#
Raw Permalink Normal View History

2025-10-31 15:31:34 +08:00
using HybridCLR;
using System;
using System.Collections;
using System.Collections.Generic;
using System.Linq;
using System.Reflection;
using UnityEngine;
using UnityEngine.AddressableAssets;
using UnityEngine.AddressableAssets.ResourceLocators;
public class Boot : SingletonBehaviour<Boot>
{
public AssetReferenceGameObject patchWindowRef;
// DLL<4C><4C><EFBFBD>ã<EFBFBD>0=<3D><><EFBFBD><EFBFBD>Ԫ<EFBFBD><D4AA><EFBFBD><EFBFBD>, 1=<3D>ȸ<EFBFBD><C8B8>³<EFBFBD><C2B3><EFBFBD><EFBFBD><EFBFBD>
public Dictionary<string, int> dllMap = new Dictionary<string, int>()
{
{ "mscorlib", 0 },
{ "System", 0 },
{ "System.Core", 0 },
{ "UnityScripts.HotUpdate", 1 },
};
void Awake()
{
Application.targetFrameRate = 60;
Application.runInBackground = true;
DontDestroyOnLoad(gameObject);
StartCoroutine(Initialize());
}
IEnumerator Initialize()
{
// <20><>ʼ<EFBFBD><CABC>Addressables
var initHandle = Addressables.InitializeAsync();
yield return initHandle;
// <20><><EFBFBD>ظ<EFBFBD><D8B8>´<EFBFBD><C2B4><EFBFBD>
var windowHandle = patchWindowRef.LoadAssetAsync<GameObject>();
yield return windowHandle;
var windowObj = Instantiate(windowHandle.Result, GameManager.Inst.MainCanvasUI.transform);
var patchWindow = windowObj.GetComponent<PatchWindow>();
// <20><>ʼ<EFBFBD><CABC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>£<EFBFBD><C2A3><EFBFBD><EFBFBD>ɺ<EFBFBD><C9BA>ص<EFBFBD>LoadDll
patchWindow.StartCheckUpdate(() => StartCoroutine(LoadDllAndStartGame()));
}
IEnumerator LoadDllAndStartGame()
{
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>DLL
foreach (var dll in dllMap)
{
yield return LoadSingleDll(dll.Key, dll.Value);
}
// <20><><EFBFBD>ز<EFBFBD><D8B2><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϸ
yield return LoadGameStart();
}
IEnumerator LoadSingleDll(string dllName, int dllType)
{
var handle = Addressables.LoadAssetAsync<TextAsset>(KeyManager.LoadDllKey(dllName));
yield return handle;
if (dllType == 0)
{
// <20><><EFBFBD>ز<EFBFBD><D8B2><EFBFBD>Ԫ<EFBFBD><D4AA><EFBFBD><EFBFBD>
RuntimeApi.LoadMetadataForAOTAssembly(handle.Result.bytes, HomologousImageMode.SuperSet);
}
else
{
#if UNITY_EDITOR
// <20><EFBFBD><E0BCAD>ģʽ<C4A3><CABD>ֱ<EFBFBD>ӻ<EFBFBD>ȡ<EFBFBD>Ѽ<EFBFBD><D1BC>صij<D8B5><C4B3><EFBFBD><EFBFBD><EFBFBD>
var hotUpdateAss = AppDomain.CurrentDomain.GetAssemblies()
.First(a => a.GetName().Name == "UnityScripts.HotUpdate");
#else
// <20><><EFBFBD><EFBFBD>ʱ<EFBFBD><CAB1><EFBFBD><EFBFBD><EFBFBD>ȸ<EFBFBD><C8B8>³<EFBFBD><C2B3><EFBFBD><EFBFBD><EFBFBD>
var hotUpdateAss = Assembly.Load(handle.Result.bytes);
#endif
Debug.Log($"<22>ɹ<EFBFBD><C9B9><EFBFBD><EFBFBD><EFBFBD> {dllName}");
}
Addressables.Release(handle);
}
IEnumerator LoadGameStart()
{
var handle = Addressables.LoadAssetAsync<GameObject>(KeyManager.LoadPrefabKey("GameStart"));
yield return handle;
Instantiate(handle.Result);
Addressables.Release(handle);
}
}