| 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;
 
- 		}
 
- 	}
 
- }
 
 
  |