//-------------------------------------------------- // Motion Framework // Copyright©2019-2020 何冠峰 // Licensed under the MIT license //-------------------------------------------------- using System.Collections.Generic; namespace MotionFramework.AI { /// /// 流程状态机 /// public class ProcedureFsm { private readonly List _nodeNames = new List(); private readonly FiniteStateMachine _fsm = new FiniteStateMachine(); /// /// 当前运行的节点名称 /// public string Current { get { return _fsm.CurrentNodeName; } } /// /// 之前运行的节点名称 /// public string Previous { get { return _fsm.PreviousNodeName; } } /// /// 添加一个流程节点 /// 注意:流程节点会按照添加的先后顺序执行 /// public void AddNode(IFsmNode node) { _fsm.AddNode(node); if (_nodeNames.Contains(node.Name) == false) _nodeNames.Add(node.Name); } /// /// 运行流程系统 /// public void Run() { if (_nodeNames.Count > 0) _fsm.Run(_nodeNames[0]); else MotionLog.Warning("Procedure system dont has any node."); } /// /// 更新流程系统 /// public void Update() { _fsm.Update(); } /// /// 切换流程节点 /// public void Switch(string nodeName) { _fsm.Transition(nodeName); } /// /// 切换至下个流程节点 /// public void SwitchNext() { int index = _nodeNames.IndexOf(_fsm.CurrentNodeName); if (index >= _nodeNames.Count - 1) { MotionLog.Warning($"Current node {_fsm.CurrentNodeName} is end node."); } else { Switch(_nodeNames[index + 1]); } } /// /// 切换至上个流程节点 /// public void SwitchLast() { int index = _nodeNames.IndexOf(_fsm.CurrentNodeName); if (index <= 0) { MotionLog.Warning($"Current node {_fsm.CurrentNodeName} is begin node."); } else { Switch(_nodeNames[index - 1]); } } } }