傻逼Yooasset 新版本各种问题还是用老版本吧!

This commit is contained in:
DESKTOP-5RP3AKU\Jisol
2024-10-15 02:12:55 +08:00
parent f6c362d356
commit d7e6b45f5f
184 changed files with 10075 additions and 13465 deletions

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

View File

@@ -0,0 +1,3 @@
fileFormatVersion: 2
guid: 426ff69263b7461194f0e87ff5b32100
timeCreated: 1728876063

View File

@@ -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}");
}
}
}
}

View File

@@ -0,0 +1,3 @@
fileFormatVersion: 2
guid: 7b77504dd9e24ad49ebed9a8def0fe26
timeCreated: 1728926184

View File

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

View File

@@ -0,0 +1,3 @@
fileFormatVersion: 2
guid: fa136220570f473bb1154a1aaf29a140
timeCreated: 1728877120

View File

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

View File

@@ -0,0 +1,3 @@
fileFormatVersion: 2
guid: a53059ce506d495ab8adb95ae52979d0
timeCreated: 1728877770