Unity基于状态机的架构与设计

本文介绍了如何使用状态机进行游戏流程控制,通过一个简单的案例展示了状态机节点的创建和切换。文章详细讲解了状态机的设计,包括与项目无关的IFsmNode接口和FiniteStateMachine管理类,以及与游戏项目相关的状态机节点实现步骤。最后讨论了状态机的扩展应用,如顺序执行状态机ProcedureFsm,以帮助开发者更好地管理和维护游戏逻辑。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

我们做游戏的时候经常会有流程控制,流程控制的方法有很多,行为决策树,状态机等。本质差别都不大,就是把每一段执行逻辑做成一个一个的节点,根据条件执行某个节点,切换到某个节点。今天给大家分享一下基于状态机来做游戏流程的控制。

对啦!这里有个游戏开发交流小组里面聚集了一帮热爱学习游戏的零基础小白,也有一些正在从事游戏开发的技术大佬,欢迎你来交流学习

1 一个简单的状态机案例

我们先来拆解一个使用案例,通过这个案例让大家对状态机的流程控制有一个基本的了解。首先我们来构建一些状态节点,放入到状态机中。编写伪代码如下:

创建一个状态机: 

初始化逻辑节点NodeInit,用来做初始化的逻辑控制, NodeLogin,用来做登录场景的逻辑控制, NodeTown节点用来做游戏战斗场景的逻辑控制。

1.png

每个状态机节点,都有几个统一的固定的入口,这些入口如何设计与行业相关,比如我们的游戏行业,设计状态机节点接口一般如下:

 public interface IFsmNode
	{
		/// <summary>
		/// 节点名称
		/// </summary>
		string Name { get; }

		void OnEnter();
		void OnUpdate();
		void OnFixedUpdate();
		void OnExit();
		void OnHandleMessage(object msg);
	}

Name: 状态机节点的名字;

每个状态机节点,都实现IFsmNode所对应的接口,放入到状态机中统一管理。案例中我们在游戏开始时先执行NodeInit状态节点,完成游戏的初始化。

 	public void StartGame()
	{
		_fsm.Run(nameof(NodeInit));
	}

先来看NodeInit节点处理的逻辑,NodeInit只在OnEnter里面实现了初始化的相关逻辑,其它接口,没有任何逻辑处理。代码如下

 	void IFsmNode.OnEnter()
	{
		AudioPlayerSetting.InitAudioSetting();

		// 使用协程初始化
		this.StartCoroutine(Init());
	}

	pri
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值