This commit is contained in:
PC-20230316NUNE\Administrator
2024-10-14 20:31:57 +08:00
parent d56c133a75
commit f6c362d356
614 changed files with 16201 additions and 7420 deletions

View File

@@ -0,0 +1,3 @@
fileFormatVersion: 2
guid: 5644558033ff4e3cb5af03aa0afdb5e0
timeCreated: 1728875898

View File

@@ -0,0 +1,99 @@
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";
protected internal 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:
Log.Debug($"编辑器模拟模式");
// 编辑器模拟模式
EDefaultBuildPipeline buildPipeline = isRaw ? EDefaultBuildPipeline.RawFileBuildPipeline : EDefaultBuildPipeline.ScriptableBuildPipeline;
var initParametersEditorSimulateMode = new EditorSimulateModeParameters();
initParametersEditorSimulateMode.EditorFileSystemParameters =
FileSystemParameters.CreateDefaultEditorFileSystemParameters(
EditorSimulateModeHelper.SimulateBuild(buildPipeline, packageName)
);
initOperation = package.InitializeAsync(initParametersEditorSimulateMode);
break;
case EPlayMode.OfflinePlayMode:
Log.Debug($"单机模式");
// 单机模式
var createParameters = new OfflinePlayModeParameters
{
BuildinFileSystemParameters = FileSystemParameters.CreateDefaultBuildinFileSystemParameters()
};
initOperation = package.InitializeAsync(createParameters);
break;
case EPlayMode.HostPlayMode:
Log.Debug($"在线模式");
//联机运行模式
string defaultHostServer = "http://127.0.0.1/CDN/Android/v1.0";
string fallbackHostServer = "http://127.0.0.1/CDN/Android/v1.0";
IRemoteServices remoteServices = new RemoteServices(defaultHostServer, fallbackHostServer);
var cacheFileSystem = FileSystemParameters.CreateDefaultCacheFileSystemParameters(remoteServices);
var buildinFileSystem = FileSystemParameters.CreateDefaultBuildinFileSystemParameters();
var initParameters = new HostPlayModeParameters();
initParameters.BuildinFileSystemParameters = buildinFileSystem;
initParameters.CacheFileSystemParameters = cacheFileSystem;
initOperation = package.InitializeAsync(initParameters);
break;
}
Log.Debug($"执行初始化");
await initOperation;
return package;
}
}
}

View File

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

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 internal 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.获取资源版本
RequestPackageVersionOperation updateVerOperation = package.RequestPackageVersionAsync(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,45 @@
using Cysharp.Threading.Tasks;
using SHFrame;
using SHFrame.FSM;
using YooAsset;
namespace Plugins.SHFrame.SHGame.Procedure
{
/// <summary>
/// 更新资源版本号
/// </summary>
public class ProcedureUpdatePackageVersion : ProcedureBase
{
protected internal 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;
}
private async UniTask<bool> UpdatePackageVersion(string packageName)
{
ResourcePackage package = YooAssets.GetPackage(packageName);
//2.获取资源版本
RequestPackageVersionOperation updateVerOperation = package.RequestPackageVersionAsync(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

View File

@@ -0,0 +1,3 @@
fileFormatVersion: 2
guid: bc65a4d37b5c4c51953baaaee48d2c76
timeCreated: 1728876983

View File

@@ -0,0 +1,105 @@
using System.IO;
using UnityEngine;
using YooAsset;
namespace Plugins.SHFrame.SHGame.YooAsset
{
public class RemoteServices : IRemoteServices
{
private string defaultHostServer;
private string fallbackHostServer;
public RemoteServices(string defaultHostServer, string fallbackHostServer)
{
this.defaultHostServer = defaultHostServer;
this.fallbackHostServer = fallbackHostServer;
}
public string GetRemoteMainURL(string fileName)
{
return defaultHostServer;
}
public string GetRemoteFallbackURL(string fileName)
{
return fallbackHostServer;
}
}
/// <summary>
/// 资源文件解密流
/// </summary>
public class BundleStream : FileStream
{
public const byte KEY = 64;
public BundleStream(string path, FileMode mode, FileAccess access, FileShare share) : base(path, mode, access, share)
{
}
public BundleStream(string path, FileMode mode) : base(path, mode)
{
}
public override int Read(byte[] array, int offset, int count)
{
var index = base.Read(array, offset, count);
for (int i = 0; i < array.Length; i++)
{
array[i] ^= KEY;
}
return index;
}
}
/// <summary>
/// 资源文件流加载解密类
/// </summary>
public class FileStreamDecryption : IDecryptionServices
{
/// <summary>
/// 同步方式获取解密的资源包对象
/// 注意:加载流对象在资源包对象释放的时候会自动释放
/// </summary>
AssetBundle IDecryptionServices.LoadAssetBundle(DecryptFileInfo fileInfo, out Stream managedStream)
{
BundleStream bundleStream = new BundleStream(fileInfo.FileLoadPath, FileMode.Open, FileAccess.Read, FileShare.Read);
managedStream = bundleStream;
return AssetBundle.LoadFromStream(bundleStream, fileInfo.FileLoadCRC, GetManagedReadBufferSize());
}
/// <summary>
/// 异步方式获取解密的资源包对象
/// 注意:加载流对象在资源包对象释放的时候会自动释放
/// </summary>
AssetBundleCreateRequest IDecryptionServices.LoadAssetBundleAsync(DecryptFileInfo fileInfo, out Stream managedStream)
{
BundleStream bundleStream = new BundleStream(fileInfo.FileLoadPath, FileMode.Open, FileAccess.Read, FileShare.Read);
managedStream = bundleStream;
return AssetBundle.LoadFromStreamAsync(bundleStream, fileInfo.FileLoadCRC, GetManagedReadBufferSize());
}
/// <summary>
/// 获取解密的字节数据
/// </summary>
byte[] IDecryptionServices.ReadFileData(DecryptFileInfo fileInfo)
{
throw new System.NotImplementedException();
}
/// <summary>
/// 获取解密的文本数据
/// </summary>
string IDecryptionServices.ReadFileText(DecryptFileInfo fileInfo)
{
throw new System.NotImplementedException();
}
private static uint GetManagedReadBufferSize()
{
return 1024;
}
}
}

View File

@@ -0,0 +1,3 @@
fileFormatVersion: 2
guid: 2c2a4207de1f4b1995db5f2f3a8d6e62
timeCreated: 1728649446