using System; using System.IO; using System.Collections; using System.Collections.Generic; using UnityEngine; using UniFramework.Machine; using YooAsset; internal class FsmInitializePackage : IStateNode { private StateMachine _machine; PatchOperationData data; void IStateNode.OnCreate(StateMachine machine) { _machine = machine; } void IStateNode.OnEnter() { data = (PatchOperationData)_machine.GetBlackboardValue("PatchOperationData"); Debug.Log($"初始化{data.packageName},下载路径:{GetHostServerURL(data.packageName)}"); GameManager.Inst.StartCoroutine(InitPackage()); } void IStateNode.OnUpdate() { } void IStateNode.OnExit() { } private IEnumerator InitPackage() { var playMode = data.playMode; var packageName = data.packageName; // 创建资源包裹类 var package = YooAssets.TryGetPackage(packageName); if (package == null) package = YooAssets.CreatePackage(packageName); // 编辑器下的模拟模式 InitializationOperation initializationOperation = null; if (playMode == EPlayMode.EditorSimulateMode) { var buildResult = EditorSimulateModeHelper.SimulateBuild(packageName); var packageRoot = buildResult.PackageRootDirectory; var createParameters = new EditorSimulateModeParameters(); createParameters.EditorFileSystemParameters = FileSystemParameters.CreateDefaultEditorFileSystemParameters(packageRoot); initializationOperation = package.InitializeAsync(createParameters); } // 单机运行模式 if (playMode == EPlayMode.OfflinePlayMode) { var createParameters = new OfflinePlayModeParameters(); createParameters.BuildinFileSystemParameters = FileSystemParameters.CreateDefaultBuildinFileSystemParameters(); initializationOperation = package.InitializeAsync(createParameters); } // 联机运行模式 if (playMode == EPlayMode.HostPlayMode) { // 注意:设置参数COPY_BUILDIN_PACKAGE_MANIFEST,可以初始化的时候拷贝内置清单到沙盒目录 var buildinFileSystemParams = FileSystemParameters.CreateDefaultBuildinFileSystemParameters(); buildinFileSystemParams.AddParameter(FileSystemParametersDefine.COPY_BUILDIN_PACKAGE_MANIFEST, true); string defaultHostServer = GetHostServerURL(packageName); string fallbackHostServer = GetHostServerURL(packageName); IRemoteServices remoteServices = new RemoteServices(defaultHostServer, fallbackHostServer); // 注意:设置参数INSTALL_CLEAR_MODE,可以解决覆盖安装的时候将拷贝的内置清单文件清理的问题。 var cacheFileSystemParams = FileSystemParameters.CreateDefaultCacheFileSystemParameters(remoteServices); cacheFileSystemParams.AddParameter(FileSystemParametersDefine.INSTALL_CLEAR_MODE, EOverwriteInstallClearMode.None); var createParameters = new HostPlayModeParameters(); createParameters.BuildinFileSystemParameters = packageName == "Preload" ? buildinFileSystemParams : null; createParameters.CacheFileSystemParameters = cacheFileSystemParams; initializationOperation = package.InitializeAsync(createParameters); } // WebGL运行模式 if (playMode == EPlayMode.WebPlayMode) { #if UNITY_WEBGL && WEIXINMINIGAME && !UNITY_EDITOR var createParameters = new WebPlayModeParameters(); string defaultHostServer = GetHostServerURL(packageName); string fallbackHostServer = GetHostServerURL(packageName); string packageRoot = $"{WeChatWASM.WX.env.USER_DATA_PATH}/__GAME_FILE_CACHE"; //注意:如果有子目录,请修改此处! IRemoteServices remoteServices = new RemoteServices(defaultHostServer, fallbackHostServer); createParameters.WebServerFileSystemParameters = WechatFileSystemCreater.CreateFileSystemParameters(packageRoot, remoteServices); initializationOperation = package.InitializeAsync(createParameters); #else var createParameters = new WebPlayModeParameters(); createParameters.WebServerFileSystemParameters = FileSystemParameters.CreateDefaultWebServerFileSystemParameters(); initializationOperation = package.InitializeAsync(createParameters); #endif } yield return initializationOperation; // 如果初始化失败弹出提示界面 if (initializationOperation.Status != EOperationStatus.Succeed) { MessageBox.Show() .SetTitle(packageName) .SetContent($"{initializationOperation.Error}") .AddButton("退出", (box) => { Application.Quit(); }); } else { _machine.ChangeState(); } } /// /// 获取资源服务器地址 /// public string GetHostServerURL(string packageName) { string hostServerIP = $"https://home.gtuantuan.online:9444/{Application.productName}"; if (GameManager.Inst.ServerAddress != "" && GameManager.Inst.ServerAddress != null) hostServerIP = $"{GameManager.Inst.ServerAddress}/{Application.productName}"; string appVersion = "v1"; #if UNITY_EDITOR if (UnityEditor.EditorUserBuildSettings.activeBuildTarget == UnityEditor.BuildTarget.Android) // return $"{hostServerIP}/CDN/Android/{packageName}/{appVersion}"; return $"{hostServerIP}/CDN/PC/{packageName}/{appVersion}"; else if (UnityEditor.EditorUserBuildSettings.activeBuildTarget == UnityEditor.BuildTarget.iOS) return $"{hostServerIP}/CDN/IPhone/{packageName}/{appVersion}"; else if (UnityEditor.EditorUserBuildSettings.activeBuildTarget == UnityEditor.BuildTarget.WebGL) return $"{hostServerIP}/CDN/WebGL/{packageName}/{appVersion}"; else return $"{hostServerIP}/CDN/PC/{packageName}/{appVersion}"; #else if (Application.platform == RuntimePlatform.Android) return $"{hostServerIP}/CDN/Android/{packageName}/{appVersion}"; else if (Application.platform == RuntimePlatform.IPhonePlayer) return $"{hostServerIP}/CDN/IPhone/{packageName}/{appVersion}"; else if (Application.platform == RuntimePlatform.WebGLPlayer) return $"{hostServerIP}/CDN/WebGL/{packageName}/{appVersion}"; else return $"{hostServerIP}/CDN/PC/{packageName}/{appVersion}"; #endif } /// /// 远端资源地址查询服务类 /// private class RemoteServices : IRemoteServices { private readonly string _defaultHostServer; private readonly string _fallbackHostServer; public RemoteServices(string defaultHostServer, string fallbackHostServer) { _defaultHostServer = defaultHostServer; _fallbackHostServer = fallbackHostServer; } string IRemoteServices.GetRemoteMainURL(string fileName) { return $"{_defaultHostServer}/{fileName}"; } string IRemoteServices.GetRemoteFallbackURL(string fileName) { return $"{_fallbackHostServer}/{fileName}"; } } }