| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338 |
- using UnityEngine;
- using System.Collections;
- using System.Collections.Generic;
- using System.Reflection;
- /// <summary>
- /// 状态接口
- /// </summary>
- public interface IState
- {
- /// <summary>
- /// 状态进入状态栈
- /// </summary>
- void OnStateEnter();
- /// <summary>
- /// 状态退出状态栈
- /// </summary>
- void OnStateLeave();
- /// <summary>
- /// 状态由栈顶变成非栈顶
- /// </summary>
- void OnStateOverride();
- /// <summary>
- /// 状态由非栈顶变成栈顶
- /// </summary>
- void OnStateResume();
- string name { get; }
- }
- public abstract class BaseState : IState
- {
- public virtual void OnStateEnter() { }
- public virtual void OnStateLeave() { }
- public virtual void OnStateOverride() { }
- public virtual void OnStateResume() { }
- public virtual string name { get { return GetType().Name; } }
- }
- /// <summary>
- /// 状态机
- /// </summary>
- public class StateMachine
- {
- // 状态名-已注册的状态
- private Dictionary<string, IState> _registedState = new Dictionary<string, IState>();
- // 状态堆栈
- private Stack<IState> _stateStack = new Stack<IState>();
- public IState tarState { get; private set; }
- public void RegisterState(string name, IState state)
- {
- if (name == null || state == null)
- {
- return;
- }
- if (_registedState.ContainsKey(name))
- {
- return;
- }
- _registedState.Add(name, state);
- }
- public ClassEnumerator RegisterStateByAttributes<TAttributeType>(Assembly InAssembly, params object[] args)
- where TAttributeType : AutoRegisterAttribute
- {
- var Classes = new ClassEnumerator(
- typeof(TAttributeType),
- typeof(IState),
- InAssembly);
- var Iter = Classes.results.GetEnumerator();
- while( Iter.MoveNext() )
- {
- var StateType = Iter.Current;
- IState StateObj = (IState)System.Activator.CreateInstance(StateType, args);
- RegisterState(StateObj, StateObj.name);
- }
- return Classes;
- }
- public ClassEnumerator RegisterStateByAttributes<TAttributeType>(Assembly InAssembly)
- where TAttributeType : AutoRegisterAttribute
- {
- var Classes = new ClassEnumerator(
- typeof(TAttributeType),
- typeof(IState),
- InAssembly);
- var Iter = Classes.results.GetEnumerator();
- while (Iter.MoveNext())
- {
- var StateType = Iter.Current;
- IState StateObj = (IState)System.Activator.CreateInstance(StateType);
- RegisterState(StateObj, StateObj.name);
- }
- return Classes;
- }
- public void RegisterState<TStateImplType>(TStateImplType State, string name)
- where TStateImplType : IState
- {
- RegisterState(name, State);
- }
- /// <summary>
- /// 注销状态
- /// </summary>
- /// <param name="name">状态名</param>
- /// <returns>被注销的状态</returns>
- public IState UnregisterState(string name)
- {
- if (name == null)
- {
- return default(IState);
- }
- IState state;
- if (!_registedState.TryGetValue(name, out state))
- {
- return default(IState);
- }
- _registedState.Remove(name);
- return state;
- }
- /// <summary>
- /// 获取状态
- /// </summary>
- /// <param name="name">状态名</param>
- /// <returns>状态</returns>
- public IState GetState(string name)
- {
- if (null == name)
- {
- return default(IState);
- }
- IState state;
- return _registedState.TryGetValue(name, out state) ? state : default(IState);
- }
- public string GetStateName(IState state)
- {
- if (null == state)
- {
- return null;
- }
- var etr = _registedState.GetEnumerator();
- KeyValuePair<string, IState> pair;
- while (etr.MoveNext())
- {
- pair = etr.Current;
- if (pair.Value == state)
- {
- return pair.Key;
- }
- }
- return null;
- }
- /// <summary>
- /// 压入状态
- /// </summary>
- /// <param name="state">状态</param>
- public void Push(IState state)
- {
- if (state == null)
- {
- return;
- }
- if (_stateStack.Count > 0)
- {
- _stateStack.Peek().OnStateOverride();
- }
- _stateStack.Push(state);
- state.OnStateEnter();
- }
- /// <summary>
- /// 压入状态
- /// </summary>
- /// <param name="name">状态名</param>
- public void Push(string name)
- {
- if (name == null)
- {
- return;
- }
- IState state;
- if (!_registedState.TryGetValue(name, out state))
- {
- return;
- }
- Push(state);
- }
- /// <summary>
- /// 弹出状态
- /// </summary>
- /// <returns>被弹出的状态</returns>
- public IState PopState()
- {
- if (_stateStack.Count <= 0)
- {
- return default(IState);
- }
- IState state = _stateStack.Pop();
- state.OnStateLeave();
- if (_stateStack.Count > 0)
- {
- _stateStack.Peek().OnStateResume();
- }
- return state;
- }
- /// <summary>
- /// 修改栈顶状态
- /// </summary>
- /// <param name="state">新栈顶状态</param>
- /// <returns>原栈顶状态</returns>
- public IState ChangeState(IState state)
- {
- if (state == null)
- {
- return default(IState);
- }
- tarState = state;
- IState oldState = default(IState);
- if (_stateStack.Count > 0)
- {
- oldState = _stateStack.Pop();
- oldState.OnStateLeave();
- }
- _stateStack.Push(state);
- state.OnStateEnter();
- return oldState;
- }
- /// <summary>
- /// 修改栈顶状态
- /// </summary>
- /// <param name="name">新栈顶状态名</param>
- /// <returns>原栈顶状态</returns>
- public IState ChangeState(string name)
- {
- if (name == null)
- {
- DebugHelper.LogWarning("没有状态机类型,使用默认类型:");
- return default(IState);
- }
- IState state;
- if (!_registedState.TryGetValue(name, out state))
- {
- DebugHelper.LogError("找不到状态机类:" + name);
- return default(IState);
- }
- return ChangeState(state);
- }
- /// <summary>
- /// 获取栈顶状态
- /// </summary>
- /// <returns>栈顶状态</returns>
- public IState TopState()
- {
- if (_stateStack.Count <= 0)
- {
- return default(IState);
- }
- return _stateStack.Peek();
- }
- public string TopStateName()
- {
- if (_stateStack.Count <= 0)
- {
- return null;
- }
- IState state = _stateStack.Peek();
- return GetStateName(state);
- }
- /// <summary>
- /// 清空堆栈
- /// </summary>
- public void Clear()
- {
- while (_stateStack.Count > 0)
- {
- _stateStack.Pop().OnStateLeave();
- }
- }
- public int Count { get { return _stateStack.Count; } }
- }
|