mirror of https://github.com/tuyoogame/YooAsset
121 lines
2.4 KiB
C#
121 lines
2.4 KiB
C#
using System;
|
|
using System.Collections;
|
|
using System.Collections.Generic;
|
|
|
|
/// <summary>
|
|
/// 有限状态机
|
|
/// </summary>
|
|
public static class FsmManager
|
|
{
|
|
private static readonly List<IFsmNode> _nodes = new List<IFsmNode>();
|
|
private static IFsmNode _curNode;
|
|
private static IFsmNode _preNode;
|
|
|
|
/// <summary>
|
|
/// 当前运行的节点名称
|
|
/// </summary>
|
|
public static string CurrentNodeName
|
|
{
|
|
get { return _curNode != null ? _curNode.Name : string.Empty; }
|
|
}
|
|
|
|
/// <summary>
|
|
/// 之前运行的节点名称
|
|
/// </summary>
|
|
public static string PreviousNodeName
|
|
{
|
|
get { return _preNode != null ? _preNode.Name : string.Empty; }
|
|
}
|
|
|
|
|
|
/// <summary>
|
|
/// 启动状态机
|
|
/// </summary>
|
|
/// <param name="entryNode">入口节点</param>
|
|
public static void Run(string entryNode)
|
|
{
|
|
_curNode = GetNode(entryNode);
|
|
_preNode = GetNode(entryNode);
|
|
|
|
if (_curNode != null)
|
|
_curNode.OnEnter();
|
|
else
|
|
UnityEngine.Debug.LogError($"Not found entry node : {entryNode}");
|
|
}
|
|
|
|
/// <summary>
|
|
/// 更新状态机
|
|
/// </summary>
|
|
public static void Update()
|
|
{
|
|
if (_curNode != null)
|
|
_curNode.OnUpdate();
|
|
}
|
|
|
|
/// <summary>
|
|
/// 加入一个节点
|
|
/// </summary>
|
|
public static void AddNode(IFsmNode node)
|
|
{
|
|
if (node == null)
|
|
throw new ArgumentNullException();
|
|
|
|
if (_nodes.Contains(node) == false)
|
|
{
|
|
_nodes.Add(node);
|
|
}
|
|
else
|
|
{
|
|
UnityEngine.Debug.LogWarning($"Node {node.Name} already existed");
|
|
}
|
|
}
|
|
|
|
/// <summary>
|
|
/// 转换节点
|
|
/// </summary>
|
|
public static void Transition(string nodeName)
|
|
{
|
|
if (string.IsNullOrEmpty(nodeName))
|
|
throw new ArgumentNullException();
|
|
|
|
IFsmNode node = GetNode(nodeName);
|
|
if (node == null)
|
|
{
|
|
UnityEngine.Debug.LogError($"Can not found node {nodeName}");
|
|
return;
|
|
}
|
|
|
|
UnityEngine.Debug.Log($"FSM change {_curNode.Name} to {node.Name}");
|
|
_preNode = _curNode;
|
|
_curNode.OnExit();
|
|
_curNode = node;
|
|
_curNode.OnEnter();
|
|
}
|
|
|
|
/// <summary>
|
|
/// 返回到之前的节点
|
|
/// </summary>
|
|
public static void RevertToPreviousNode()
|
|
{
|
|
Transition(PreviousNodeName);
|
|
}
|
|
|
|
private static bool IsContains(string nodeName)
|
|
{
|
|
for (int i = 0; i < _nodes.Count; i++)
|
|
{
|
|
if (_nodes[i].Name == nodeName)
|
|
return true;
|
|
}
|
|
return false;
|
|
}
|
|
private static IFsmNode GetNode(string nodeName)
|
|
{
|
|
for (int i = 0; i < _nodes.Count; i++)
|
|
{
|
|
if (_nodes[i].Name == nodeName)
|
|
return _nodes[i];
|
|
}
|
|
return null;
|
|
}
|
|
} |