mirror of
https://gitee.com/jisol/jisol-game/
synced 2025-09-27 02:36:14 +00:00
傻逼Yooasset 新版本各种问题还是用老版本吧!
This commit is contained in:
104
JNFrame2/Assets/HotMain/SHGame/Procedure/ProcedureInitPackage.cs
Normal file
104
JNFrame2/Assets/HotMain/SHGame/Procedure/ProcedureInitPackage.cs
Normal file
@@ -0,0 +1,104 @@
|
||||
using System.IO;
|
||||
using Cysharp.Threading.Tasks;
|
||||
using Plugins.SHFrame.SHGame.YooAsset;
|
||||
using SHFrame;
|
||||
using SHFrame.FSM;
|
||||
using UnityEditor;
|
||||
using UnityEngine;
|
||||
using YooAsset;
|
||||
|
||||
namespace Plugins.SHFrame.SHGame.Procedure
|
||||
{
|
||||
/// <summary>
|
||||
/// 初始化资源包
|
||||
/// </summary>
|
||||
public class ProcedureInitializePackage : ProcedureBase
|
||||
{
|
||||
|
||||
public static EPlayMode PlayMode = EPlayMode.OfflinePlayMode;
|
||||
public static string RawFilePackageName = "RawFilePackage";
|
||||
public static string DefaultPackageName = "DefaultPackage";
|
||||
|
||||
|
||||
//热更新的dll名称
|
||||
public static readonly string[] HotDllName =
|
||||
{
|
||||
};
|
||||
|
||||
public static readonly string[] AotMetaAssemblyFiles =
|
||||
{
|
||||
"mscorlib.dll",
|
||||
"System.dll",
|
||||
"System.Core.dll",
|
||||
};
|
||||
|
||||
|
||||
protected override void OnEnter(IFsm<IProcedureManager> procedureOwner)
|
||||
{
|
||||
base.OnEnter(procedureOwner);
|
||||
InitPackage(procedureOwner).Forget();
|
||||
}
|
||||
|
||||
private async UniTask InitPackage(IFsm<IProcedureManager> procedureOwner)
|
||||
{
|
||||
|
||||
Log.Debug($"YooAssets 开始初始化");
|
||||
|
||||
// 1.初始化资源系统
|
||||
YooAssets.Initialize();
|
||||
|
||||
var rawFilePackage = await InitYooPackage(RawFilePackageName, true);
|
||||
var defaultPackage = await InitYooPackage(DefaultPackageName, false);
|
||||
Log.Debug($"YooAssets 初始化完成");
|
||||
|
||||
// 设置该资源包为默认的资源包,可以使用YooAssets相关加载接口加载该资源包内容。
|
||||
YooAssets.SetDefaultPackage(defaultPackage);
|
||||
|
||||
// 切换到更新资源清单
|
||||
ChangeState<ProcedureUpdatePackageManifest>(procedureOwner);
|
||||
|
||||
}
|
||||
|
||||
private async UniTask<ResourcePackage> InitYooPackage(string packageName, bool isRaw)
|
||||
{
|
||||
// 创建资源包
|
||||
var package = YooAssets.TryGetPackage(packageName) ?? YooAssets.CreatePackage(packageName);
|
||||
|
||||
InitializationOperation initOperation = null;
|
||||
switch (PlayMode)
|
||||
{
|
||||
case EPlayMode.EditorSimulateMode:
|
||||
// 编辑器模拟模式
|
||||
EDefaultBuildPipeline buildPipeline = isRaw ? EDefaultBuildPipeline.RawFileBuildPipeline : EDefaultBuildPipeline.ScriptableBuildPipeline;
|
||||
var initParametersEditorSimulateMode = new EditorSimulateModeParameters
|
||||
{
|
||||
SimulateManifestFilePath = EditorSimulateModeHelper.SimulateBuild(buildPipeline, packageName)
|
||||
};
|
||||
initOperation = package.InitializeAsync(initParametersEditorSimulateMode);
|
||||
break;
|
||||
case EPlayMode.OfflinePlayMode:
|
||||
// 单机模式
|
||||
var initParametersOfflinePlayMode = new OfflinePlayModeParameters
|
||||
{
|
||||
DecryptionServices = new FileStreamDecryption()
|
||||
};
|
||||
initOperation = package.InitializeAsync(initParametersOfflinePlayMode);
|
||||
break;
|
||||
case EPlayMode.HostPlayMode:
|
||||
// //联机运行模式
|
||||
// var initParametersHostPlayMode = new HostPlayModeParameters
|
||||
// {
|
||||
// BuildinQueryServices = new GameQueryServices(),
|
||||
// RemoteServices = new RemoteServices(GetHostServerURL(packageName), GetHostServerURL(packageName))
|
||||
// };
|
||||
// initOperation = package.InitializeAsync(initParametersHostPlayMode);
|
||||
break;
|
||||
}
|
||||
|
||||
await initOperation.ToUniTask();
|
||||
|
||||
return package;
|
||||
}
|
||||
|
||||
}
|
||||
}
|
@@ -0,0 +1,3 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 426ff69263b7461194f0e87ff5b32100
|
||||
timeCreated: 1728876063
|
@@ -0,0 +1,53 @@
|
||||
using System;
|
||||
using System.Linq;
|
||||
using System.Reflection;
|
||||
using Cysharp.Threading.Tasks;
|
||||
using HybridCLR;
|
||||
using Plugins.SHFrame.SHGame.Procedure;
|
||||
using SHFrame;
|
||||
using SHFrame.FSM;
|
||||
using YooAsset;
|
||||
|
||||
namespace HotMain.SHGame.Procedure
|
||||
{
|
||||
public class ProcedureLoadLauncher : ProcedureBase
|
||||
{
|
||||
private static Assembly _launcherAss;
|
||||
|
||||
protected override void OnEnter(IFsm<IProcedureManager> procedureOwner)
|
||||
{
|
||||
base.OnEnter(procedureOwner);
|
||||
CreatePackageDownloader(procedureOwner).Forget();
|
||||
}
|
||||
|
||||
private async UniTask CreatePackageDownloader(IFsm<IProcedureManager> procedureOwner)
|
||||
{
|
||||
// 打包时内置在包体内的资源 直接先使用包体资源,实例化 登录加载界面后,再去检查是否需要下载更新
|
||||
//加载AOT
|
||||
await LoadMetadataForAOTAssemblies();
|
||||
}
|
||||
|
||||
|
||||
/// <summary>
|
||||
/// 为aot assembly加载原始metadata, 这个代码放aot或者热更新都行。
|
||||
/// 一旦加载后,如果AOT泛型函数对应native实现不存在,则自动替换为解释模式执行
|
||||
/// </summary>
|
||||
private async UniTask LoadMetadataForAOTAssemblies()
|
||||
{
|
||||
var package = YooAssets.GetPackage(ProcedureInitializePackage.RawFilePackageName);
|
||||
|
||||
Log.Debug("加载AOT泛型dll数据");
|
||||
// 注意,补充元数据是给AOT dll补充元数据,而不是给热更新dll补充元数据。
|
||||
// 热更新dll不缺元数据,不需要补充,如果调用LoadMetadataForAOTAssembly会返回错误
|
||||
var mode = HomologousImageMode.SuperSet;
|
||||
foreach (var aotDllName in ProcedureInitializePackage.AotMetaAssemblyFiles)
|
||||
{
|
||||
var handle = package.LoadRawFileSync(aotDllName);
|
||||
await handle.ToUniTask();
|
||||
// 加载assembly对应的dll,会自动为它hook。一旦aot泛型函数的native函数不存在,用解释器版本代码
|
||||
var err = RuntimeApi.LoadMetadataForAOTAssembly(handle.GetRawFileData(), mode);
|
||||
Log.Debug($"LoadMetadataForAOTAssembly:{aotDllName}. mode:{mode} ret:{err}");
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
@@ -0,0 +1,3 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 7b77504dd9e24ad49ebed9a8def0fe26
|
||||
timeCreated: 1728926184
|
@@ -0,0 +1,70 @@
|
||||
using Cysharp.Threading.Tasks;
|
||||
using SHFrame;
|
||||
using SHFrame.FSM;
|
||||
using YooAsset;
|
||||
|
||||
namespace Plugins.SHFrame.SHGame.Procedure
|
||||
{
|
||||
/// <summary>
|
||||
/// 更新资源清单
|
||||
/// </summary>
|
||||
public class ProcedureUpdatePackageManifest : ProcedureBase
|
||||
{
|
||||
protected override void OnEnter(IFsm<IProcedureManager> procedureOwner)
|
||||
{
|
||||
base.OnEnter(procedureOwner);
|
||||
UpdateManifest(procedureOwner).Forget();
|
||||
}
|
||||
|
||||
private async UniTask UpdateManifest(IFsm<IProcedureManager> procedureOwner)
|
||||
{
|
||||
bool result = await UpdatePackageManifest(ProcedureInitializePackage.RawFilePackageName);
|
||||
if (!result) return;
|
||||
|
||||
result = await UpdatePackageManifest(ProcedureInitializePackage.DefaultPackageName);
|
||||
if (!result) return;
|
||||
|
||||
//切换到更新资源版本
|
||||
ChangeState<ProcedureUpdatePackageVersion>(procedureOwner);
|
||||
}
|
||||
|
||||
|
||||
/// <summary>
|
||||
/// 更新资源清单
|
||||
/// </summary>
|
||||
/// <returns></returns>
|
||||
private async UniTask<bool> UpdatePackageManifest(string packageName)
|
||||
{
|
||||
ResourcePackage package = YooAssets.GetPackage(packageName);
|
||||
|
||||
//2.获取资源版本
|
||||
UpdatePackageVersionOperation updateVerOperation = package.UpdatePackageVersionAsync(false);
|
||||
await updateVerOperation.ToUniTask();
|
||||
|
||||
// TODO 如果初始化失败弹出提示界面
|
||||
if (updateVerOperation.Status != EOperationStatus.Succeed)
|
||||
{
|
||||
//初始化失败了 弹出提示
|
||||
Log.Error($"{package.PackageName} 获取远程资源版本信息失败: {updateVerOperation.Error}");
|
||||
return false;
|
||||
}
|
||||
|
||||
string packageVersion = updateVerOperation.PackageVersion;
|
||||
Log.Debug($"Init {package.PackageName} version : {packageVersion}");
|
||||
|
||||
//3.更新补丁清单
|
||||
UpdatePackageManifestOperation updateManifestOperation = package.UpdatePackageManifestAsync(packageVersion);
|
||||
await updateManifestOperation.ToUniTask();
|
||||
|
||||
if (updateManifestOperation.Status != EOperationStatus.Succeed)
|
||||
{
|
||||
//更新失败了 弹出提示
|
||||
Log.Error($"{package.PackageName} 更新资源版本清单失败: {updateManifestOperation.Error}");
|
||||
return false;
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
}
|
||||
}
|
@@ -0,0 +1,3 @@
|
||||
fileFormatVersion: 2
|
||||
guid: fa136220570f473bb1154a1aaf29a140
|
||||
timeCreated: 1728877120
|
@@ -0,0 +1,49 @@
|
||||
using Cysharp.Threading.Tasks;
|
||||
using HotMain.SHGame.Procedure;
|
||||
using SHFrame;
|
||||
using SHFrame.FSM;
|
||||
using YooAsset;
|
||||
|
||||
namespace Plugins.SHFrame.SHGame.Procedure
|
||||
{
|
||||
/// <summary>
|
||||
/// 更新资源版本号
|
||||
/// </summary>
|
||||
public class ProcedureUpdatePackageVersion : ProcedureBase
|
||||
{
|
||||
protected override void OnEnter(IFsm<IProcedureManager> procedureOwner)
|
||||
{
|
||||
base.OnEnter(procedureOwner);
|
||||
UpdatePackages(procedureOwner).Forget();
|
||||
}
|
||||
|
||||
private async UniTask UpdatePackages(IFsm<IProcedureManager> procedureOwner)
|
||||
{
|
||||
bool result = await UpdatePackageVersion(ProcedureInitializePackage.RawFilePackageName);
|
||||
if (!result) return;
|
||||
result = await UpdatePackageVersion(ProcedureInitializePackage.DefaultPackageName);
|
||||
if (!result) return;
|
||||
|
||||
//切换到更新资源版本
|
||||
ChangeState<ProcedureLoadLauncher>(procedureOwner);
|
||||
}
|
||||
|
||||
|
||||
private async UniTask<bool> UpdatePackageVersion(string packageName)
|
||||
{
|
||||
ResourcePackage package = YooAssets.GetPackage(packageName);
|
||||
//2.获取资源版本
|
||||
UpdatePackageVersionOperation updateVerOperation = package.UpdatePackageVersionAsync(false);
|
||||
await updateVerOperation.ToUniTask();
|
||||
|
||||
// TODO 如果初始化失败弹出提示界面
|
||||
if (updateVerOperation.Status != EOperationStatus.Succeed)
|
||||
{
|
||||
Log.Error($"{package.PackageName} 获取远程资源版本信息失败: {updateVerOperation.Error}");
|
||||
return false;
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
}
|
||||
}
|
@@ -0,0 +1,3 @@
|
||||
fileFormatVersion: 2
|
||||
guid: a53059ce506d495ab8adb95ae52979d0
|
||||
timeCreated: 1728877770
|
Reference in New Issue
Block a user