using Cysharp.Threading.Tasks; using HotMain.SHGame.YooAsset; using HotMain.SHGame.YooAsset.StreamingAssetsHelper; using SHFrame; using SHFrame.FSM; using YooAsset; namespace HotMain.SHGame.Procedure { /// /// 初始化资源包 /// public class ProcedureInitializePackage : ProcedureBase { public static EPlayMode PlayMode = EPlayMode.HostPlayMode; public static string RawFilePackageName = "RawFilePackage"; public static string DefaultPackageName = "DefaultPackage"; //热更新的dll名称 public static readonly string[] HotDllName = { "HotSamples.dll", }; public static readonly string[] AotMetaAssemblyFiles = { "mscorlib.dll", "System.dll", "System.Core.dll", }; protected override void OnEnter(IFsm procedureOwner) { base.OnEnter(procedureOwner); InitPackage(procedureOwner).Forget(); } private async UniTask InitPackage(IFsm procedureOwner) { Log.Debug($"YooAssets 开始初始化"); // 1.初始化资源系统 YooAssets.Initialize(); var rawFilePackage = await InitYooPackage(RawFilePackageName, true); var defaultPackage = await InitYooPackage(DefaultPackageName, false); Log.Debug($"YooAssets 初始化完成"); // 设置该资源包为默认的资源包,可以使用YooAssets相关加载接口加载该资源包内容。 YooAssets.SetDefaultPackage(defaultPackage); // 切换到更新资源清单 ChangeState(procedureOwner); } private async UniTask InitYooPackage(string packageName, bool isRaw) { // 创建资源包 var package = YooAssets.TryGetPackage(packageName) ?? YooAssets.CreatePackage(packageName); InitializationOperation initOperation = null; switch (PlayMode) { case EPlayMode.EditorSimulateMode: // 编辑器模拟模式 EDefaultBuildPipeline buildPipeline = isRaw ? EDefaultBuildPipeline.RawFileBuildPipeline : EDefaultBuildPipeline.ScriptableBuildPipeline; var initParametersEditorSimulateMode = new EditorSimulateModeParameters { SimulateManifestFilePath = EditorSimulateModeHelper.SimulateBuild(buildPipeline, packageName) }; initOperation = package.InitializeAsync(initParametersEditorSimulateMode); break; case EPlayMode.OfflinePlayMode: // 单机模式 var initParametersOfflinePlayMode = new OfflinePlayModeParameters { DecryptionServices = new FileStreamDecryption() }; initOperation = package.InitializeAsync(initParametersOfflinePlayMode); break; case EPlayMode.HostPlayMode: //联机运行模式 // 注意:GameQueryServices.cs 太空战机的脚本类,详细见StreamingAssetsHelper.cs string HostServer = $"http://ngame.jisol.cn/JNGame2/{packageName}"; var createParameters = new HostPlayModeParameters(); createParameters.DecryptionServices = new FileStreamDecryption(); createParameters.BuildinQueryServices = new GameQueryServices(); createParameters.RemoteServices = new RemoteServices(HostServer, HostServer); initOperation = package.InitializeAsync(createParameters); break; } await initOperation.ToUniTask(); return package; } } }