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;
}
}
}