using System.Reflection; using Cysharp.Threading.Tasks; using SHFrame; using UnityEngine; using YooAsset; namespace HotMain.SHGame.Procedure { public class ProcedureLoadHot : ProcedureBase { protected override void OnEnter(SHFrame.FSM.IFsm procedureOwner) { base.OnEnter(procedureOwner); MainLoad(procedureOwner).Forget(); } private async UniTask MainLoad(SHFrame.FSM.IFsm procedureOwner) { // 加载热更dll foreach (var name in ProcedureInitializePackage.HotDllName) { await LoadHotfixDll(ProcedureInitializePackage.RawFilePackageName, name); } // 实例化热更新入口 执行游戏初始化(配置表初始化、UI模块初始化、获取玩家数据之类的操作) ResourcePackage package = YooAssets.GetPackage(ProcedureInitializePackage.DefaultPackageName); var go = await LoadGameObject(package, "HotPrefab"); go.name = $"Resource_{package.GetPackageVersion()}_{YooAssets.GetPackage(ProcedureInitializePackage.RawFilePackageName).GetPackageVersion()}"; Log.Warning($"Prefab name is {go.name}"); } public static async UniTask LoadHotfixDll(string packageName, string name) { Log.Warning($"加载热更dll:{name}"); var package = YooAssets.GetPackage(packageName); var handle = package.LoadRawFileAsync(name); await handle.ToUniTask(); var dllBytes = handle.GetRawFileData(); var assembly = Assembly.Load(dllBytes); Log.Warning($"加载热更dll完成:{name}"); return assembly; } /// /// 异步加载GameObject /// /// /// YooAsset中打包的资源名称 /// 返回GameObject public static async UniTask LoadGameObject(ResourcePackage package, string assetNames) { var handle = package.LoadAssetAsync(assetNames); await handle.ToUniTask(); return handle.InstantiateSync(); } } }