mirror of
https://gitee.com/jisol/jisol-game/
synced 2025-09-27 02:36:14 +00:00
提交
This commit is contained in:
@@ -86,7 +86,7 @@ namespace SHFrame
|
||||
|
||||
AudioAgents = new List<AudioAgent>(32);
|
||||
InstanceRoot = new GameObject(Utility.Text.Format("Audio Category - {0}", _audioMixerGroup.name)).transform;
|
||||
InstanceRoot.SetParent(GameModule.Audio.InstanceRoot);
|
||||
InstanceRoot.SetParent(SHFrameModule.Audio.InstanceRoot);
|
||||
for (int index = 0; index < _maxChannel; index++)
|
||||
{
|
||||
AudioAgent audioAgent = new AudioAgent();
|
||||
|
@@ -343,9 +343,9 @@ namespace SHFrame
|
||||
if (_instanceRoot == null)
|
||||
{
|
||||
_instanceRoot = new GameObject("AudioModule Instances").transform;
|
||||
_instanceRoot.SetParent(GameModule.Audio.transform);
|
||||
_instanceRoot.SetParent(SHFrameModule.Audio.transform);
|
||||
_instanceRoot.localScale = Vector3.one;
|
||||
GameModule.Audio.InstanceRoot = _instanceRoot;
|
||||
SHFrameModule.Audio.InstanceRoot = _instanceRoot;
|
||||
}
|
||||
|
||||
try
|
||||
|
@@ -85,7 +85,7 @@ namespace SHFrame
|
||||
}
|
||||
_modules.Clear();
|
||||
|
||||
GameModule.Shutdown(shutdownType);
|
||||
SHFrameModule.Shutdown(shutdownType);
|
||||
|
||||
if (shutdownType == ShutdownType.None)
|
||||
{
|
||||
|
@@ -7,7 +7,7 @@ namespace SHFrame
|
||||
/// <summary>
|
||||
/// 游戏模块。
|
||||
/// </summary>
|
||||
public partial class GameModule : MonoBehaviour
|
||||
public partial class SHFrameModule : MonoBehaviour
|
||||
{
|
||||
private static readonly Dictionary<Type, Module> _moduleMaps = new Dictionary<Type, Module>(ModuleImpSystem.DesignModuleCount);
|
||||
|
||||
@@ -24,75 +24,25 @@ namespace SHFrame
|
||||
}
|
||||
|
||||
private static RootModule _base;
|
||||
|
||||
// /// <summary>
|
||||
// /// 获取调试模块。
|
||||
// /// </summary>
|
||||
// public static DebuggerModule Debugger
|
||||
// {
|
||||
// get => _debugger ??= Get<DebuggerModule>();
|
||||
// private set => _debugger = value;
|
||||
// }
|
||||
//
|
||||
//
|
||||
// private static DebuggerModule _debugger;
|
||||
|
||||
/// <summary>
|
||||
/// 获取音频模块。
|
||||
/// </summary>
|
||||
public static AudioModule Audio => _audio ??= Get<AudioModule>();
|
||||
private static AudioModule _audio;
|
||||
|
||||
/// <summary>
|
||||
/// 获取有限状态机模块。
|
||||
/// </summary>
|
||||
public static FSM.FsmModule Fsm => _fsm ??= Get<FSM.FsmModule>();
|
||||
|
||||
private static FSM.FsmModule _fsm;
|
||||
|
||||
/// <summary>
|
||||
/// 流程管理模块。
|
||||
/// </summary>
|
||||
public static ProcedureModule Procedure => _procedure ??= Get<ProcedureModule>();
|
||||
|
||||
private static ProcedureModule _procedure;
|
||||
|
||||
/// <summary>
|
||||
/// 获取对象池模块。
|
||||
/// </summary>
|
||||
public static ObjectPoolModule ObjectPool => _objectPool ??= Get<ObjectPoolModule>();
|
||||
|
||||
private static ObjectPoolModule _objectPool;
|
||||
|
||||
// /// <summary>
|
||||
// /// 获取资源模块。
|
||||
// /// </summary>
|
||||
// public static ResourceModule Resource => _resource ??= Get<ResourceModule>();
|
||||
//
|
||||
// private static ResourceModule _resource;
|
||||
|
||||
|
||||
/// <summary>
|
||||
/// 获取音频模块。
|
||||
/// </summary>
|
||||
public static AudioModule Audio => _audio ??= Get<AudioModule>();
|
||||
|
||||
private static AudioModule _audio;
|
||||
|
||||
// /// <summary>
|
||||
// /// 获取配置模块。
|
||||
// /// </summary>
|
||||
// public static SettingModule Setting => _setting ??= Get<SettingModule>();
|
||||
//
|
||||
// private static SettingModule _setting;
|
||||
|
||||
// /// <summary>
|
||||
// /// 获取多语言模块。
|
||||
// /// </summary>
|
||||
// public static LocalizationModule Localization => _localization ??= Get<LocalizationModule>();
|
||||
//
|
||||
// private static LocalizationModule _localization;
|
||||
|
||||
// /// <summary>
|
||||
// /// 获取计时器模块。
|
||||
// /// </summary>
|
||||
// public static TimerModule Timer => _timer ??= Get<TimerModule>();
|
||||
//
|
||||
// private static TimerModule _timer;
|
||||
#endregion
|
||||
|
||||
/// <summary>
|
||||
@@ -111,7 +61,6 @@ namespace SHFrame
|
||||
|
||||
T module = ModuleSystem.GetModule<T>();
|
||||
|
||||
|
||||
Log.Assert(condition: module != null, $"{typeof(T)} is null");
|
||||
|
||||
_moduleMaps.Add(type, module);
|
||||
@@ -123,7 +72,7 @@ namespace SHFrame
|
||||
{
|
||||
Log.Info("GameModule Active");
|
||||
_gameModuleRoot = gameObject;
|
||||
_gameModuleRoot.name = $"[{nameof(GameModule)}]";
|
||||
_gameModuleRoot.name = $"[{nameof(SHFrameModule)}]";
|
||||
DontDestroyOnLoad(_gameModuleRoot);
|
||||
}
|
||||
|
||||
@@ -136,15 +85,9 @@ namespace SHFrame
|
||||
_gameModuleRoot = null;
|
||||
}
|
||||
_moduleMaps.Clear();
|
||||
|
||||
_base = null;
|
||||
// _debugger = null;
|
||||
_fsm = null;
|
||||
_procedure = null;
|
||||
_objectPool = null;
|
||||
// _resource = null;
|
||||
_audio = null;
|
||||
// _setting = null;
|
||||
_procedure = null;
|
||||
}
|
||||
}
|
||||
}
|
@@ -0,0 +1,17 @@
|
||||
{
|
||||
"name": "SHFrame",
|
||||
"rootNamespace": "",
|
||||
"references": [
|
||||
"GUID:f51ebe6a0ceec4240a699833d6309b23",
|
||||
"GUID:e34a5702dd353724aa315fb8011f08c3"
|
||||
],
|
||||
"includePlatforms": [],
|
||||
"excludePlatforms": [],
|
||||
"allowUnsafeCode": true,
|
||||
"overrideReferences": false,
|
||||
"precompiledReferences": [],
|
||||
"autoReferenced": true,
|
||||
"defineConstraints": [],
|
||||
"versionDefines": [],
|
||||
"noEngineReferences": false
|
||||
}
|
@@ -0,0 +1,7 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 23aed7c57bb0a5d49aeaef92abb5bfff
|
||||
AssemblyDefinitionImporter:
|
||||
externalObjects: {}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
3
JNFrame2/Assets/Plugins/SHFrame/Runtime/SHGame.meta
Normal file
3
JNFrame2/Assets/Plugins/SHFrame/Runtime/SHGame.meta
Normal file
@@ -0,0 +1,3 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 9e005776846e48c4a5e41f261eea14df
|
||||
timeCreated: 1728875736
|
@@ -0,0 +1,3 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 5644558033ff4e3cb5af03aa0afdb5e0
|
||||
timeCreated: 1728875898
|
@@ -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;
|
||||
}
|
||||
|
||||
}
|
||||
}
|
@@ -0,0 +1,3 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 426ff69263b7461194f0e87ff5b32100
|
||||
timeCreated: 1728876063
|
@@ -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;
|
||||
}
|
||||
|
||||
}
|
||||
}
|
@@ -0,0 +1,3 @@
|
||||
fileFormatVersion: 2
|
||||
guid: fa136220570f473bb1154a1aaf29a140
|
||||
timeCreated: 1728877120
|
@@ -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;
|
||||
}
|
||||
}
|
||||
}
|
@@ -0,0 +1,3 @@
|
||||
fileFormatVersion: 2
|
||||
guid: a53059ce506d495ab8adb95ae52979d0
|
||||
timeCreated: 1728877770
|
@@ -0,0 +1,3 @@
|
||||
fileFormatVersion: 2
|
||||
guid: bc65a4d37b5c4c51953baaaee48d2c76
|
||||
timeCreated: 1728876983
|
@@ -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;
|
||||
}
|
||||
}
|
||||
}
|
@@ -0,0 +1,3 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 2c2a4207de1f4b1995db5f2f3a8d6e62
|
||||
timeCreated: 1728649446
|
Reference in New Issue
Block a user