Unity资源管理系统 ——YooAsset学习笔记(二)有限状态机管理器FsmManager

YooAsset学习笔记系列

什么是YooAsset:https://github.com/tuyoogame/YooAsset/tree/main
事件管理器EventManager
有限状态机管理器FsmManager



前言

一个比较简单的有限状态机,直接在代码里加注释了。

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;
	}
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值