using System; using System.Collections.Generic; using System.IO; using UnityEngine; using YooAsset; namespace ET { /// /// 资源文件查询服务类 /// public class GameQueryServices : IQueryServices { public bool QueryStreamingAssets(string packageName, string fileName) { // 注意:fileName包含文件格式 string filePath = Path.Combine(YooAssetSettings.DefaultYooFolderName, packageName, fileName); return BetterStreamingAssets.FileExists(filePath); } } /// /// 远端资源地址查询服务类 /// public 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}"; } } public class ResourcesComponent: Singleton, ISingletonAwake { public void Awake() { YooAssets.Initialize(); BetterStreamingAssets.Initialize(); } protected override void Destroy() { YooAssets.Destroy(); } public async ETTask CreatePackageAsync(string packageName, bool isDefault = false) { ResourcePackage package = YooAssets.CreatePackage(packageName); if (isDefault) { YooAssets.SetDefaultPackage(package); } GlobalConfig globalConfig = Resources.Load("GlobalConfig"); EPlayMode ePlayMode = globalConfig.EPlayMode; // 编辑器下的模拟模式 switch (ePlayMode) { case EPlayMode.EditorSimulateMode: { EditorSimulateModeParameters createParameters = new(); createParameters.SimulateManifestFilePath = EditorSimulateModeHelper.SimulateBuild(packageName); await package.InitializeAsync(createParameters).Task; break; } case EPlayMode.OfflinePlayMode: { OfflinePlayModeParameters createParameters = new(); await package.InitializeAsync(createParameters).Task; break; } case EPlayMode.HostPlayMode: { string defaultHostServer = GetHostServerURL(); string fallbackHostServer = GetHostServerURL(); HostPlayModeParameters createParameters = new(); createParameters.QueryServices = new GameQueryServices(); createParameters.RemoteServices = new RemoteServices(defaultHostServer, fallbackHostServer); await package.InitializeAsync(createParameters).Task; break; } default: throw new ArgumentOutOfRangeException(); } return; 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 } } public void DestroyPackage(string packageName) { ResourcePackage package = YooAssets.GetPackage(packageName); package.UnloadUnusedAssets(); } /// /// 主要用来加载dll config aotdll,因为这时候纤程还没创建,无法使用ResourcesLoaderComponent。 /// 游戏中的资源应该使用ResourcesLoaderComponent来加载 /// public async ETTask LoadAssetAsync(string location) where T: UnityEngine.Object { AssetOperationHandle handle = YooAssets.LoadAssetAsync(location); await handle.Task; T t = (T)handle.AssetObject; handle.Release(); return t; } /// /// 主要用来加载dll config aotdll,因为这时候纤程还没创建,无法使用ResourcesLoaderComponent。 /// 游戏中的资源应该使用ResourcesLoaderComponent来加载 /// public async ETTask> LoadAllAssetsAsync(string location) where T: UnityEngine.Object { AllAssetsOperationHandle allAssetsOperationHandle = YooAssets.LoadAllAssetsAsync(location); await allAssetsOperationHandle.Task; Dictionary dictionary = new Dictionary(); foreach(UnityEngine.Object assetObj in allAssetsOperationHandle.AllAssetObjects) { T t = assetObj as T; dictionary.Add(t.name, t); } allAssetsOperationHandle.Release(); return dictionary; } } }