//------------------------------------------------------------ // Game Framework // Copyright © 2013-2021 loyalsoft. All rights reserved. // Homepage: http://www.game7000.com/ // Feedback: http://www.game7000.com/ //------------------------------------------------------------ using System; using System.Collections.Generic; namespace GameFramework.Fsm { /// /// 有限状态机管理器。 /// internal sealed class FsmManager : GameFrameworkModule, IFsmManager { private readonly Dictionary m_Fsms; private readonly List m_TempFsms; /// /// 初始化有限状态机管理器的新实例。 /// public FsmManager() { m_Fsms = new Dictionary(); m_TempFsms = new List(); } /// /// 获取游戏框架模块优先级。 /// /// 优先级较高的模块会优先轮询,并且关闭操作会后进行。 internal override int Priority { get { return 1; } } /// /// 获取有限状态机数量。 /// public int Count { get { return m_Fsms.Count; } } /// /// 有限状态机管理器轮询。 /// /// 逻辑流逝时间,以秒为单位。 /// 真实流逝时间,以秒为单位。 internal override void Update(float elapseSeconds, float realElapseSeconds) { m_TempFsms.Clear(); if (m_Fsms.Count <= 0) { return; } foreach (KeyValuePair fsm in m_Fsms) { m_TempFsms.Add(fsm.Value); } foreach (FsmBase fsm in m_TempFsms) { if (fsm.IsDestroyed) { continue; } fsm.Update(elapseSeconds, realElapseSeconds); } } /// /// 关闭并清理有限状态机管理器。 /// internal override void Shutdown() { foreach (KeyValuePair fsm in m_Fsms) { fsm.Value.Shutdown(); } m_Fsms.Clear(); m_TempFsms.Clear(); } /// /// 检查是否存在有限状态机。 /// /// 有限状态机持有者类型。 /// 是否存在有限状态机。 public bool HasFsm() where T : class { return InternalHasFsm(new TypeNamePair(typeof(T))); } /// /// 检查是否存在有限状态机。 /// /// 有限状态机持有者类型。 /// 是否存在有限状态机。 public bool HasFsm(Type ownerType) { if (ownerType == null) { throw new GameFrameworkException("Owner type is invalid."); } return InternalHasFsm(new TypeNamePair(ownerType)); } /// /// 检查是否存在有限状态机。 /// /// 有限状态机持有者类型。 /// 有限状态机名称。 /// 是否存在有限状态机。 public bool HasFsm(string name) where T : class { return InternalHasFsm(new TypeNamePair(typeof(T), name)); } /// /// 检查是否存在有限状态机。 /// /// 有限状态机持有者类型。 /// 有限状态机名称。 /// 是否存在有限状态机。 public bool HasFsm(Type ownerType, string name) { if (ownerType == null) { throw new GameFrameworkException("Owner type is invalid."); } return InternalHasFsm(new TypeNamePair(ownerType, name)); } /// /// 获取有限状态机。 /// /// 有限状态机持有者类型。 /// 要获取的有限状态机。 public IFsm GetFsm() where T : class { return (IFsm)InternalGetFsm(new TypeNamePair(typeof(T))); } /// /// 获取有限状态机。 /// /// 有限状态机持有者类型。 /// 要获取的有限状态机。 public FsmBase GetFsm(Type ownerType) { if (ownerType == null) { throw new GameFrameworkException("Owner type is invalid."); } return InternalGetFsm(new TypeNamePair(ownerType)); } /// /// 获取有限状态机。 /// /// 有限状态机持有者类型。 /// 有限状态机名称。 /// 要获取的有限状态机。 public IFsm GetFsm(string name) where T : class { return (IFsm)InternalGetFsm(new TypeNamePair(typeof(T), name)); } /// /// 获取有限状态机。 /// /// 有限状态机持有者类型。 /// 有限状态机名称。 /// 要获取的有限状态机。 public FsmBase GetFsm(Type ownerType, string name) { if (ownerType == null) { throw new GameFrameworkException("Owner type is invalid."); } return InternalGetFsm(new TypeNamePair(ownerType, name)); } /// /// 获取所有有限状态机。 /// /// 所有有限状态机。 public FsmBase[] GetAllFsms() { int index = 0; FsmBase[] results = new FsmBase[m_Fsms.Count]; foreach (KeyValuePair fsm in m_Fsms) { results[index++] = fsm.Value; } return results; } /// /// 获取所有有限状态机。 /// /// 所有有限状态机。 public void GetAllFsms(List results) { if (results == null) { throw new GameFrameworkException("Results is invalid."); } results.Clear(); foreach (KeyValuePair fsm in m_Fsms) { results.Add(fsm.Value); } } /// /// 创建有限状态机。 /// /// 有限状态机持有者类型。 /// 有限状态机持有者。 /// 有限状态机状态集合。 /// 要创建的有限状态机。 public IFsm CreateFsm(T owner, params FsmState[] states) where T : class { return CreateFsm(owner.GetType().Name, owner, states); } /// /// 创建有限状态机。 /// /// 有限状态机持有者类型。 /// 有限状态机名称。 /// 有限状态机持有者。 /// 有限状态机状态集合。 /// 要创建的有限状态机。 public IFsm CreateFsm(string name, T owner, params FsmState[] states) where T : class { TypeNamePair typeNamePair = new TypeNamePair(typeof(T), name); if (HasFsm(name)) { throw new GameFrameworkException(Utility.Text.Format("Already exist FSM '{0}'.", typeNamePair)); } Fsm fsm = Fsm.Create(name, owner, states); m_Fsms.Add(typeNamePair, fsm); return fsm; } /// /// 创建有限状态机。 /// /// 有限状态机持有者类型。 /// 有限状态机持有者。 /// 有限状态机状态集合。 /// 要创建的有限状态机。 public IFsm CreateFsm(T owner, List> states) where T : class { return CreateFsm(string.Empty, owner, states); } /// /// 创建有限状态机。 /// /// 有限状态机持有者类型。 /// 有限状态机名称。 /// 有限状态机持有者。 /// 有限状态机状态集合。 /// 要创建的有限状态机。 public IFsm CreateFsm(string name, T owner, List> states) where T : class { TypeNamePair typeNamePair = new TypeNamePair(typeof(T), name); if (HasFsm(name)) { throw new GameFrameworkException(Utility.Text.Format("Already exist FSM '{0}'.", typeNamePair)); } Fsm fsm = Fsm.Create(name, owner, states); m_Fsms.Add(typeNamePair, fsm); return fsm; } /// /// 销毁有限状态机。 /// /// 有限状态机持有者类型。 /// 是否销毁有限状态机成功。 public bool DestroyFsm() where T : class { return InternalDestroyFsm(new TypeNamePair(typeof(T))); } /// /// 销毁有限状态机。 /// /// 有限状态机持有者类型。 /// 是否销毁有限状态机成功。 public bool DestroyFsm(Type ownerType) { if (ownerType == null) { throw new GameFrameworkException("Owner type is invalid."); } return InternalDestroyFsm(new TypeNamePair(ownerType)); } /// /// 销毁有限状态机。 /// /// 有限状态机持有者类型。 /// 要销毁的有限状态机名称。 /// 是否销毁有限状态机成功。 public bool DestroyFsm(string name) where T : class { return InternalDestroyFsm(new TypeNamePair(typeof(T), name)); } /// /// 销毁有限状态机。 /// /// 有限状态机持有者类型。 /// 要销毁的有限状态机名称。 /// 是否销毁有限状态机成功。 public bool DestroyFsm(Type ownerType, string name) { if (ownerType == null) { throw new GameFrameworkException("Owner type is invalid."); } return InternalDestroyFsm(new TypeNamePair(ownerType, name)); } /// /// 销毁有限状态机。 /// /// 有限状态机持有者类型。 /// 要销毁的有限状态机。 /// 是否销毁有限状态机成功。 public bool DestroyFsm(IFsm fsm) where T : class { if (fsm == null) { throw new GameFrameworkException("FSM is invalid."); } return InternalDestroyFsm(new TypeNamePair(typeof(T), fsm.Name)); } /// /// 销毁有限状态机。 /// /// 要销毁的有限状态机。 /// 是否销毁有限状态机成功。 public bool DestroyFsm(FsmBase fsm) { if (fsm == null) { throw new GameFrameworkException("FSM is invalid."); } return InternalDestroyFsm(new TypeNamePair(fsm.OwnerType, fsm.Name)); } private bool InternalHasFsm(TypeNamePair typeNamePair) { return m_Fsms.ContainsKey(typeNamePair); } private FsmBase InternalGetFsm(TypeNamePair typeNamePair) { FsmBase fsm = null; if (m_Fsms.TryGetValue(typeNamePair, out fsm)) { return fsm; } return null; } private bool InternalDestroyFsm(TypeNamePair typeNamePair) { FsmBase fsm = null; if (m_Fsms.TryGetValue(typeNamePair, out fsm)) { fsm.Shutdown(); return m_Fsms.Remove(typeNamePair); } return false; } } }