123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142 |
- using System;
- using System.Collections;
- using System.Collections.Generic;
- namespace UniFramework.Machine
- {
- public class StateMachine
- {
- private readonly Dictionary<string, IStateNode> _nodes = new Dictionary<string, IStateNode>(100);
- private IStateNode _curNode;
- private IStateNode _preNode;
- /// <summary>
- /// 状态机持有者
- /// </summary>
- public System.Object Owner { private set; get; }
- /// <summary>
- /// 当前运行的节点名称
- /// </summary>
- public string CurrentNode
- {
- get { return _curNode != null ? _curNode.GetType().FullName : string.Empty; }
- }
- /// <summary>
- /// 之前运行的节点名称
- /// </summary>
- public string PreviousNode
- {
- get { return _preNode != null ? _preNode.GetType().FullName : string.Empty; }
- }
- private StateMachine() { }
- public StateMachine(System.Object owner)
- {
- Owner = owner;
- }
- /// <summary>
- /// 更新状态机
- /// </summary>
- public void Update()
- {
- if (_curNode != null)
- _curNode.OnUpdate();
- }
- /// <summary>
- /// 启动状态机
- /// </summary>
- public void Run<TNode>() where TNode : IStateNode
- {
- var nodeType = typeof(TNode);
- var nodeName = nodeType.FullName;
- Run(nodeName);
- }
- public void Run(Type entryNode)
- {
- var nodeName = entryNode.FullName;
- Run(nodeName);
- }
- public void Run(string entryNode)
- {
- _curNode = TryGetNode(entryNode);
- _preNode = _curNode;
- if (_curNode == null)
- throw new Exception($"Not found entry node: {entryNode }");
- _curNode.OnEnter();
- }
- /// <summary>
- /// 加入一个节点
- /// </summary>
- public void AddNode<TNode>() where TNode : IStateNode
- {
- var nodeType = typeof(TNode);
- var stateNode = Activator.CreateInstance(nodeType) as IStateNode;
- AddNode(stateNode);
- }
- public void AddNode(IStateNode stateNode)
- {
- if (stateNode == null)
- throw new ArgumentNullException();
- var nodeType = stateNode.GetType();
- var nodeName = nodeType.FullName;
- if (_nodes.ContainsKey(nodeName) == false)
- {
- stateNode.OnCreate(this);
- _nodes.Add(nodeName, stateNode);
- }
- else
- {
- UniLogger.Error($"State node already existed : {nodeName}");
- }
- }
- /// <summary>
- /// 转换状态节点
- /// </summary>
- public void ChangeState<TNode>() where TNode : IStateNode
- {
- var nodeType = typeof(TNode);
- var nodeName = nodeType.FullName;
- ChangeState(nodeName);
- }
- public void ChangeState(Type nodeType)
- {
- var nodeName = nodeType.FullName;
- ChangeState(nodeName);
- }
- public void ChangeState(string nodeName)
- {
- if (string.IsNullOrEmpty(nodeName))
- throw new ArgumentNullException();
- IStateNode node = TryGetNode(nodeName);
- if (node == null)
- {
- UniLogger.Error($"Can not found state node : {nodeName}");
- return;
- }
- UniLogger.Log($"{_curNode.GetType().FullName} --> {node.GetType().FullName}");
- _preNode = _curNode;
- _curNode.OnExit();
- _curNode = node;
- _curNode.OnEnter();
- }
- private IStateNode TryGetNode(string nodeName)
- {
- _nodes.TryGetValue(nodeName, out IStateNode result);
- return result;
- }
- }
- }
|