using System; using System.Collections; // using UniFramework.Event; using UnityEngine; using YooAsset; public class Init : MonoBehaviour { /// /// 资源系统运行模式 /// public EPlayMode PlayMode = EPlayMode.EditorSimulateMode; public string PackageName = "DefaultPackage"; public string SceneName; void Awake() { Debug.Log($"资源系统运行模式:{PlayMode}"); Application.targetFrameRate = 60; Application.runInBackground = true; DontDestroyOnLoad(this.gameObject); } IEnumerator Start() { // 游戏管理器 // GameManager.Instance.Behaviour = this; // // // 初始化事件系统 // UniEvent.Initalize(); // 初始化资源系统 YooAssets.Initialize(); // 加载更新页面 var go = Resources.Load("PatchWindow"); GameObject.Instantiate(go); // 开始补丁更新流程 // var operation = new PatchOperation("DefaultPackage", PlayMode); // YooAssets.StartOperation(operation); yield return InitPackage(); // 设置默认的资源包 var gamePackage = YooAssets.GetPackage("DefaultPackage"); YooAssets.SetDefaultPackage(gamePackage); // 切换到主页面场景 // SceneEventDefine.ChangeToHomeScene.SendEventMessage(); YooAssets.LoadSceneSync(SceneName); } private void Update() { if (Input.GetKeyDown(KeyCode.A)) { YooAssets.LoadSceneSync(SceneName); } } #region FsmInitializePackage private IEnumerator InitPackage() { // 创建资源包裹类 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) { #if UNITY_WEBGL && WEIXINMINIGAME && !UNITY_EDITOR var createParameters = new WebPlayModeParameters(); string defaultHostServer = GetHostServerURL(); string fallbackHostServer = GetHostServerURL(); 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) { Debug.LogWarning($"{initializationOperation.Error}"); // PatchEventDefine.InitializeFailed.SendEventMessage(); } else { // _machine.ChangeState(); yield return StartCoroutine(UpdatePackageVersion()); } } /// /// 获取资源服务器地址 /// 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}"; } } #endregion #region FsmRequestPackageVersion private IEnumerator UpdatePackageVersion() { var package = YooAssets.GetPackage(PackageName); var operation = package.RequestPackageVersionAsync(); yield return operation; if (operation.Status != EOperationStatus.Succeed) { Debug.LogWarning(operation.Error); // PatchEventDefine.PackageVersionRequestFailed.SendEventMessage(); } else { Debug.Log($"Request package version : {operation.PackageVersion}"); // _machine.SetBlackboardValue("PackageVersion", operation.PackageVersion); // _machine.ChangeState(); packageVersion = operation.PackageVersion; yield return StartCoroutine(UpdateManifest()); } } string packageVersion; #endregion #region FsmUpdatePackageManifest private IEnumerator UpdateManifest() { var package = YooAssets.GetPackage(PackageName); var operation = package.UpdatePackageManifestAsync(packageVersion); yield return operation; if (operation.Status != EOperationStatus.Succeed) { Debug.LogWarning(operation.Error); // PatchEventDefine.PackageManifestUpdateFailed.SendEventMessage(); yield break; } else { // _machine.ChangeState(); } } #endregion }