mirror of
https://gitee.com/jisol/jisol-game/
synced 2025-09-27 10:46:17 +00:00
提交
This commit is contained in:
@@ -0,0 +1,74 @@
|
||||
|
||||
using System;
|
||||
|
||||
namespace SHFrame
|
||||
{
|
||||
/// <summary>
|
||||
/// 流程管理器接口。
|
||||
/// </summary>
|
||||
public interface IProcedureManager
|
||||
{
|
||||
/// <summary>
|
||||
/// 获取当前流程。
|
||||
/// </summary>
|
||||
ProcedureBase CurrentProcedure
|
||||
{
|
||||
get;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 获取当前流程持续时间。
|
||||
/// </summary>
|
||||
float CurrentProcedureTime
|
||||
{
|
||||
get;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 初始化流程管理器。
|
||||
/// </summary>
|
||||
/// <param name="fsmManager">有限状态机管理器。</param>
|
||||
/// <param name="procedures">流程管理器包含的流程。</param>
|
||||
void Initialize(FSM.IFsmManager fsmManager, params ProcedureBase[] procedures);
|
||||
|
||||
/// <summary>
|
||||
/// 开始流程。
|
||||
/// </summary>
|
||||
/// <typeparam name="T">要开始的流程类型。</typeparam>
|
||||
void StartProcedure<T>() where T : ProcedureBase;
|
||||
|
||||
/// <summary>
|
||||
/// 开始流程。
|
||||
/// </summary>
|
||||
/// <param name="procedureType">要开始的流程类型。</param>
|
||||
void StartProcedure(Type procedureType);
|
||||
|
||||
/// <summary>
|
||||
/// 是否存在流程。
|
||||
/// </summary>
|
||||
/// <typeparam name="T">要检查的流程类型。</typeparam>
|
||||
/// <returns>是否存在流程。</returns>
|
||||
bool HasProcedure<T>() where T : ProcedureBase;
|
||||
|
||||
/// <summary>
|
||||
/// 是否存在流程。
|
||||
/// </summary>
|
||||
/// <param name="procedureType">要检查的流程类型。</param>
|
||||
/// <returns>是否存在流程。</returns>
|
||||
bool HasProcedure(Type procedureType);
|
||||
|
||||
/// <summary>
|
||||
/// 获取流程。
|
||||
/// </summary>
|
||||
/// <typeparam name="T">要获取的流程类型。</typeparam>
|
||||
/// <returns>要获取的流程。</returns>
|
||||
ProcedureBase GetProcedure<T>() where T : ProcedureBase;
|
||||
|
||||
/// <summary>
|
||||
/// 获取流程。
|
||||
/// </summary>
|
||||
/// <param name="procedureType">要获取的流程类型。</param>
|
||||
/// <returns>要获取的流程。</returns>
|
||||
ProcedureBase GetProcedure(Type procedureType);
|
||||
}
|
||||
}
|
@@ -0,0 +1,11 @@
|
||||
fileFormatVersion: 2
|
||||
guid: c821b1d0ed655664ca0e31707b63d7cb
|
||||
MonoImporter:
|
||||
externalObjects: {}
|
||||
serializedVersion: 2
|
||||
defaultReferences: []
|
||||
executionOrder: 0
|
||||
icon: {instanceID: 0}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
@@ -0,0 +1,59 @@
|
||||
|
||||
using ProcedureOwner = SHFrame.FSM.IFsm<SHFrame.IProcedureManager>;
|
||||
|
||||
namespace SHFrame
|
||||
{
|
||||
/// <summary>
|
||||
/// 流程基类。
|
||||
/// </summary>
|
||||
public abstract class ProcedureBase : FSM.FsmState<IProcedureManager>
|
||||
{
|
||||
/// <summary>
|
||||
/// 状态初始化时调用。
|
||||
/// </summary>
|
||||
/// <param name="procedureOwner">流程持有者。</param>
|
||||
protected internal override void OnInit(ProcedureOwner procedureOwner)
|
||||
{
|
||||
base.OnInit(procedureOwner);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 进入状态时调用。
|
||||
/// </summary>
|
||||
/// <param name="procedureOwner">流程持有者。</param>
|
||||
protected internal override void OnEnter(ProcedureOwner procedureOwner)
|
||||
{
|
||||
base.OnEnter(procedureOwner);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 状态轮询时调用。
|
||||
/// </summary>
|
||||
/// <param name="procedureOwner">流程持有者。</param>
|
||||
/// <param name="elapseSeconds">逻辑流逝时间,以秒为单位。</param>
|
||||
/// <param name="realElapseSeconds">真实流逝时间,以秒为单位。</param>
|
||||
protected internal override void OnUpdate(ProcedureOwner procedureOwner, float elapseSeconds, float realElapseSeconds)
|
||||
{
|
||||
base.OnUpdate(procedureOwner, elapseSeconds, realElapseSeconds);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 离开状态时调用。
|
||||
/// </summary>
|
||||
/// <param name="procedureOwner">流程持有者。</param>
|
||||
/// <param name="isShutdown">是否是关闭状态机时触发。</param>
|
||||
protected internal override void OnLeave(ProcedureOwner procedureOwner, bool isShutdown)
|
||||
{
|
||||
base.OnLeave(procedureOwner, isShutdown);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 状态销毁时调用。
|
||||
/// </summary>
|
||||
/// <param name="procedureOwner">流程持有者。</param>
|
||||
protected internal override void OnDestroy(ProcedureOwner procedureOwner)
|
||||
{
|
||||
base.OnDestroy(procedureOwner);
|
||||
}
|
||||
}
|
||||
}
|
@@ -0,0 +1,11 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 8be720b5d94706e4a9b09f7260887bff
|
||||
MonoImporter:
|
||||
externalObjects: {}
|
||||
serializedVersion: 2
|
||||
defaultReferences: []
|
||||
executionOrder: 0
|
||||
icon: {instanceID: 0}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
@@ -0,0 +1,197 @@
|
||||
|
||||
using System;
|
||||
|
||||
namespace SHFrame
|
||||
{
|
||||
/// <summary>
|
||||
/// 流程管理器。
|
||||
/// </summary>
|
||||
internal sealed class ProcedureManager : ModuleImp, IProcedureManager
|
||||
{
|
||||
private FSM.IFsmManager m_FsmManager;
|
||||
private FSM.IFsm<IProcedureManager> m_ProcedureFsm;
|
||||
|
||||
/// <summary>
|
||||
/// 初始化流程管理器的新实例。
|
||||
/// </summary>
|
||||
public ProcedureManager()
|
||||
{
|
||||
m_FsmManager = null;
|
||||
m_ProcedureFsm = null;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 获取游戏框架模块优先级。
|
||||
/// </summary>
|
||||
/// <remarks>优先级较高的模块会优先轮询,并且关闭操作会后进行。</remarks>
|
||||
internal override int Priority
|
||||
{
|
||||
get
|
||||
{
|
||||
return -2;
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 获取当前流程。
|
||||
/// </summary>
|
||||
public ProcedureBase CurrentProcedure
|
||||
{
|
||||
get
|
||||
{
|
||||
if (m_ProcedureFsm == null)
|
||||
{
|
||||
throw new GameFrameworkException("You must initialize procedure first.");
|
||||
}
|
||||
|
||||
return (ProcedureBase)m_ProcedureFsm.CurrentState;
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 获取当前流程持续时间。
|
||||
/// </summary>
|
||||
public float CurrentProcedureTime
|
||||
{
|
||||
get
|
||||
{
|
||||
if (m_ProcedureFsm == null)
|
||||
{
|
||||
throw new GameFrameworkException("You must initialize procedure first.");
|
||||
}
|
||||
|
||||
return m_ProcedureFsm.CurrentStateTime;
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 流程管理器轮询。
|
||||
/// </summary>
|
||||
/// <param name="elapseSeconds">逻辑流逝时间,以秒为单位。</param>
|
||||
/// <param name="realElapseSeconds">真实流逝时间,以秒为单位。</param>
|
||||
internal override void Update(float elapseSeconds, float realElapseSeconds)
|
||||
{
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 关闭并清理流程管理器。
|
||||
/// </summary>
|
||||
internal override void Shutdown()
|
||||
{
|
||||
if (m_FsmManager != null)
|
||||
{
|
||||
if (m_ProcedureFsm != null)
|
||||
{
|
||||
m_FsmManager.DestroyFsm(m_ProcedureFsm);
|
||||
m_ProcedureFsm = null;
|
||||
}
|
||||
|
||||
m_FsmManager = null;
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 初始化流程管理器。
|
||||
/// </summary>
|
||||
/// <param name="fsmManager">有限状态机管理器。</param>
|
||||
/// <param name="procedures">流程管理器包含的流程。</param>
|
||||
public void Initialize(FSM.IFsmManager fsmManager, params ProcedureBase[] procedures)
|
||||
{
|
||||
if (fsmManager == null)
|
||||
{
|
||||
throw new GameFrameworkException("FSM manager is invalid.");
|
||||
}
|
||||
|
||||
m_FsmManager = fsmManager;
|
||||
m_ProcedureFsm = m_FsmManager.CreateFsm(this, procedures);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 开始流程。
|
||||
/// </summary>
|
||||
/// <typeparam name="T">要开始的流程类型。</typeparam>
|
||||
public void StartProcedure<T>() where T : ProcedureBase
|
||||
{
|
||||
if (m_ProcedureFsm == null)
|
||||
{
|
||||
throw new GameFrameworkException("You must initialize procedure first.");
|
||||
}
|
||||
|
||||
m_ProcedureFsm.Start<T>();
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 开始流程。
|
||||
/// </summary>
|
||||
/// <param name="procedureType">要开始的流程类型。</param>
|
||||
public void StartProcedure(Type procedureType)
|
||||
{
|
||||
if (m_ProcedureFsm == null)
|
||||
{
|
||||
throw new GameFrameworkException("You must initialize procedure first.");
|
||||
}
|
||||
|
||||
m_ProcedureFsm.Start(procedureType);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 是否存在流程。
|
||||
/// </summary>
|
||||
/// <typeparam name="T">要检查的流程类型。</typeparam>
|
||||
/// <returns>是否存在流程。</returns>
|
||||
public bool HasProcedure<T>() where T : ProcedureBase
|
||||
{
|
||||
if (m_ProcedureFsm == null)
|
||||
{
|
||||
throw new GameFrameworkException("You must initialize procedure first.");
|
||||
}
|
||||
|
||||
return m_ProcedureFsm.HasState<T>();
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 是否存在流程。
|
||||
/// </summary>
|
||||
/// <param name="procedureType">要检查的流程类型。</param>
|
||||
/// <returns>是否存在流程。</returns>
|
||||
public bool HasProcedure(Type procedureType)
|
||||
{
|
||||
if (m_ProcedureFsm == null)
|
||||
{
|
||||
throw new GameFrameworkException("You must initialize procedure first.");
|
||||
}
|
||||
|
||||
return m_ProcedureFsm.HasState(procedureType);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 获取流程。
|
||||
/// </summary>
|
||||
/// <typeparam name="T">要获取的流程类型。</typeparam>
|
||||
/// <returns>要获取的流程。</returns>
|
||||
public ProcedureBase GetProcedure<T>() where T : ProcedureBase
|
||||
{
|
||||
if (m_ProcedureFsm == null)
|
||||
{
|
||||
throw new GameFrameworkException("You must initialize procedure first.");
|
||||
}
|
||||
|
||||
return m_ProcedureFsm.GetState<T>();
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 获取流程。
|
||||
/// </summary>
|
||||
/// <param name="procedureType">要获取的流程类型。</param>
|
||||
/// <returns>要获取的流程。</returns>
|
||||
public ProcedureBase GetProcedure(Type procedureType)
|
||||
{
|
||||
if (m_ProcedureFsm == null)
|
||||
{
|
||||
throw new GameFrameworkException("You must initialize procedure first.");
|
||||
}
|
||||
|
||||
return (ProcedureBase)m_ProcedureFsm.GetState(procedureType);
|
||||
}
|
||||
}
|
||||
}
|
@@ -0,0 +1,11 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 001bd8b56e2fb744ebbabc52d38c0488
|
||||
MonoImporter:
|
||||
externalObjects: {}
|
||||
serializedVersion: 2
|
||||
defaultReferences: []
|
||||
executionOrder: 0
|
||||
icon: {instanceID: 0}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
@@ -0,0 +1,153 @@
|
||||
using System;
|
||||
using System.Collections;
|
||||
using UnityEngine;
|
||||
|
||||
namespace SHFrame
|
||||
{
|
||||
[DisallowMultipleComponent]
|
||||
public sealed class ProcedureModule : Module
|
||||
{
|
||||
private IProcedureManager m_ProcedureManager = null;
|
||||
private ProcedureBase m_EntranceProcedure = null;
|
||||
|
||||
[SerializeField] private string[] m_AvailableProcedureTypeNames = null;
|
||||
|
||||
[SerializeField] private string m_EntranceProcedureTypeName = null;
|
||||
|
||||
/// <summary>
|
||||
/// 获取当前流程。
|
||||
/// </summary>
|
||||
public ProcedureBase CurrentProcedure
|
||||
{
|
||||
get { return m_ProcedureManager.CurrentProcedure; }
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 获取当前流程持续时间。
|
||||
/// </summary>
|
||||
public float CurrentProcedureTime
|
||||
{
|
||||
get { return m_ProcedureManager.CurrentProcedureTime; }
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 游戏框架组件初始化。
|
||||
/// </summary>
|
||||
protected override void Awake()
|
||||
{
|
||||
base.Awake();
|
||||
|
||||
m_ProcedureManager = ModuleImpSystem.GetModule<IProcedureManager>();
|
||||
if (m_ProcedureManager == null)
|
||||
{
|
||||
Log.Fatal("Procedure manager is invalid.");
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
private IEnumerator Start()
|
||||
{
|
||||
ProcedureBase[] procedures = new ProcedureBase[m_AvailableProcedureTypeNames.Length];
|
||||
for (int i = 0; i < m_AvailableProcedureTypeNames.Length; i++)
|
||||
{
|
||||
Type procedureType = Utility.Assembly.GetType(m_AvailableProcedureTypeNames[i]);
|
||||
if (procedureType == null)
|
||||
{
|
||||
Log.Error("Can not find procedure type '{0}'.", m_AvailableProcedureTypeNames[i]);
|
||||
yield break;
|
||||
}
|
||||
|
||||
procedures[i] = (ProcedureBase)Activator.CreateInstance(procedureType);
|
||||
if (procedures[i] == null)
|
||||
{
|
||||
Log.Error("Can not create procedure instance '{0}'.", m_AvailableProcedureTypeNames[i]);
|
||||
yield break;
|
||||
}
|
||||
|
||||
if (m_EntranceProcedureTypeName == m_AvailableProcedureTypeNames[i])
|
||||
{
|
||||
m_EntranceProcedure = procedures[i];
|
||||
}
|
||||
}
|
||||
|
||||
if (m_EntranceProcedure == null)
|
||||
{
|
||||
Log.Error("Entrance procedure is invalid.");
|
||||
yield break;
|
||||
}
|
||||
|
||||
m_ProcedureManager.Initialize(ModuleImpSystem.GetModule<FSM.IFsmManager>(), procedures);
|
||||
yield return new WaitForEndOfFrame();
|
||||
m_ProcedureManager.StartProcedure(m_EntranceProcedure.GetType());
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 是否存在流程。
|
||||
/// </summary>
|
||||
/// <typeparam name="T">要检查的流程类型。</typeparam>
|
||||
/// <returns>是否存在流程。</returns>
|
||||
public bool HasProcedure<T>() where T : ProcedureBase
|
||||
{
|
||||
return m_ProcedureManager.HasProcedure<T>();
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 是否存在流程。
|
||||
/// </summary>
|
||||
/// <param name="procedureType">要检查的流程类型。</param>
|
||||
/// <returns>是否存在流程。</returns>
|
||||
public bool HasProcedure(Type procedureType)
|
||||
{
|
||||
return m_ProcedureManager.HasProcedure(procedureType);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 获取流程。
|
||||
/// </summary>
|
||||
/// <typeparam name="T">要获取的流程类型。</typeparam>
|
||||
/// <returns>要获取的流程。</returns>
|
||||
public ProcedureBase GetProcedure<T>() where T : ProcedureBase
|
||||
{
|
||||
return m_ProcedureManager.GetProcedure<T>();
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 获取流程。
|
||||
/// </summary>
|
||||
/// <param name="procedureType">要获取的流程类型。</param>
|
||||
/// <returns>要获取的流程。</returns>
|
||||
public ProcedureBase GetProcedure(Type procedureType)
|
||||
{
|
||||
return m_ProcedureManager.GetProcedure(procedureType);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 重启流程。
|
||||
/// <remarks>默认使用第一个流程作为启动流程。</remarks>
|
||||
/// </summary>
|
||||
/// <param name="defaultIndex"></param>
|
||||
/// <param name="procedures">新的的流程。</param>
|
||||
/// <returns>是否重启成功。</returns>
|
||||
/// <exception cref="GameFrameworkException">重启异常。</exception>
|
||||
public bool RestartProcedure(int defaultIndex, params ProcedureBase[] procedures)
|
||||
{
|
||||
if (procedures == null || procedures.Length <= 0)
|
||||
{
|
||||
throw new GameFrameworkException("RestartProcedure Failed procedures is invalid.");
|
||||
}
|
||||
|
||||
FSM.IFsmManager fsmManager = ModuleImpSystem.GetModule<FSM.IFsmManager>();
|
||||
|
||||
if (!fsmManager.DestroyFsm<IProcedureManager>())
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
m_ProcedureManager = null;
|
||||
m_ProcedureManager = ModuleImpSystem.GetModule<IProcedureManager>();
|
||||
m_ProcedureManager.Initialize(fsmManager, procedures);
|
||||
m_ProcedureManager.StartProcedure(procedures[defaultIndex].GetType());
|
||||
return true;
|
||||
}
|
||||
}
|
||||
}
|
@@ -0,0 +1,11 @@
|
||||
fileFormatVersion: 2
|
||||
guid: f8594aafa061b684a936aed29f6be663
|
||||
MonoImporter:
|
||||
externalObjects: {}
|
||||
serializedVersion: 2
|
||||
defaultReferences: []
|
||||
executionOrder: 0
|
||||
icon: {instanceID: 0}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
Reference in New Issue
Block a user