├── IState.cs ├── IStateMachine.cs ├── ITransition.cs ├── LState.cs ├── LStateMachine.cs ├── LTransition.cs └── README.md /IState.cs: -------------------------------------------------------------------------------- 1 | using UnityEngine; 2 | using System.Collections; 3 | using System.Collections.Generic; 4 | 5 | 6 | namespace FSM{ 7 | /// 8 | /// 状态接口 9 | /// 10 | public interface IState { 11 | 12 | /// 13 | /// 状态名 14 | /// 15 | /// 状态名 16 | string Name{get;} 17 | 18 | /// 19 | /// 状态标签 20 | /// 21 | /// 状态标签 22 | string Tag{ get; set; } 23 | 24 | /// 25 | /// 当前状态的状态机 26 | /// 27 | /// 状态机 28 | IStateMachine Parent{get;set;} 29 | 30 | /// 31 | /// 从进入状态开始计算的时长 32 | /// 33 | /// 时长 34 | float Timer{get;} 35 | 36 | /// 37 | /// 状态过渡 38 | /// 39 | /// 当前状态的所有过渡 40 | List Transitions{get;} 41 | 42 | /// 43 | /// 进入状态时的回调 44 | /// 45 | /// 上一个状态 46 | void EnterCallback (IState prev); 47 | 48 | /// 49 | /// 退出状态时的回调 50 | /// 51 | /// 下一个状态 52 | void ExitCallback (IState next); 53 | 54 | /// 55 | /// Update 的回调 56 | /// 57 | /// Time.deltaTime 58 | void UpdateCallback (float deltaTime); 59 | 60 | /// 61 | /// LateUpdate 的回调 62 | /// 63 | /// Time.deltaTime 64 | void LateUpdateCallback (float deltaTime); 65 | 66 | /// 67 | /// FixedUpdate 的回调 68 | /// 69 | void FixedUpdateCallback (); 70 | 71 | /// 72 | /// 添加过渡 73 | /// 74 | /// 状态过渡 75 | void AddTransition (ITransition t); 76 | } 77 | } 78 | -------------------------------------------------------------------------------- /IStateMachine.cs: -------------------------------------------------------------------------------- 1 | using UnityEngine; 2 | using System.Collections; 3 | 4 | namespace FSM{ 5 | /// 6 | /// 状态机接口 7 | /// 8 | public interface IStateMachine { 9 | 10 | /// 11 | /// 当前状态 12 | /// 13 | /// 状态机的当前状态 14 | IState CurrentState{ get; } 15 | 16 | /// 17 | /// 默认状态 18 | /// 19 | /// 状态机的默认状态 20 | IState DefaultState{ get; set; } 21 | 22 | /// 23 | /// 添加状态 24 | /// 25 | /// 要添加的状态 26 | void AddState (IState state); 27 | 28 | /// 29 | /// 删除状态 30 | /// 31 | /// 要删除的状态 32 | void RemoveState(IState state); 33 | 34 | /// 35 | /// 通过指定 Tag 值查找状态 36 | /// 37 | /// 查找到的状态 38 | /// 状态的 Tag 值 39 | IState GetStateWithTag(string tag); 40 | 41 | /// 42 | /// 添加任意状态切换过渡 43 | /// 44 | void AddAnyState(ITransition t); 45 | } 46 | } 47 | -------------------------------------------------------------------------------- /ITransition.cs: -------------------------------------------------------------------------------- 1 | using UnityEngine; 2 | using System.Collections; 3 | 4 | namespace FSM{ 5 | /// 6 | /// 用于状态过渡的接口 7 | /// 8 | public interface ITransition { 9 | 10 | /// 11 | /// 从哪个状态开始过渡 12 | /// 13 | /// 原状态 14 | IState From{get;set;} 15 | 16 | /// 17 | /// 要过渡到哪个状态 18 | /// 19 | /// 目标状态 20 | IState To{get;set;} 21 | 22 | /// 23 | /// 过渡名字 24 | /// 25 | /// 名字 26 | string Name{ get; set; } 27 | 28 | /// 29 | /// 过渡时的回调 30 | /// 31 | /// true, 过渡结束 false 继续进行过渡 32 | bool TransitionCallback(); 33 | 34 | /// 35 | /// 能否开始过渡 36 | /// 37 | /// true 开始进行过渡 false 不进行过渡 38 | bool ShouldBengin (); 39 | } 40 | } 41 | -------------------------------------------------------------------------------- /LState.cs: -------------------------------------------------------------------------------- 1 | using UnityEngine; 2 | using System.Collections; 3 | using System.Collections.Generic; 4 | 5 | namespace FSM{ 6 | 7 | public delegate void LStateDelegate(); 8 | public delegate void LStateDelegateState(IState state); 9 | public delegate void LStateDelegateFloat(float f); 10 | /// 11 | /// 实现 IState 接口 12 | /// 13 | public class LState : IState { 14 | 15 | /// 16 | /// 当进入状态时调用的事件 17 | /// 18 | public event LStateDelegateState OnEnter; 19 | 20 | /// 21 | /// 当离开状态时调用的事件 22 | /// 23 | public event LStateDelegateState OnExit; 24 | 25 | /// 26 | /// Update 时调用 27 | /// 28 | public event LStateDelegateFloat OnUpdate; 29 | 30 | /// 31 | /// LateUpdate 时调用 32 | /// 33 | public event LStateDelegateFloat OnLateUpdate; 34 | 35 | /// 36 | /// FixedUpdate 时调用 37 | /// 38 | public event LStateDelegate OnFixedUpdate; 39 | 40 | /// 41 | /// 状态名 42 | /// 43 | /// 状态名 44 | public string Name { 45 | get { 46 | return _name; 47 | } 48 | } 49 | /// 50 | /// 状态标签 51 | /// 52 | /// 状态标签 53 | public string Tag { 54 | get { 55 | return _tag; 56 | } 57 | set { 58 | _tag = value; 59 | } 60 | } 61 | 62 | /// 63 | /// 当前状态的状态机 64 | /// 65 | /// 状态机 66 | public IStateMachine Parent{ 67 | get { 68 | return _parent; 69 | } 70 | set { 71 | _parent = value; 72 | } 73 | } 74 | 75 | /// 76 | /// 从进入状态开始计算的时长 77 | /// 78 | /// 时长 79 | public float Timer{ 80 | get { 81 | return _timer; 82 | } 83 | } 84 | 85 | /// 86 | /// 状态过渡 87 | /// 88 | /// 当前状态的所有过渡 89 | public List Transitions{ 90 | get{ 91 | return _transitions; 92 | } 93 | } 94 | 95 | /// 96 | /// 添加过渡 97 | /// 98 | /// 状态过渡 99 | public void AddTransition(ITransition t){ 100 | if (t != null && !_transitions.Contains (t)) { 101 | _transitions.Add (t); 102 | } 103 | } 104 | 105 | /// 106 | /// 构造方法 107 | /// 108 | /// 状态名 109 | public LState(string name){ 110 | _name = name; 111 | _transitions = new List (); 112 | } 113 | 114 | /// 115 | /// 进入状态时的回调 116 | /// 117 | /// 上一个状态 118 | public virtual void EnterCallback (IState prev) 119 | { 120 | // 进入状态时调用 OnEnter 事件 121 | _timer = 0f; 122 | if (OnEnter != null) { 123 | OnEnter (prev); 124 | } 125 | } 126 | 127 | /// 128 | /// 退出状态时的回调 129 | /// 130 | /// 下一个状态 131 | public virtual void ExitCallback (IState next) 132 | { 133 | _timer = 0f; 134 | // 离开状态时调用 OnExit 事件 135 | if (OnExit != null) { 136 | OnExit (next); 137 | } 138 | } 139 | 140 | /// 141 | /// Update 的回调 142 | /// 143 | /// Time.deltaTime 144 | public virtual void UpdateCallback (float deltaTime) 145 | { 146 | _timer += deltaTime; 147 | // Update 时调用 OnUpdate 事件 148 | if (OnUpdate != null) { 149 | OnUpdate (deltaTime); 150 | } 151 | } 152 | 153 | /// 154 | /// LateUpdate 的回调 155 | /// 156 | /// Time.deltaTime 157 | public virtual void LateUpdateCallback (float deltaTime) 158 | { 159 | // LateUpdate 时调用 OnLateUpdate 事件 160 | if (OnLateUpdate != null) { 161 | OnLateUpdate (deltaTime); 162 | } 163 | } 164 | 165 | /// 166 | /// FixedUpdate 的回调 167 | /// 168 | public virtual void FixedUpdateCallback () 169 | { 170 | // FixedUpdate 时调用 OnFixedUpdate 事件 171 | if (OnFixedUpdate != null) { 172 | OnFixedUpdate (); 173 | } 174 | } 175 | 176 | private string _name; // 状态名 177 | private string _tag; // 状态标签 178 | private float _timer; // 计时器 179 | private IStateMachine _parent; //当前状态的状态机 180 | private List _transitions; //状态过渡 181 | } 182 | } 183 | -------------------------------------------------------------------------------- /LStateMachine.cs: -------------------------------------------------------------------------------- 1 | using UnityEngine; 2 | using System.Collections; 3 | using System.Collections.Generic; 4 | 5 | namespace FSM{ 6 | /// 7 | /// 状态机类,需要继承于状态类并实现状态机接口 8 | /// 9 | public class LStateMachine : LState, IStateMachine { 10 | 11 | /// 12 | /// 当前状态 13 | /// 14 | /// 状态机的当前状态 15 | public IState CurrentState { 16 | get { 17 | return _currentState; 18 | } 19 | } 20 | /// 21 | /// 默认状态 22 | /// 23 | /// 状态机的默认状态 24 | public IState DefaultState { 25 | get { 26 | return _defaultState; 27 | } 28 | set { 29 | AddState (value); 30 | _defaultState = value; 31 | } 32 | } 33 | 34 | /// 35 | /// 构造方法 36 | /// 37 | public LStateMachine(string name,IState defaultState) : base (name){ 38 | _states = new List (); 39 | _anyStateTransitions = new List(); 40 | _defaultState = defaultState; 41 | } 42 | 43 | /// 44 | /// 添加状态 45 | /// 46 | /// 要添加的状态 47 | public void AddState (IState state) 48 | { 49 | if (state != null && !_states.Contains (state)) { 50 | _states.Add (state); 51 | state.Parent = this; 52 | if (_defaultState==null) { 53 | _defaultState = state; 54 | } 55 | } 56 | } 57 | /// 58 | /// 删除状态 59 | /// 60 | /// 要删除的状态 61 | public void RemoveState (IState state){ 62 | // 状态机运行过程中,不能删除当前状态 63 | if (_currentState == state) { 64 | return; 65 | } 66 | if (state != null && _states.Contains (state)) { 67 | _states.Remove (state); 68 | state.Parent = null; 69 | if (_defaultState == state) { 70 | _defaultState = (_states.Count >= 1) ? _states [0] : null; 71 | } 72 | } 73 | } 74 | /// 75 | /// 通过指定 Tag 值查找状态 76 | /// 77 | /// 查找到的状态 78 | /// 状态的 Tag 值 79 | public IState GetStateWithTag (string tag) 80 | { 81 | return null; 82 | } 83 | 84 | /// 85 | /// 进入状态时的回调 86 | /// 87 | /// 上一个状态 88 | public override void EnterCallback (IState prev) 89 | { 90 | base.EnterCallback (prev); 91 | _currentState.EnterCallback (prev); 92 | } 93 | 94 | /// 95 | /// 退出状态时的回调 96 | /// 97 | /// 下一个状态 98 | public override void ExitCallback (IState next) 99 | { 100 | base.ExitCallback (next); 101 | _currentState.ExitCallback (next); 102 | } 103 | 104 | /// 105 | /// Update 的回调 106 | /// 107 | /// Time.deltaTime 108 | public override void UpdateCallback (float deltaTime) 109 | { 110 | if (_isTransition) { 111 | if (_t.TransitionCallback()) { 112 | DoTransition (_t); 113 | _isTransition = false; 114 | } 115 | return; 116 | } 117 | 118 | base.UpdateCallback (deltaTime); 119 | 120 | int count = _anyStateTransitions.Count; 121 | 122 | if (_currentState == null) { 123 | _currentState = _defaultState; 124 | } 125 | 126 | for (int i = 0; i < count; i++) 127 | { 128 | ITransition t = _anyStateTransitions [i]; 129 | if (t.To!= _currentState && t.ShouldBengin()) 130 | { 131 | _isTransition = true; 132 | _t = t; 133 | return; 134 | } 135 | } 136 | 137 | List ts = _currentState.Transitions; 138 | count = ts.Count; 139 | for (int i = 0; i < count; i++) { 140 | ITransition t = ts [i]; 141 | if (t.ShouldBengin()) { 142 | _isTransition = true; 143 | _t = t; 144 | return; 145 | } 146 | } 147 | _currentState.UpdateCallback (deltaTime); 148 | } 149 | 150 | /// 151 | /// LateUpdate 的回调 152 | /// 153 | /// Time.deltaTime 154 | public override void LateUpdateCallback (float deltaTime) 155 | { 156 | if (_isTransition) { 157 | if (_t.TransitionCallback()) { 158 | DoTransition (_t); 159 | _isTransition = false; 160 | } 161 | return; 162 | } 163 | base.LateUpdateCallback (deltaTime); 164 | 165 | if (_currentState == null) { 166 | _currentState = _defaultState; 167 | } 168 | 169 | int count = _anyStateTransitions.Count; 170 | for (int i = 0; i < count; i++) 171 | { 172 | ITransition t = _anyStateTransitions [i]; 173 | if (t.To!= _currentState && t.ShouldBengin()) 174 | { 175 | _isTransition = true; 176 | _t = t; 177 | return; 178 | } 179 | } 180 | List ts = _currentState.Transitions; 181 | count = ts.Count; 182 | for (int i = 0; i < count; i++) { 183 | ITransition t = ts [i]; 184 | if (t.ShouldBengin()) { 185 | _isTransition = true; 186 | _t = t; 187 | return; 188 | } 189 | } 190 | _currentState.LateUpdateCallback (deltaTime); 191 | } 192 | 193 | /// 194 | /// FixedUpdate 的回调 195 | /// 196 | public override void FixedUpdateCallback () 197 | { 198 | if (_isTransition) { 199 | if (_t.TransitionCallback()) { 200 | DoTransition (_t); 201 | _isTransition = false; 202 | } 203 | return; 204 | } 205 | base.FixedUpdateCallback (); 206 | 207 | if (_currentState == null) { 208 | _currentState = _defaultState; 209 | } 210 | 211 | int count = _anyStateTransitions.Count; 212 | for (int i = 0; i < count; i++) 213 | { 214 | ITransition t = _anyStateTransitions [i]; 215 | if (t.To!= _currentState && t.ShouldBengin()) 216 | { 217 | _isTransition = true; 218 | _t = t; 219 | return; 220 | } 221 | } 222 | 223 | List ts = _currentState.Transitions; 224 | count = ts.Count; 225 | for (int i = 0; i < count; i++) { 226 | ITransition t = ts [i]; 227 | if (t.ShouldBengin()) { 228 | _isTransition = true; 229 | _t = t; 230 | return; 231 | } 232 | } 233 | _currentState.FixedUpdateCallback (); 234 | } 235 | 236 | private IState _tempState; 237 | // 开始进行过渡 238 | private void DoTransition(ITransition t){ 239 | _tempState = _currentState; 240 | _currentState.ExitCallback (t.To); 241 | _currentState = t.To; 242 | if (t.From != null) 243 | { 244 | _tempState = t.From; 245 | } 246 | _currentState.EnterCallback(_tempState); 247 | } 248 | 249 | private IState _currentState; // 当前状态 250 | private IState _defaultState; // 默认状态 251 | private List _states; // 所有状态 252 | 253 | 254 | private bool _isTransition=false; // 是否在过渡 255 | private ITransition _t; // 当前正在执行的过渡 256 | 257 | private List _anyStateTransitions; // 任何状态下的过渡 258 | 259 | public void AddAnyState(ITransition t) 260 | { 261 | if (_anyStateTransitions.Contains(t)) 262 | return; 263 | t.From = null; 264 | _anyStateTransitions.Add(t); 265 | } 266 | } 267 | } 268 | -------------------------------------------------------------------------------- /LTransition.cs: -------------------------------------------------------------------------------- 1 | using UnityEngine; 2 | using System.Collections; 3 | 4 | namespace FSM{ 5 | 6 | public delegate bool LTransitionDelegate(); 7 | 8 | /// 9 | /// 用于进行状态过渡 10 | /// 11 | public class LTransition : ITransition { 12 | 13 | public event LTransitionDelegate OnTransition; 14 | public event LTransitionDelegate OnCheck; 15 | 16 | /// 17 | /// 从哪个状态开始过渡 18 | /// 19 | /// 原状态 20 | public IState From { 21 | get { 22 | return _from; 23 | } 24 | set { 25 | _from = value; 26 | } 27 | } 28 | 29 | /// 30 | /// 要过渡到哪个状态 31 | /// 32 | /// 目标状态 33 | public IState To { 34 | get { 35 | return _to; 36 | } 37 | set { 38 | _to = value; 39 | } 40 | } 41 | /// 42 | /// 过渡名字 43 | /// 44 | /// 名字 45 | public string Name { 46 | get { 47 | return _name; 48 | } 49 | set { 50 | _name = value; 51 | } 52 | } 53 | 54 | /// 55 | /// 构造方法 56 | /// 57 | public LTransition(string name,IState fromState,IState toState){ 58 | _name = name; 59 | _from = fromState; 60 | _to = toState; 61 | } 62 | 63 | /// 64 | /// 过渡时进行的回调 65 | /// 66 | /// true, 过渡结束 , false 继续进行过渡 67 | public bool TransitionCallback(){ 68 | if (OnTransition != null) { 69 | return OnTransition(); 70 | } 71 | return true; 72 | } 73 | 74 | public bool ShouldBengin (){ 75 | if (OnCheck!=null) { 76 | return OnCheck (); 77 | } 78 | return false; 79 | } 80 | 81 | private IState _from; // 原状态 82 | private IState _to; // 目标状态 83 | private string _name; // 过渡名 84 | 85 | } 86 | } 87 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # UnityFramework_FSM 2 | 对Unity有限状态机的封装 3 | --------------------------------------------------------------------------------