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; void IStateNode.OnCreate(StateMachine machine) { _machine = machine; } void IStateNode.OnEnter() { PatchEventDefine.PatchStepsChange.SendEventMessage("初始化资源包!"); GameManager.Instance.StartCoroutine(InitPackage()); } void IStateNode.OnUpdate() { } void IStateNode.OnExit() { } private IEnumerator InitPackage() { var playMode = (EPlayMode)_machine.GetBlackboardValue("PlayMode"); var packageName = (string)_machine.GetBlackboardValue("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) { string defaultHostServer = GetHostServerURL(); string fallbackHostServer = GetHostServerURL(); IRemoteServices remoteServices = new RemoteServices(defaultHostServer, fallbackHostServer); var createParameters = new HostPlayModeParameters(); createParameters.BuildinFileSystemParameters = FileSystemParameters.CreateDefaultBuildinFileSystemParameters(); createParameters.CacheFileSystemParameters = FileSystemParameters.CreateDefaultCacheFileSystemParameters(remoteServices); initializationOperation = package.InitializeAsync(createParameters); } // WebGL运行模式 if (playMode == EPlayMode.WebPlayMode) { var createParameters = new WebPlayModeParameters(); #if UNITY_WEBGL && WEIXINMINIGAME && !UNITY_EDITOR string defaultHostServer = GetHostServerURL(); string fallbackHostServer = GetHostServerURL(); IRemoteServices remoteServices = new RemoteServices(defaultHostServer, fallbackHostServer); createParameters.WebServerFileSystemParameters = WechatFileSystemCreater.CreateWechatFileSystemParameters(remoteServices); #else createParameters.WebServerFileSystemParameters = FileSystemParameters.CreateDefaultWebServerFileSystemParameters(); #endif initializationOperation = package.InitializeAsync(createParameters); } yield return initializationOperation; // 如果初始化失败弹出提示界面 if (initializationOperation.Status != EOperationStatus.Succeed) { Debug.LogWarning($"{initializationOperation.Error}"); PatchEventDefine.InitializeFailed.SendEventMessage(); } else { _machine.ChangeState(); } } /// /// 获取资源服务器地址 /// private string GetHostServerURL() { //string hostServerIP = "http://10.0.2.2"; //安卓模拟器地址 string hostServerIP = "http://127.0.0.1"; string appVersion = "v1.0"; #if UNITY_EDITOR if (UnityEditor.EditorUserBuildSettings.activeBuildTarget == UnityEditor.BuildTarget.Android) return $"{hostServerIP}/CDN/Android/{appVersion}"; else if (UnityEditor.EditorUserBuildSettings.activeBuildTarget == UnityEditor.BuildTarget.iOS) return $"{hostServerIP}/CDN/IPhone/{appVersion}"; else if (UnityEditor.EditorUserBuildSettings.activeBuildTarget == UnityEditor.BuildTarget.WebGL) return $"{hostServerIP}/CDN/WebGL/{appVersion}"; else return $"{hostServerIP}/CDN/PC/{appVersion}"; #else if (Application.platform == RuntimePlatform.Android) return $"{hostServerIP}/CDN/Android/{appVersion}"; else if (Application.platform == RuntimePlatform.IPhonePlayer) return $"{hostServerIP}/CDN/IPhone/{appVersion}"; else if (Application.platform == RuntimePlatform.WebGLPlayer) return $"{hostServerIP}/CDN/WebGL/{appVersion}"; else return $"{hostServerIP}/CDN/PC/{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}"; } } }