StateMachine.cs 3.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142
  1. using System;
  2. using System.Collections;
  3. using System.Collections.Generic;
  4. namespace UniFramework.Machine
  5. {
  6. public class StateMachine
  7. {
  8. private readonly Dictionary<string, IStateNode> _nodes = new Dictionary<string, IStateNode>(100);
  9. private IStateNode _curNode;
  10. private IStateNode _preNode;
  11. /// <summary>
  12. /// 状态机持有者
  13. /// </summary>
  14. public System.Object Owner { private set; get; }
  15. /// <summary>
  16. /// 当前运行的节点名称
  17. /// </summary>
  18. public string CurrentNode
  19. {
  20. get { return _curNode != null ? _curNode.GetType().FullName : string.Empty; }
  21. }
  22. /// <summary>
  23. /// 之前运行的节点名称
  24. /// </summary>
  25. public string PreviousNode
  26. {
  27. get { return _preNode != null ? _preNode.GetType().FullName : string.Empty; }
  28. }
  29. private StateMachine() { }
  30. public StateMachine(System.Object owner)
  31. {
  32. Owner = owner;
  33. }
  34. /// <summary>
  35. /// 更新状态机
  36. /// </summary>
  37. public void Update()
  38. {
  39. if (_curNode != null)
  40. _curNode.OnUpdate();
  41. }
  42. /// <summary>
  43. /// 启动状态机
  44. /// </summary>
  45. public void Run<TNode>() where TNode : IStateNode
  46. {
  47. var nodeType = typeof(TNode);
  48. var nodeName = nodeType.FullName;
  49. Run(nodeName);
  50. }
  51. public void Run(Type entryNode)
  52. {
  53. var nodeName = entryNode.FullName;
  54. Run(nodeName);
  55. }
  56. public void Run(string entryNode)
  57. {
  58. _curNode = TryGetNode(entryNode);
  59. _preNode = _curNode;
  60. if (_curNode == null)
  61. throw new Exception($"Not found entry node: {entryNode }");
  62. _curNode.OnEnter();
  63. }
  64. /// <summary>
  65. /// 加入一个节点
  66. /// </summary>
  67. public void AddNode<TNode>() where TNode : IStateNode
  68. {
  69. var nodeType = typeof(TNode);
  70. var stateNode = Activator.CreateInstance(nodeType) as IStateNode;
  71. AddNode(stateNode);
  72. }
  73. public void AddNode(IStateNode stateNode)
  74. {
  75. if (stateNode == null)
  76. throw new ArgumentNullException();
  77. var nodeType = stateNode.GetType();
  78. var nodeName = nodeType.FullName;
  79. if (_nodes.ContainsKey(nodeName) == false)
  80. {
  81. stateNode.OnCreate(this);
  82. _nodes.Add(nodeName, stateNode);
  83. }
  84. else
  85. {
  86. UniLogger.Error($"State node already existed : {nodeName}");
  87. }
  88. }
  89. /// <summary>
  90. /// 转换状态节点
  91. /// </summary>
  92. public void ChangeState<TNode>() where TNode : IStateNode
  93. {
  94. var nodeType = typeof(TNode);
  95. var nodeName = nodeType.FullName;
  96. ChangeState(nodeName);
  97. }
  98. public void ChangeState(Type nodeType)
  99. {
  100. var nodeName = nodeType.FullName;
  101. ChangeState(nodeName);
  102. }
  103. public void ChangeState(string nodeName)
  104. {
  105. if (string.IsNullOrEmpty(nodeName))
  106. throw new ArgumentNullException();
  107. IStateNode node = TryGetNode(nodeName);
  108. if (node == null)
  109. {
  110. UniLogger.Error($"Can not found state node : {nodeName}");
  111. return;
  112. }
  113. UniLogger.Log($"{_curNode.GetType().FullName} --> {node.GetType().FullName}");
  114. _preNode = _curNode;
  115. _curNode.OnExit();
  116. _curNode = node;
  117. _curNode.OnEnter();
  118. }
  119. private IStateNode TryGetNode(string nodeName)
  120. {
  121. _nodes.TryGetValue(nodeName, out IStateNode result);
  122. return result;
  123. }
  124. }
  125. }