11111
This commit is contained in:
@@ -0,0 +1,19 @@
|
||||
using Main;
|
||||
|
||||
namespace Stary.Evo
|
||||
{
|
||||
public class FsmLoadSystem : FsmSystemAsync , IFsmSystemAsync
|
||||
{
|
||||
private OpenDomainType OpenDomainType { get; set; }
|
||||
|
||||
public ProgressBarPanel ProgressBarPanel { get; set; }
|
||||
public void SetOpenDomainType(OpenDomainType type)
|
||||
{
|
||||
this.OpenDomainType = type;
|
||||
}
|
||||
public OpenDomainType GetOpenDomainType()
|
||||
{
|
||||
return this.OpenDomainType;
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,3 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 1f012ae5832b467a802b8d775b1dae1e
|
||||
timeCreated: 1744710396
|
||||
323
Assets/00.StaryEvoTools/Runtime/HybridLoad/Fsm/HotFixState.cs
Normal file
323
Assets/00.StaryEvoTools/Runtime/HybridLoad/Fsm/HotFixState.cs
Normal file
@@ -0,0 +1,323 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using System.Reflection;
|
||||
using Cysharp.Threading.Tasks;
|
||||
using HybridCLR;
|
||||
using UnityEngine;
|
||||
using YooAsset;
|
||||
|
||||
namespace Stary.Evo
|
||||
{
|
||||
public class HotFixState : AbstractFSMIStateAsync
|
||||
{
|
||||
public string[] PatchedAOTAssemblyList =
|
||||
{
|
||||
"System.Core.dll",
|
||||
"UnityEngine.CoreModule.dll",
|
||||
"mscorlib.dll",
|
||||
"DOTween.dll",
|
||||
"InformationSave.RunTime.dll",
|
||||
"UIFarme.RunTime.dll",
|
||||
"UniTask.dll",
|
||||
"YooAsset.dll",
|
||||
"com.stary.evo.runtime.dll"
|
||||
};
|
||||
|
||||
public HotFixState(IFsmSystemAsync system) : base(system)
|
||||
{
|
||||
}
|
||||
|
||||
public override async UniTask OnEnterAsync<T>(T param)
|
||||
{
|
||||
var domainConfig = param as DomainConfig;
|
||||
Debug.Log("UnityEvo:热更脚本...");
|
||||
var package = YooAssets.GetPackage(AppConfig.PackageDomainName);
|
||||
// Editor环境下,HotUpdate.dll.bytes已经被自动加载,不需要加载,重复加载反而会出问题。
|
||||
|
||||
|
||||
// 添加类型存在性检查
|
||||
var fullClassName = $"{domainConfig.@namespace}.{domainConfig.className}";
|
||||
|
||||
#if EDITOR_SIMULATEMODE
|
||||
// Editor下无需加载,直接查找获得HotUpdate程序集
|
||||
Assembly hotUpdateAss = System.AppDomain.CurrentDomain.GetAssemblies()
|
||||
.First(a => a.GetName().Name == $"HotUpdate_{AppConfig.PackageDomainName}");
|
||||
#else
|
||||
var hotUpdateAssemblyName = $"HotUpdate_{AppConfig.PackageDomainName}";
|
||||
|
||||
|
||||
var assemblyType = IsAssetLoaded(fullClassName);
|
||||
if (assemblyType != null)
|
||||
{
|
||||
Debug.Log($"UnityEvo:热更程序集:{hotUpdateAssemblyName} 已经加载过了");
|
||||
FsmSystem.SetCurState(nameof(LoadResState), domainConfig, assemblyType);
|
||||
return;
|
||||
}
|
||||
|
||||
|
||||
//判断DLL是否下载成功
|
||||
foreach (var aot in PatchedAOTAssemblyList)
|
||||
{
|
||||
var aotName = $"Android_{aot}";
|
||||
var handle = package.LoadAssetAsync<TextAsset>(aotName);
|
||||
await handle;
|
||||
if (handle.Status == EOperationStatus.Succeed)
|
||||
{
|
||||
var assetObj = handle.AssetObject as TextAsset;
|
||||
_sAssetDatas.Add(assetObj);
|
||||
Debug.Log($"UnityEvo:dll:{aotName} ,下载成功");
|
||||
}
|
||||
else
|
||||
{
|
||||
Debug.Log($"UnityEvo:dll:{aotName} ,下载失败");
|
||||
}
|
||||
}
|
||||
|
||||
//先补元数据
|
||||
LoadMetadataForAOTAssemblies();
|
||||
|
||||
// 加载热更dll
|
||||
var hotfixDll = package.LoadAssetAsync<TextAsset>($"Android_HotUpdate_{AppConfig.PackageDomainName}.dll");
|
||||
await hotfixDll;
|
||||
var hotfixPdb = package.LoadAssetAsync<TextAsset>($"Android_HotUpdate_{AppConfig.PackageDomainName}.pdb");
|
||||
await hotfixPdb;
|
||||
Assembly hotUpdateAss = null;
|
||||
if (hotfixDll.Status == EOperationStatus.Succeed)
|
||||
{
|
||||
Debug.Log("UnityEvo:hotfixDll读取成功!!");
|
||||
var hotfixDllAsset = hotfixDll.AssetObject as TextAsset;
|
||||
if (hotfixPdb.Status == EOperationStatus.Succeed)
|
||||
{
|
||||
Debug.Log("UnityEvo:hotfixPdb:读取成功!!");
|
||||
var hotfixPdbAsset = hotfixPdb.AssetObject as TextAsset;
|
||||
if (hotfixPdbAsset != null)
|
||||
{
|
||||
Debug.Log("UnityEvo:开始加载DLL和PDB...");
|
||||
try
|
||||
{
|
||||
// 分步骤验证字节数组有效性
|
||||
if (hotfixDllAsset.bytes == null || hotfixDllAsset.bytes.Length == 0)
|
||||
{
|
||||
Debug.LogError("UnityEvo:热更DLL字节数组为空!");
|
||||
return;
|
||||
}
|
||||
|
||||
if (hotfixPdbAsset.bytes == null || hotfixPdbAsset.bytes.Length == 0)
|
||||
{
|
||||
Debug.LogWarning("UnityEvo:PDB字节数组为空,尝试仅加载DLL...");
|
||||
hotUpdateAss = Assembly.Load(hotfixDllAsset.bytes);
|
||||
}
|
||||
else
|
||||
{
|
||||
// 尝试加载DLL和PDB
|
||||
hotUpdateAss = Assembly.Load(hotfixDllAsset.bytes, hotfixPdbAsset.bytes);
|
||||
}
|
||||
|
||||
Debug.Log(
|
||||
$"UnityEvo:Assembly加载成功,大小:DLL={hotfixDllAsset.bytes.Length} bytes, PDB={hotfixPdbAsset.bytes.Length} bytes");
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
Debug.LogError($"UnityEvo:Assembly加载异常: {ex}");
|
||||
// 尝试仅加载DLL作为备选方案
|
||||
try
|
||||
{
|
||||
Debug.Log("UnityEvo:尝试仅加载DLL...");
|
||||
hotUpdateAss = Assembly.Load(hotfixDllAsset.bytes);
|
||||
}
|
||||
catch (Exception ex2)
|
||||
{
|
||||
Debug.LogError($"UnityEvo:仅加载DLL也失败: {ex2}");
|
||||
return;
|
||||
}
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
Debug.LogError("UnityEvo:hotfixPdb: AssetObject为空!!");
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
if (hotfixDllAsset != null)
|
||||
try
|
||||
{
|
||||
Debug.Log("UnityEvo:开始加载DLL...");
|
||||
// 分步骤验证字节数组有效性
|
||||
if (hotfixDllAsset.bytes == null || hotfixDllAsset.bytes.Length == 0)
|
||||
{
|
||||
Debug.LogError("UnityEvo:热更DLL字节数组为空!");
|
||||
return;
|
||||
}
|
||||
|
||||
hotUpdateAss = Assembly.Load(hotfixDllAsset.bytes);
|
||||
Debug.Log(
|
||||
$"UnityEvo:Assembly加载成功,大小:DLL={hotfixDllAsset.bytes.Length} bytes");
|
||||
}
|
||||
catch (Exception e)
|
||||
{
|
||||
Debug.LogError($"UnityEvo:Assembly加载异常: {e}");
|
||||
}
|
||||
|
||||
else
|
||||
Debug.LogError("UnityEvo:hotfixDll: AssetObject为空!!");
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
Debug.LogError($"UnityEvo:Android_HotUpdate_{AppConfig.PackageDomainName}.dll加载失败!!!!!");
|
||||
}
|
||||
|
||||
|
||||
#endif
|
||||
Debug.Log($"UnityEvo:dll: Assembly.Load加载后是否为空:{hotUpdateAss == null}");
|
||||
if (hotUpdateAss != null)
|
||||
{
|
||||
var type = hotUpdateAss.GetType(fullClassName);
|
||||
|
||||
if (type == null)
|
||||
{
|
||||
Debug.LogError($"UnityEvo:热更类不存在!程序集: {hotUpdateAss.FullName}\n" +
|
||||
$"期望类名: {fullClassName}\n" +
|
||||
$"可用类型列表:{string.Join("\n", hotUpdateAss.GetTypes().Select(t => t.FullName))}");
|
||||
return;
|
||||
}
|
||||
|
||||
// 添加方法存在性检查
|
||||
Debug.Log("UnityEvo:dll:开始MethodInfo检查!!");
|
||||
var onEnterMethod = type.GetMethod("OnEnter");
|
||||
var onEnterAsyncMethod = type.GetMethod("OnEnterAsync");
|
||||
if (onEnterMethod == null || onEnterAsyncMethod == null)
|
||||
{
|
||||
Debug.LogError("UnityEvo:热更类进入方法缺失!\n" +
|
||||
$"存在方法:{string.Join(", ", type.GetMethods().Select(m => m.Name))}");
|
||||
return;
|
||||
}
|
||||
|
||||
Debug.Log("UnityEvo:dll:OnEnter检查成功!!");
|
||||
var onExitMethod = type.GetMethod("OnExit");
|
||||
var onExitAsyncMethod = type.GetMethod("OnExitAsync");
|
||||
if (onExitMethod == null || onExitAsyncMethod == null)
|
||||
{
|
||||
Debug.LogError("UnityEvo:热更类退出方法缺失!\n" +
|
||||
$"存在方法:{string.Join(", ", type.GetMethods().Select(m => m.Name))}");
|
||||
return;
|
||||
}
|
||||
|
||||
Debug.Log("UnityEvo:dll:OnExit检查成功!!");
|
||||
// AppConfig.SetDefaultHotfixType(type);
|
||||
FsmSystem.SetCurState(nameof(LoadResState), domainConfig, type);
|
||||
// // 创建热更类实例
|
||||
// DomainBase hotfixInstance = AppConfig.HOTFIXBASE.AddComponent(type) as DomainBase;
|
||||
//
|
||||
// if (hotfixInstance == null)
|
||||
// {
|
||||
// Debug.LogError($"热更类{fullClassName}实例创建失败!必须继承MonoBehaviour");
|
||||
// return;
|
||||
// }
|
||||
//
|
||||
//
|
||||
// // 原有调用逻辑修改为使用实例
|
||||
// onEnterMethod.Invoke(hotfixInstance, new object[] { "" }); // 第一个参数改为实例对象
|
||||
// onEnterAsyncMethod.Invoke(hotfixInstance, new object[] { "" });
|
||||
}
|
||||
else
|
||||
{
|
||||
Debug.LogError("UnityEvo:热更类不存在!程序集: hotUpdateAss 不存在\n" +
|
||||
$"期望类名: {fullClassName}\n" +
|
||||
$"可用类型列表:{string.Join("\n", hotUpdateAss.GetTypes().Select(t => t.FullName))}");
|
||||
}
|
||||
}
|
||||
|
||||
public override UniTask OnEnterAsync()
|
||||
{
|
||||
return UniTask.CompletedTask;
|
||||
}
|
||||
|
||||
public override UniTask OnEnterAsync<T1, T2>(T1 param1, T2 param2)
|
||||
{
|
||||
return UniTask.CompletedTask;
|
||||
}
|
||||
|
||||
private Type IsAssetLoaded(string assemblyName)
|
||||
{
|
||||
var assemblies = AppDomain.CurrentDomain.GetAssemblies();
|
||||
foreach (var assembly in assemblies)
|
||||
{
|
||||
var assemblyType = assembly.GetType(assemblyName);
|
||||
if (assemblyType != null)
|
||||
{
|
||||
Debug.Log("type:" + assemblyType);
|
||||
return assemblyType;
|
||||
}
|
||||
}
|
||||
|
||||
return null;
|
||||
}
|
||||
|
||||
public override void OnUpdate()
|
||||
{
|
||||
base.OnUpdate();
|
||||
}
|
||||
|
||||
public override UniTask OnExitAsync()
|
||||
{
|
||||
_sAssetDatas.Clear();
|
||||
return UniTask.CompletedTask;
|
||||
}
|
||||
|
||||
#region 补充元数据
|
||||
|
||||
// //补充元数据dll的列表
|
||||
// //通过RuntimeApi.LoadMetadataForAOTAssembly()函数来补充AOT泛型的原始元数据
|
||||
// private List<string> AOTMetaAssemblyFiles { get; } =new()
|
||||
// {
|
||||
// "Android_mscorlib.dll", "Android_System.dll", "Android_System.Core.dll",
|
||||
// };
|
||||
|
||||
private readonly List<TextAsset> _sAssetDatas = new();
|
||||
|
||||
|
||||
// public byte[] ReadBytesFromStreamingAssets(string dllName)
|
||||
// {
|
||||
// if (_sAssetDatas.ContainsKey(dllName))
|
||||
// {
|
||||
// return _sAssetDatas[dllName].bytes;
|
||||
// }
|
||||
//
|
||||
// return Array.Empty<byte>();
|
||||
// }
|
||||
|
||||
|
||||
/// <summary>
|
||||
/// 为aot assembly加载原始metadata, 这个代码放aot或者热更新都行。
|
||||
/// 一旦加载后,如果AOT泛型函数对应native实现不存在,则自动替换为解释模式执行
|
||||
/// </summary>
|
||||
private void LoadMetadataForAOTAssemblies()
|
||||
{
|
||||
var mode = HomologousImageMode.SuperSet;
|
||||
// foreach (var aotDllName in AOTGenericReferences.PatchedAOTAssemblyList)
|
||||
foreach (var aotDll in _sAssetDatas)
|
||||
// var aotName = $"Android_{aotDllName}";
|
||||
//
|
||||
// byte[] dllBytes = ReadBytesFromStreamingAssets(aotName);
|
||||
if (aotDll != null)
|
||||
{
|
||||
var dllBytes = aotDll.bytes;
|
||||
// 添加元数据加载校验
|
||||
if (dllBytes == null || dllBytes.Length == 0)
|
||||
{
|
||||
Debug.LogError($"AOT元数据加载失败:{aotDll.name}");
|
||||
continue;
|
||||
}
|
||||
|
||||
var err = RuntimeApi.LoadMetadataForAOTAssembly(dllBytes, mode);
|
||||
|
||||
Debug.Log($"UnityEvo:【补元】{aotDll.name} 加载结果: {err} 字节数: {dllBytes.Length}");
|
||||
}
|
||||
}
|
||||
|
||||
#endregion
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,3 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 693e2ecffc1b43caa7c7818e3aba708c
|
||||
timeCreated: 1741165298
|
||||
176
Assets/00.StaryEvoTools/Runtime/HybridLoad/Fsm/LoadResState.cs
Normal file
176
Assets/00.StaryEvoTools/Runtime/HybridLoad/Fsm/LoadResState.cs
Normal file
@@ -0,0 +1,176 @@
|
||||
using System;
|
||||
using Cysharp.Threading.Tasks;
|
||||
using Immersal.AR;
|
||||
using Stary.Evo;
|
||||
using Stary.Evo.InformationSave;
|
||||
using UnityEngine;
|
||||
using UnityEngine.SceneManagement;
|
||||
using YooAsset;
|
||||
|
||||
namespace Stary.Evo
|
||||
{
|
||||
public class LoadResState : AbstractFSMIStateAsync
|
||||
{
|
||||
private DomainConfig.LoadResType loadResType;
|
||||
public GameObject mainPrefab;
|
||||
private DomainConfig domainConfig;
|
||||
public LoadResState(IFsmSystemAsync system) : base(system)
|
||||
{
|
||||
}
|
||||
|
||||
|
||||
public override UniTask OnEnterAsync()
|
||||
{
|
||||
return UniTask.CompletedTask;
|
||||
}
|
||||
|
||||
public override UniTask OnEnterAsync<T>(T param)
|
||||
{
|
||||
return UniTask.CompletedTask;
|
||||
}
|
||||
|
||||
public override async UniTask OnEnterAsync<T1, T2>(T1 param1, T2 param2)
|
||||
{
|
||||
Debug.Log("加载资源...");
|
||||
domainConfig = param1 as DomainConfig;
|
||||
loadResType = domainConfig.loadResType;
|
||||
Type type = param2 as Type;
|
||||
var package = YooAssets.GetPackage(domainConfig.domain);
|
||||
if (loadResType == DomainConfig.LoadResType.Prefab)
|
||||
{
|
||||
// 加载热更资源
|
||||
var loadOperation = package.LoadAssetAsync<GameObject>(domainConfig.mainPrefab);
|
||||
|
||||
await loadOperation;
|
||||
if (loadOperation.Status == EOperationStatus.Succeed)
|
||||
{
|
||||
ARSpace arSpace = GameObject.FindObjectOfType<ARSpace>();
|
||||
if (arSpace != null)
|
||||
{
|
||||
Debug.Log("UnityEvo:找到ARSpace,开始加载点云运行环境...");
|
||||
mainPrefab = loadOperation.InstantiateSync(arSpace.transform);
|
||||
}
|
||||
else
|
||||
{
|
||||
Debug.Log("UnityEvo:未找到ARSpace,开始加载普通运行环境,通过语音唤醒...");
|
||||
mainPrefab = loadOperation.InstantiateSync();
|
||||
}
|
||||
if(domainConfig.domain =="Main")
|
||||
AppConfig.SetDefaultMainInstance(mainPrefab);
|
||||
}
|
||||
}
|
||||
else if (loadResType == DomainConfig.LoadResType.Scene)
|
||||
{
|
||||
var sceneMode = domainConfig.loadSceneMode;
|
||||
var physicsMode = LocalPhysicsMode.None;
|
||||
SceneHandle handle = package.LoadSceneAsync(domainConfig.mainScene, sceneMode, physicsMode);
|
||||
await handle;
|
||||
mainPrefab = GameObject.Find(domainConfig.mainPrefab);
|
||||
}
|
||||
|
||||
LocalTransformInfo info = mainPrefab.GetOrAddComponent<LocalTransformInfo>();
|
||||
FsmLoadSystem fsmLoadSystem = FsmSystem as FsmLoadSystem;
|
||||
|
||||
if (info._list.Count >= 2)
|
||||
{
|
||||
if (fsmLoadSystem.GetOpenDomainType() == OpenDomainType.PointCloud)
|
||||
{
|
||||
info.Switch(1);
|
||||
}
|
||||
else if (fsmLoadSystem.GetOpenDomainType() == OpenDomainType.VIOICE)
|
||||
{
|
||||
info.Switch(0);
|
||||
}
|
||||
else if (fsmLoadSystem.GetOpenDomainType() == OpenDomainType.ImageTracked)
|
||||
{
|
||||
info.Switch(2);
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
Debug.LogError($"UnityEvo:{mainPrefab.name}的TransformInfo长度小于2,无法继续运行,请排查");
|
||||
}
|
||||
|
||||
if (mainPrefab != null)
|
||||
{
|
||||
DomainBase hotfixInstance = mainPrefab.GetComponent(type) as DomainBase;
|
||||
if (hotfixInstance == null)
|
||||
{
|
||||
hotfixInstance = mainPrefab.AddComponent(type) as DomainBase;
|
||||
}
|
||||
|
||||
hotfixInstance.DomainName = domainConfig.domain;
|
||||
if (hotfixInstance == null)
|
||||
{
|
||||
Debug.LogError($"热更类{type.Name}实例创建失败!必须继承MonoBehaviour");
|
||||
return;
|
||||
}
|
||||
|
||||
|
||||
// 原有调用逻辑修改为使用实例
|
||||
hotfixInstance.OnEnter("");
|
||||
hotfixInstance.OnEnterAsync("");
|
||||
}
|
||||
}
|
||||
|
||||
public override void OnUpdate()
|
||||
{
|
||||
base.OnUpdate();
|
||||
}
|
||||
|
||||
|
||||
public override async UniTask OnExitAsync()
|
||||
{
|
||||
Debug.Log("UnityEvo:Domain退出...");
|
||||
if (domainConfig.domain != "Main")
|
||||
{
|
||||
DomainBase domainBase = mainPrefab.GetComponent<DomainBase>();
|
||||
if (domainBase == null)
|
||||
{
|
||||
Debug.LogError($"UnityEvo:{mainPrefab.name}的DomainBase为空,无法退出,请排查");
|
||||
}
|
||||
else
|
||||
{
|
||||
domainBase.OnExit();
|
||||
await domainBase.OnExitAsync();
|
||||
}
|
||||
|
||||
if (loadResType == DomainConfig.LoadResType.Scene)
|
||||
{
|
||||
await SceneManager.UnloadSceneAsync("server");
|
||||
}
|
||||
|
||||
if (domainBase != null)
|
||||
{
|
||||
GameObject.Destroy(domainBase.gameObject);
|
||||
|
||||
await ForceUnloadAllAssets(domainBase.DomainName);
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
// 强制卸载所有资源包,该方法请在合适的时机调用。
|
||||
// 注意:Package在销毁的时候也会自动调用该方法。
|
||||
private async UniTask ForceUnloadAllAssets(string packageName)
|
||||
{
|
||||
var package = YooAssets.TryGetPackage(packageName);
|
||||
if (package != null)
|
||||
{
|
||||
var operation = package.UnloadAllAssetsAsync();
|
||||
await operation;
|
||||
await package.DestroyAsync();
|
||||
YooAssets.RemovePackage(packageName);
|
||||
|
||||
Resources.UnloadUnusedAssets();
|
||||
GC.Collect();
|
||||
GC.WaitForPendingFinalizers();
|
||||
Debug.Log($"UnityEvo:{packageName} 资源包已卸载...");
|
||||
}
|
||||
else
|
||||
{
|
||||
Debug.LogWarning($"UnityEvo:{packageName} 资源包不存在,请检查是否已经卸载还是卸载异常...");
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,3 @@
|
||||
fileFormatVersion: 2
|
||||
guid: f689e40cd4654793a8f1d3ce69ba3532
|
||||
timeCreated: 1741165763
|
||||
277
Assets/00.StaryEvoTools/Runtime/HybridLoad/Fsm/ResStartState.cs
Normal file
277
Assets/00.StaryEvoTools/Runtime/HybridLoad/Fsm/ResStartState.cs
Normal file
@@ -0,0 +1,277 @@
|
||||
using System;
|
||||
using System.IO;
|
||||
using Cysharp.Threading.Tasks;
|
||||
using Main;
|
||||
using Newtonsoft.Json;
|
||||
using Stary.Evo.UIFarme;
|
||||
using UnityEditor;
|
||||
using UnityEngine;
|
||||
using UnityEngine.Assertions;
|
||||
using UnityEngine.Networking;
|
||||
using YooAsset;
|
||||
using Object = UnityEngine.Object;
|
||||
|
||||
namespace Stary.Evo
|
||||
{
|
||||
public class ResStartState : AbstractFSMIStateAsync
|
||||
{
|
||||
public ResStartState(IFsmSystemAsync system) : base(system)
|
||||
{
|
||||
}
|
||||
|
||||
|
||||
public override async UniTask OnEnterAsync()
|
||||
{
|
||||
Debug.Log("UnityEvo:启动开始资源初始化...");
|
||||
|
||||
|
||||
//初始化读取资源配置表
|
||||
HotfixMainResDomain hotfixMainResDomain = Resources.Load<HotfixMainResDomain>("HotfixMainResDomain");
|
||||
if (hotfixMainResDomain != null)
|
||||
{
|
||||
AppConfig.IpConfig = hotfixMainResDomain.hotfixMainResDomainEntity.ipconfig;
|
||||
AppConfig.UserName = hotfixMainResDomain.hotfixMainResDomainEntity.username;
|
||||
AppConfig.PassWord = hotfixMainResDomain.hotfixMainResDomainEntity.password;
|
||||
AppConfig.ProductName =Application.identifier;
|
||||
AppConfig.MainDomainVersion = hotfixMainResDomain.hotfixMainResDomainEntity.mainDomainVersion;
|
||||
}
|
||||
|
||||
Debug.Log($"UnityEvo:读取资源配置表成功...{AppConfig.IpConfig}{AppConfig.UserName}{AppConfig.PassWord}");
|
||||
// 初始化资源系统
|
||||
YooAssets.Initialize();
|
||||
|
||||
|
||||
//自定义网络请求器
|
||||
// 设置自定义请求委托
|
||||
//YooAssets.SetDownloadSystemUnityWebRequest(NasWebRequester);
|
||||
|
||||
|
||||
//初始化资源加载模块
|
||||
// 增加包存在性检查
|
||||
var package = YooAssets.TryGetPackage(AppConfig.PackageDomainName);
|
||||
if (package == null)
|
||||
{
|
||||
Debug.LogWarning($"UnityEvo:资源包 {AppConfig.PackageDomainName} 不存在,正在尝试创建...");
|
||||
package = YooAssets.CreatePackage(AppConfig.PackageDomainName);
|
||||
}
|
||||
|
||||
YooAssets.SetDefaultPackage(package);
|
||||
|
||||
// 初始化资源包
|
||||
#if EDITOR_SIMULATEMODE
|
||||
await EDITOR_SIMULATEMODE(package);
|
||||
FsmSystem.SetCurState(nameof(ResUpdateServerState));
|
||||
#elif OFFLINE_PLAYMODE
|
||||
await OFFLINE_PLAYMODE(package);
|
||||
FsmSystem.SetCurState(nameof(ResUpdateLocalState));
|
||||
#elif HOST_PLAYMODE
|
||||
// if (package.PackageName.Equals("Main"))
|
||||
// {
|
||||
// await OFFLINE_PLAYMODE(package);
|
||||
// }
|
||||
// else
|
||||
// {
|
||||
//登录
|
||||
string url = AppConfig.IpConfig + "/Authentication/login";
|
||||
bool isLogin = await WebRequestSystem.Login(url, AppConfig.UserName, AppConfig.PassWord);
|
||||
if (isLogin)
|
||||
await HOST_PLAYMODE(package);
|
||||
else
|
||||
await Chche_PLAYMODE(package);
|
||||
// }
|
||||
|
||||
FsmSystem.SetCurState(nameof(ResUpdateLocalState));
|
||||
|
||||
#elif WEB_PLAYMODE
|
||||
// IRemoteServices remoteServices = new RemoteServices(defaultHostServer, fallbackHostServer);
|
||||
// var webServerFileSystemParams = FileSystemParameters.CreateDefaultWebServerFileSystemParameters();
|
||||
// var webRemoteFileSystemParams =
|
||||
// FileSystemParameters.CreateDefaultWebRemoteFileSystemParameters(remoteServices); //支持跨域下载
|
||||
//
|
||||
// var initParameters = new WebPlayModeParameters();
|
||||
// initParameters.WebServerFileSystemParameters = webServerFileSystemParams;
|
||||
// initParameters.WebRemoteFileSystemParameters = webRemoteFileSystemParams;
|
||||
//
|
||||
// var initOperation = package.InitializeAsync(initParameters);
|
||||
// await initOperation;
|
||||
//
|
||||
// if (initOperation.Status == EOperationStatus.Succeed)
|
||||
// Debug.Log("UnityEvo:资源包初始化成功!");
|
||||
// else
|
||||
// Debug.LogError($"UnityEvo:资源包初始化失败:{initOperation.Error}");
|
||||
|
||||
Debug.LogError($"UnityEvo:暂不支持");
|
||||
#endif
|
||||
}
|
||||
|
||||
public override UniTask OnEnterAsync<T>(T param)
|
||||
{
|
||||
return UniTask.CompletedTask;
|
||||
}
|
||||
|
||||
public override UniTask OnEnterAsync<T1, T2>(T1 param1, T2 param2)
|
||||
{
|
||||
return UniTask.CompletedTask;
|
||||
}
|
||||
|
||||
public override void OnUpdate()
|
||||
{
|
||||
base.OnUpdate();
|
||||
}
|
||||
|
||||
|
||||
public override UniTask OnExitAsync()
|
||||
{
|
||||
return UniTask.CompletedTask;
|
||||
}
|
||||
|
||||
private async UniTask EDITOR_SIMULATEMODE(ResourcePackage package)
|
||||
{
|
||||
var initParams=YooAssetFileSystem.EditorSimulateInitializeParameter();
|
||||
var initialization = package.InitializeAsync(initParams);
|
||||
await initialization;
|
||||
if (initialization.Status == EOperationStatus.Succeed)
|
||||
{
|
||||
Assert.AreEqual(EOperationStatus.Succeed, initialization.Status);
|
||||
Debug.Log("UnityEvo:资源包初始化成功!");
|
||||
}
|
||||
else
|
||||
{
|
||||
Debug.LogError($"UnityEvo:资源包初始化失败:{initialization.Error}");
|
||||
}
|
||||
}
|
||||
private async UniTask Chche_PLAYMODE(ResourcePackage package)
|
||||
{
|
||||
Debug.Log("UnityEvo:网络连接不通畅,切换缓存加载!");
|
||||
var initParams=YooAssetFileSystem.hostInitializeParameter();
|
||||
var initOperation = package.InitializeAsync(initParams);
|
||||
await initOperation;
|
||||
|
||||
var operation = package.RequestPackageVersionAsync();
|
||||
await operation;
|
||||
if (operation.Status == EOperationStatus.Succeed)
|
||||
{
|
||||
PlayerPrefs.SetString($"{AppConfig.PackageDomainName}_GAME_VERSION", operation.PackageVersion);
|
||||
Debug.Log("UnityEvo:从本地缓存中加载资源包,初始化获取版本号成功!");
|
||||
}else
|
||||
{
|
||||
Debug.LogError($"UnityEvo:从本地缓存中加载资源包,初始化获取版本号失败!");
|
||||
}
|
||||
|
||||
if (initOperation.Status == EOperationStatus.Succeed)
|
||||
Debug.Log("UnityEvo:从本地缓存中资源包,初始化成功!");
|
||||
else
|
||||
Debug.LogError($"UnityEvo:从本地缓存中资源包,初始化失败:{initOperation.Error}");
|
||||
}
|
||||
private async UniTask OFFLINE_PLAYMODE(ResourcePackage package)
|
||||
{
|
||||
var initParams=YooAssetFileSystem.OfflineInitializeParameter();
|
||||
var initOperation = package.InitializeAsync(initParams);
|
||||
await initOperation;
|
||||
|
||||
var operation = package.RequestPackageVersionAsync();
|
||||
await operation;
|
||||
if (operation.Status == EOperationStatus.Succeed)
|
||||
{
|
||||
PlayerPrefs.SetString($"{AppConfig.PackageDomainName}_GAME_VERSION", operation.PackageVersion);
|
||||
Debug.Log("UnityEvo:从本地加载资源包,初始化获取版本号成功!");
|
||||
}else
|
||||
{
|
||||
Debug.LogError($"UnityEvo:从本地加载资源包,初始化获取版本号失败!");
|
||||
}
|
||||
|
||||
if (initOperation.Status == EOperationStatus.Succeed)
|
||||
Debug.Log("UnityEvo:从本地加载资源包,初始化成功!");
|
||||
else
|
||||
Debug.LogError($"UnityEvo:从本地加载资源包,初始化失败:{initOperation.Error}");
|
||||
}
|
||||
|
||||
public async UniTask HOST_PLAYMODE(ResourcePackage package)
|
||||
{
|
||||
// 新增平台判断代码
|
||||
#if UNITY_EDITOR
|
||||
BuildTarget buildTarget = UnityEditor.EditorUserBuildSettings.activeBuildTarget;
|
||||
AppConfig.Platform = buildTarget.ToString();
|
||||
#else
|
||||
AppConfig.Platform = Application.platform.ToString();
|
||||
#endif
|
||||
Debug.Log($"目标平台标识: {AppConfig.Platform}");
|
||||
|
||||
// 请求资源版本
|
||||
string url = $"{AppConfig.IpConfig}/ResDomain/GetResDomainByDomain";
|
||||
var resDmainRequst = new ResDmainRequst()
|
||||
{
|
||||
ProductName = AppConfig.ProductName,
|
||||
DomainName = AppConfig.PackageDomainName,
|
||||
Platform = AppConfig.Platform,
|
||||
};
|
||||
//获取服务器版本
|
||||
var resDmainMessageEntity = await WebRequestSystem.Post(url, JsonConvert.SerializeObject(resDmainRequst));
|
||||
if (resDmainMessageEntity.code == 200)
|
||||
{
|
||||
ResDmainResponse resDmainResponse =
|
||||
JsonConvert.DeserializeObject<ResDmainResponse>(resDmainMessageEntity.data.ToString());
|
||||
//获取当前版本
|
||||
var oldVersion = PlayerPrefs.GetString($"{AppConfig.PackageDomainName}_GAME_VERSION");
|
||||
//版本不一致,开始下载
|
||||
if (resDmainResponse.PackageVersion != oldVersion)
|
||||
{
|
||||
await Download(resDmainResponse.DocumentFileId);
|
||||
PlayerPrefs.SetString($"{AppConfig.PackageDomainName}_GAME_VERSION",
|
||||
resDmainResponse.PackageVersion);
|
||||
}
|
||||
else //版本一致,加载缓存资源
|
||||
{
|
||||
Debug.Log($"UnityEvo:资源版本一致,自动跳过更新...");
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
Debug.LogError($"UnityEvo:获取资源版本失败: 【{resDmainMessageEntity.message}】");
|
||||
}
|
||||
|
||||
var initParams=YooAssetFileSystem.hostInitializeParameter();
|
||||
// initParameters.CacheFileSystemParameters = cacheFileSystemParams;
|
||||
|
||||
var initOperation = package.InitializeAsync(initParams);
|
||||
|
||||
await initOperation;
|
||||
|
||||
if (initOperation.Status == EOperationStatus.Succeed)
|
||||
Debug.Log("UnityEvo:从远程加载资源包,初始化成功!");
|
||||
else
|
||||
Debug.LogError($"UnityEvo:从远程加载资源包,初始化失败:{initOperation.Error}");
|
||||
}
|
||||
|
||||
public async UniTask Download(string fileId)
|
||||
{
|
||||
// 在任意MonoBehaviour或DomainBase派生类中
|
||||
string loadPath = $"{Application.persistentDataPath}/DownloadedContent/{AppConfig.PackageDomainName}";
|
||||
if (Directory.Exists(loadPath))
|
||||
{
|
||||
Directory.Delete(loadPath, true);
|
||||
}
|
||||
FsmLoadSystem loadSystem =FsmSystem as FsmLoadSystem;
|
||||
if (loadSystem.ProgressBarPanel == null)
|
||||
{
|
||||
loadSystem.ProgressBarPanel =Object.Instantiate(Resources.Load<GameObject>("ProgressBarPanel"),
|
||||
Camera.main.transform).GetOrAddComponent<ProgressBarPanel>();
|
||||
}
|
||||
await ZipTool.DownloadAndUnzipAsync(fileId, loadPath, DownLoadProgress, UnzipProgress);
|
||||
}
|
||||
|
||||
private void DownLoadProgress(float progress)
|
||||
{
|
||||
Debug.Log($"下载进度:{progress:P0}");
|
||||
FsmLoadSystem loadSystem =FsmSystem as FsmLoadSystem;
|
||||
loadSystem.ProgressBarPanel.SetProgressBarValue("下载中", progress);
|
||||
}
|
||||
|
||||
private void UnzipProgress(float progress)
|
||||
{
|
||||
Debug.Log($"解压进度:{progress:P0}");
|
||||
FsmLoadSystem loadSystem =FsmSystem as FsmLoadSystem;
|
||||
loadSystem.ProgressBarPanel.SetProgressBarValue("解压中", progress);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,3 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 2462c737fc9c4b53b35557f8a6aac453
|
||||
timeCreated: 1741165298
|
||||
@@ -0,0 +1,144 @@
|
||||
using Cysharp.Threading.Tasks;
|
||||
using UnityEngine;
|
||||
using UnityEngine.Assertions;
|
||||
using YooAsset;
|
||||
|
||||
namespace Stary.Evo
|
||||
{
|
||||
public class ResUpdateLocalState : AbstractFSMIStateAsync
|
||||
{
|
||||
public ResUpdateLocalState(IFsmSystemAsync system) : base(system)
|
||||
{
|
||||
}
|
||||
|
||||
|
||||
public override async UniTask OnEnterAsync()
|
||||
{
|
||||
//初始化读取资源配置表
|
||||
var package = YooAssets.GetPackage(AppConfig.PackageDomainName);
|
||||
|
||||
|
||||
//更新失败
|
||||
|
||||
Debug.Log($"UnityEvo:切换为加载本地缓存资源...");
|
||||
string packageVersion = "";
|
||||
if (package.PackageName.Equals("Main"))
|
||||
{
|
||||
var operation = package.RequestPackageVersionAsync();
|
||||
await operation;
|
||||
if (operation.Status == EOperationStatus.Succeed)
|
||||
{
|
||||
//更新成功
|
||||
packageVersion = operation.PackageVersion;
|
||||
Debug.Log($"Unity:【Main】Request package Version : {packageVersion}");
|
||||
}
|
||||
else
|
||||
{
|
||||
//更新失败
|
||||
Debug.LogError("Unity:【Main】" + operation.Error);
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
// 获取上次成功记录的版本
|
||||
packageVersion = PlayerPrefs.GetString($"{AppConfig.PackageDomainName}_GAME_VERSION", string.Empty);
|
||||
if (string.IsNullOrEmpty(packageVersion))
|
||||
{
|
||||
Debug.Log($"UnityEvo:没有找到本地版本记录,需要更新资源!");
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
Debug.Log($"UnityEvo:获取资源版本 Version : 【{packageVersion}】");
|
||||
Debug.Log($"UnityEvo:开始加载本地资源...");
|
||||
// Assert.AreEqual(EOperationStatus.Succeed, requetVersionOp.Status);
|
||||
|
||||
|
||||
// 加载本地缓存的资源清单文件
|
||||
var updateManifestOp = package.UpdatePackageManifestAsync(packageVersion);
|
||||
await updateManifestOp;
|
||||
if (updateManifestOp.Status == EOperationStatus.Succeed)
|
||||
{
|
||||
//更新成功
|
||||
Debug.Log($"UnityEvo:更新本地资源清单 updateManifest : 【成功】");
|
||||
}
|
||||
else
|
||||
{
|
||||
//更新失败
|
||||
Debug.LogError($"UnityEvo:加载本地资源清单文件失败,需要更新资源!: 【{updateManifestOp.Error}】");
|
||||
return;
|
||||
}
|
||||
|
||||
Assert.AreEqual(EOperationStatus.Succeed, updateManifestOp.Status);
|
||||
|
||||
|
||||
//4.下载补丁包
|
||||
await Download();
|
||||
|
||||
|
||||
//加载热更配置文件
|
||||
var loadHotfixSettingsOp = package.LoadAssetAsync<DomainConfig>("Config_DomainConfig");
|
||||
await loadHotfixSettingsOp;
|
||||
DomainConfig domainConfig = null;
|
||||
if (loadHotfixSettingsOp.Status == EOperationStatus.Succeed)
|
||||
{
|
||||
//更新成功
|
||||
Debug.Log($"UnityEvo:加载热更配置文件 DomainConfig : 【成功】");
|
||||
domainConfig = loadHotfixSettingsOp.AssetObject as DomainConfig;
|
||||
}
|
||||
else
|
||||
{
|
||||
Debug.LogError($"UnityEvo:加载热更配置文件 DomainConfig : 【失败】");
|
||||
}
|
||||
|
||||
|
||||
if (domainConfig == null)
|
||||
{
|
||||
Debug.LogError($"UnityEvo:【{package.PackageName}】加载DomainConfig为空,无法继续执行后续流程,请检查!!!");
|
||||
}
|
||||
|
||||
FsmSystem.SetCurState(nameof(HotFixState), domainConfig);
|
||||
}
|
||||
|
||||
public override UniTask OnEnterAsync<T>(T param)
|
||||
{
|
||||
return UniTask.CompletedTask;
|
||||
}
|
||||
|
||||
public override UniTask OnEnterAsync<T1, T2>(T1 param1, T2 param2)
|
||||
{
|
||||
return UniTask.CompletedTask;
|
||||
}
|
||||
|
||||
public override void OnUpdate()
|
||||
{
|
||||
base.OnUpdate();
|
||||
}
|
||||
|
||||
|
||||
public override UniTask OnExitAsync()
|
||||
{
|
||||
return UniTask.CompletedTask;
|
||||
}
|
||||
|
||||
#region 下载热更资源
|
||||
|
||||
public async UniTask Download()
|
||||
{
|
||||
int downloadingMaxNum = 1;
|
||||
int failedTryAgain = 1;
|
||||
var package = YooAssets.GetPackage(AppConfig.PackageDomainName);
|
||||
var downloader = package.CreateResourceDownloader(downloadingMaxNum, failedTryAgain);
|
||||
|
||||
// 在正常开始游戏之前,还需要验证本地清单内容的完整性。
|
||||
if (downloader.TotalDownloadCount > 0)
|
||||
{
|
||||
Debug.Log("UnityEvo:资源内容本地并不完整,需要更新资源!");
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
#endregion
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,3 @@
|
||||
fileFormatVersion: 2
|
||||
guid: eca158039896455dba3ded1eb703a5da
|
||||
timeCreated: 1742291100
|
||||
@@ -0,0 +1,193 @@
|
||||
using Cysharp.Threading.Tasks;
|
||||
using UnityEngine;
|
||||
using UnityEngine.Assertions;
|
||||
using YooAsset;
|
||||
|
||||
namespace Stary.Evo
|
||||
{
|
||||
public class ResUpdateServerState : AbstractFSMIStateAsync
|
||||
{
|
||||
public ResUpdateServerState(IFsmSystemAsync system) : base(system)
|
||||
{
|
||||
}
|
||||
|
||||
public override async UniTask OnEnterAsync()
|
||||
{
|
||||
Debug.Log("UnityEvo:开始资源更新...");
|
||||
|
||||
|
||||
// //初始化读取资源配置表
|
||||
var package = YooAssets.GetPackage(AppConfig.PackageDomainName);
|
||||
// 请求资源版本
|
||||
var requetVersionOp = package.RequestPackageVersionAsync();
|
||||
await requetVersionOp;
|
||||
string packageVersion = "";
|
||||
if (requetVersionOp.Status == EOperationStatus.Succeed)
|
||||
{
|
||||
//更新成功
|
||||
packageVersion = requetVersionOp.PackageVersion;
|
||||
PlayerPrefs.SetString($"{AppConfig.PackageDomainName}_GAME_VERSION", packageVersion);
|
||||
Debug.Log($"UnityEvo:获取资源版本 Version : 【{packageVersion}】");
|
||||
Debug.Log($"UnityEvo:开始加载服务器资源...");
|
||||
}
|
||||
else
|
||||
{
|
||||
Debug.LogError($"UnityEvo:获取资源版本失败: 【{requetVersionOp.Error}】");
|
||||
FsmSystem.SetCurState(nameof(ResUpdateLocalState));
|
||||
return;
|
||||
}
|
||||
|
||||
// Assert.AreEqual(EOperationStatus.Succeed, requetVersionOp.Status);
|
||||
|
||||
|
||||
// 更新资源清单
|
||||
var updateManifestOp = package.UpdatePackageManifestAsync(packageVersion);
|
||||
await updateManifestOp;
|
||||
if (updateManifestOp.Status == EOperationStatus.Succeed)
|
||||
{
|
||||
//更新成功
|
||||
Debug.Log($"UnityEvo:更新资源清单 updateManifest : 【成功】");
|
||||
}
|
||||
else
|
||||
{
|
||||
//更新失败
|
||||
Debug.LogError($"UnityEvo:更新资源清单失败: 【{updateManifestOp.Error}】");
|
||||
}
|
||||
|
||||
Assert.AreEqual(EOperationStatus.Succeed, updateManifestOp.Status);
|
||||
|
||||
|
||||
//4.下载补丁包
|
||||
await Download();
|
||||
|
||||
|
||||
//加载热更配置文件
|
||||
var loadHotfixSettingsOp = package.LoadAssetAsync<DomainConfig>("Config_DomainConfig");
|
||||
await loadHotfixSettingsOp;
|
||||
DomainConfig domainConfig = null;
|
||||
if (loadHotfixSettingsOp.Status == EOperationStatus.Succeed)
|
||||
{
|
||||
//更新成功
|
||||
Debug.Log($"UnityEvo:加载热更配置文件 loadHotfixSettings : 【成功】");
|
||||
domainConfig = loadHotfixSettingsOp.AssetObject as DomainConfig;
|
||||
}
|
||||
else
|
||||
{
|
||||
Debug.LogError($"UnityEvo:加载热更配置文件 loadHotfixSettings : 【失败】");
|
||||
}
|
||||
|
||||
|
||||
if (domainConfig == null)
|
||||
{
|
||||
Debug.LogError($"UnityEvo:【{package.PackageName}】加载DomainConfig为空,无法继续执行后续流程,请检查!!!");
|
||||
}
|
||||
|
||||
FsmSystem.SetCurState(nameof(HotFixState), domainConfig);
|
||||
}
|
||||
|
||||
public override UniTask OnEnterAsync<T>(T param)
|
||||
{
|
||||
return UniTask.CompletedTask;
|
||||
}
|
||||
|
||||
public override UniTask OnEnterAsync<T1, T2>(T1 param1, T2 param2)
|
||||
{
|
||||
return UniTask.CompletedTask;
|
||||
}
|
||||
|
||||
public override void OnUpdate()
|
||||
{
|
||||
base.OnUpdate();
|
||||
}
|
||||
|
||||
|
||||
public override UniTask OnExitAsync()
|
||||
{
|
||||
return UniTask.CompletedTask;
|
||||
}
|
||||
|
||||
#region 下载热更资源
|
||||
|
||||
public async UniTask Download()
|
||||
{
|
||||
int downloadingMaxNum = 10;
|
||||
int failedTryAgain = 3;
|
||||
var package = YooAssets.GetPackage(AppConfig.PackageDomainName);
|
||||
var downloader = package.CreateResourceDownloader(downloadingMaxNum, failedTryAgain);
|
||||
|
||||
//没有需要下载的资源
|
||||
if (downloader.TotalDownloadCount == 0)
|
||||
{
|
||||
Debug.Log("UnityEvo:没有需要下载的资源,跳过更新");
|
||||
return;
|
||||
}
|
||||
|
||||
//需要下载的文件总数和总大小
|
||||
int totalDownloadCount = downloader.TotalDownloadCount;
|
||||
long totalDownloadBytes = downloader.TotalDownloadBytes;
|
||||
Debug.Log($"UnityEvo:需要下载的资源的个数【{totalDownloadCount}】,需要下载的资源的总大小{totalDownloadBytes / 1024} MB");
|
||||
//===================================适应新版本YooAsset插件的修改===================================
|
||||
//注册回调方法
|
||||
downloader.DownloadErrorCallback = OnDownloadErrorFunction;
|
||||
downloader.DownloadUpdateCallback = OnDownloadProgressUpdateFunction;
|
||||
downloader.DownloadFinishCallback = OnDownloadOverFunction;
|
||||
downloader.DownloadFileBeginCallback = OnStartDownloadFileFunction;
|
||||
//===================================适应新版本YooAsset插件的修改===================================
|
||||
|
||||
//开启下载
|
||||
downloader.BeginDownload();
|
||||
await downloader;
|
||||
|
||||
//检测下载结果
|
||||
if (downloader.Status == EOperationStatus.Succeed)
|
||||
{
|
||||
//下载成功
|
||||
Debug.Log("UnityEvo:资源更新完成");
|
||||
}
|
||||
else
|
||||
{
|
||||
//下载失败
|
||||
Debug.Log("UnityEvo:资源更新失败");
|
||||
}
|
||||
}
|
||||
|
||||
//===================================适应新版本YooAsset插件的修改===================================
|
||||
/// <summary>
|
||||
/// 开始下载
|
||||
/// </summary>
|
||||
private void OnStartDownloadFileFunction(DownloadFileData downloadFileData)
|
||||
{
|
||||
Debug.Log(
|
||||
$"UnityEvo:开始下载:文件名:{downloadFileData.FileName},文件大小:{downloadFileData.FileSize / 1024f / 1024f} MB");
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 下载完成
|
||||
/// </summary>
|
||||
private void OnDownloadOverFunction(DownloaderFinishData downloaderFinishData)
|
||||
{
|
||||
Debug.Log("UnityEvo:下载" + (downloaderFinishData.Succeed ? "成功" : "失败"));
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 更新中
|
||||
/// </summary>
|
||||
private void OnDownloadProgressUpdateFunction(DownloadUpdateData downloadUpdateData)
|
||||
{
|
||||
Debug.Log(
|
||||
$"UnityEvo:文件总数:{downloadUpdateData.TotalDownloadCount},已下载文件数:{downloadUpdateData.CurrentDownloadCount},下载总大小:{downloadUpdateData.TotalDownloadBytes / 1024f / 1024f} MB,已下载大小{downloadUpdateData.CurrentDownloadBytes / 1024f / 1024f} MB");
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 下载出错
|
||||
/// </summary>
|
||||
/// <param name="errorData"></param>
|
||||
private void OnDownloadErrorFunction(DownloadErrorData errorData)
|
||||
{
|
||||
Debug.Log($"UnityEvo:下载出错:包名:{errorData.PackageName} 文件名:{errorData.FileName},错误信息:{errorData.ErrorInfo}");
|
||||
}
|
||||
//===================================适应新版本YooAsset插件的修改===================================
|
||||
|
||||
#endregion
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,3 @@
|
||||
fileFormatVersion: 2
|
||||
guid: bf15fa0d3ca74b0991fd60bef616d007
|
||||
timeCreated: 1741248693
|
||||
Reference in New Issue
Block a user