using Cysharp.Threading.Tasks;
using System;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.SceneManagement;
using YooAsset;
namespace ET
{
public static class YooAssetProxy
{
public enum YooAssetResType
{
Unit,
Config,
DataConfig,
SkillConfig,
Scene,
Code,
Effect,
Shader,
Material,
Sound,
PathFind,
}
#region 路径相关
///
/// 获取YooAsset能识别的资源名
///
///
public static string GetYooAssetFormatResPath(string rawResName, YooAssetResType yooAssetResType)
{
return $"{yooAssetResType}_{rawResName}";
}
#endregion
#region Extension
public static T GetAsset(this AssetOperationHandle assetOperationHandle)
where T : UnityEngine.Object
{
return assetOperationHandle.GetAssetObject();
}
public static T GetSubAsset(this SubAssetsOperationHandle assetOperationHandle, string subAssetName)
where T : UnityEngine.Object
{
return assetOperationHandle.GetSubAssetObject(subAssetName);
}
public static byte[] GetRawBytes(this RawFileOperation rawFileOperation)
{
return rawFileOperation.LoadFileData();
}
public static string GetRawString(this RawFileOperation rawFileOperation)
{
return rawFileOperation.LoadFileText();
}
#endregion
#region API
public static async UniTask LoadAssetAsync(string path) where T : UnityEngine.Object
{
AssetOperationHandle assetOperationHandle = YooAssets.LoadAssetAsync(path);
await assetOperationHandle.ToUniTask();
return assetOperationHandle;
}
public static async UniTask LoadSubAssetsAsync(string mainAssetPath, string subAssetName)
where T : UnityEngine.Object
{
SubAssetsOperationHandle subAssetsOperationHandle = YooAssets.LoadSubAssetsAsync(mainAssetPath);
await subAssetsOperationHandle.ToUniTask();
return subAssetsOperationHandle;
}
public static async UniTask LoadSceneAsync(string scenePath,
LoadSceneMode loadSceneMode = LoadSceneMode.Single)
{
SceneOperationHandle sceneOperationHandle = YooAssets.LoadSceneAsync(scenePath, loadSceneMode, true);
await sceneOperationHandle.ToUniTask();
return sceneOperationHandle;
}
public static async UniTask GetRawFileAsync(string path)
{
RawFileOperation rawFileOperation = YooAssets.GetRawFileAsync(path);
await rawFileOperation.ToUniTask();
return rawFileOperation;
}
public static void UnloadUnusedAssets()
{
YooAssets.UnloadUnusedAssets();
}
public static List GetAssetPathsByTag(string tag)
{
AssetInfo[] assetInfos = YooAssets.GetAssetInfos(tag);
List result = new List(16);
foreach (var assetInfo in assetInfos)
{
result.Add(assetInfo.Address);
}
return result;
}
public static void InitHostCallbacks(Action onStateUpdate,
Action onDownLoadProgressUpdate)
{
PatchUpdater.InitCallback(onStateUpdate, onDownLoadProgressUpdate);
}
public static UniTask StartYooAssetEngine(YooAssets.EPlayMode playMode)
{
UniTaskCompletionSource uniTaskCompletionSource = new UniTaskCompletionSource();
// 编辑器下的模拟模式
if (playMode == YooAssets.EPlayMode.EditorSimulateMode)
{
var createParameters = new YooAssets.EditorSimulateModeParameters();
createParameters.LocationServices = new AddressLocationServices();
YooAssets.InitializeAsync(createParameters).Completed += _ => { uniTaskCompletionSource.TrySetResult(); };
}
// 单机运行模式
if (playMode == YooAssets.EPlayMode.OfflinePlayMode)
{
var createParameters = new YooAssets.OfflinePlayModeParameters();
createParameters.LocationServices = new AddressLocationServices();
YooAssets.InitializeAsync(createParameters).Completed += _ => { uniTaskCompletionSource.TrySetResult(); };
}
// 联机运行模式
if (playMode == YooAssets.EPlayMode.HostPlayMode)
{
var globalConfig = Resources.Load("GlobalConfig");
var createParameters = new YooAssets.HostPlayModeParameters();
createParameters.LocationServices = new AddressLocationServices();
createParameters.DecryptionServices = null;
createParameters.ClearCacheWhenDirty = false;
var hostServer = GetHostServerURL();
createParameters.DefaultHostServer = hostServer;
//作为DefaultHostServer的备份
createParameters.FallbackHostServer = hostServer;
//设置大于1Mb的资源支持断点续传
createParameters.BreakpointResumeFileSize = 1 * 1014 * 1024;
string GetHostServerURL()
{
string hostServerIP = globalConfig.HotfixResUrl;
string gameVersion = globalConfig.Version;
#if UNITY_EDITOR
if (UnityEditor.EditorUserBuildSettings.activeBuildTarget == UnityEditor.BuildTarget.Android)
return $"{hostServerIP}/android/{gameVersion}";
else if (UnityEditor.EditorUserBuildSettings.activeBuildTarget == UnityEditor.BuildTarget.iOS)
return $"{hostServerIP}/ios/{gameVersion}";
else if (UnityEditor.EditorUserBuildSettings.activeBuildTarget == UnityEditor.BuildTarget.WebGL)
return $"{hostServerIP}/web/{gameVersion}";
else
return $"{hostServerIP}/pc/{gameVersion}";
#else
if (Application.platform == RuntimePlatform.Android)
return $"{hostServerIP}/android/{gameVersion}";
else if (Application.platform == RuntimePlatform.IPhonePlayer)
return $"{hostServerIP}/ios/{gameVersion}";
else if (Application.platform == RuntimePlatform.WebGLPlayer)
return $"{hostServerIP}/web/{gameVersion}";
else
return $"{hostServerIP}/pc/{gameVersion}";
#endif
}
// 如果是资源热更模式,则需要等待热更完毕后再Invoke回调
YooAssets.InitializeAsync(createParameters).Completed += _ =>
{
// 运行补丁流程
PatchUpdater.Run(uniTaskCompletionSource);
};
}
return uniTaskCompletionSource.Task;
}
#endregion
}
}