godot2D游戏教程系列二(15)

前言:

完成目标:

成功搭建了玩家角色的"状态机框架",用于管理角色行为切换。


一、理解状态机作用

  • 用来管理角色不同状态(Idle、Run 等)
  • 代替大量 if 判断
  • 让逻辑更清晰、更好维护

简单理解:

  • StateMachine = 大脑
  • Idle / Run = 具体行为

二、搭建节点结构

在玩家场景中:

  • 添加父节点 StateMachine
  • 添加子节点:
  • ​Idle​
  • ​Run​

形成结构:

复制代码
Player
 └── StateMachine
      ├── Idle
      └── Run

三、创建脚本结构

建立三类脚本:

1️⃣ State.gd(状态基类)
  • 所有状态的"模板"
  • 定义公共函数:
  • enter()
  • exit()
  • process()
  • physics_process()
  • 不挂在任何节点上
  • 供其他状态继承

2️⃣ state_machine.gd(状态管理器)
  • 挂在 StateMachine 节点
  • 负责:
  • 记录当前状态
  • 切换状态
  • 调用状态函数

3️⃣ Idle.gd / Run.gd(具体状态)
  • 挂在对应子节点
  • 继承 State.gd
  • 写具体逻辑:
  • Idle:播放站立动画
  • Run:处理移动逻辑

四、结构效果

  • 游戏开始 → 进入 Idle
  • 每帧更新:
  • _process → 处理输入、判断切换
  • _physics_process → 处理移动

最终成果:

成功建立了一个:

  • 清晰分层
  • 可扩展
  • 易维护
  • 可随时增加新状态(Jump、Attack等)

的玩家状态机系统框架。

实现过程:

  • 状态机(State Machine)的核心作用是通过结构化的方式管理对象在不同状态间的转换,确保行为逻辑清晰、可维护,并避免复杂条件判断带来的混乱。
  • 说人话就是使用状态机一个工具去管理比如玩家角色状态的变化,比如说从走到跑,从跑到跳之类的变化,不再使用简单的if判断进行变化
  • 状态机的概念
  • 想象你在玩一个 RPG 游戏:
  • 状态机是"大脑",决定角色现在该做什么(站立、跑步、攻击)。
  • 状态是具体的行为:
  • IdleState:播放站立动画,检测"按方向键→跑步"。
  • RunState:播放跑步动画,检测"松开方向键→站立"。
  • 初始化:游戏开始时,角色默认进入 IdleState。
  • 每帧更新:
  • 物理更新(_physics_process):处理移动、重力。
  • 逻辑更新(_process):检查输入、切换状态。
  • 给状态机设置基础节点和脚本,我们将不同的状态分解为不同的状态节点,并且需要一个父节点来容纳所有的状态节点,这个父节点将作为状态机本身
  • 我们选择玩家场景的根节点,添加新的node节点。node节点是Godot中所有其他节点都继承的基础节点类型,然后重命名为StateMachine状态机、
  • 然后我们为这个状态机节点添加新的子节点,并且重命名为Idle空闲状态
  • 继续添加新的node子节点,重命名为Run节点
  • 接下来我们创建状态机脚本,选择状态机节点,点击添加脚本,我们的脚本存储位置那里新建一个StateMachine文件夹把脚本放进去
  • 我们先创建一个脚本作为角色所有状态的基础类,这样所有的状态脚本都将继承这个基础类,我们不需要把这个基础类附加到任何节点上,所以我们直接去文件夹里创建一个脚本文件.我们选择脚本文件夹下的状态机文件夹,然后在状态机文件夹上右键点击新建一个State的脚本。每当我们为角色创建一个新状态时都会从这个状态脚本继承
  • 然后我们回到state_machine.gd脚本代码中,在顶部,我们使用关键字 class__name 来添加一个类名
  • 然后我们来到State.gd脚本文件夹进行创建一个类,然后获取附加在其父节点上的状态机脚本,然后创建几个函数可以给其他脚本进行继承复用
  • 然后我们会看到就是有一行黄色警告这个是因为我们没有使用delta,所以我们直接点击忽视就好了,然后上面会多一行代码这个就不用管
  • 我们接着给我们给state脚本文件写函数
  • 我们再次在状态机文件夹那里新建一个文件夹,将文件夹命名为玩家状态,我们将把所有玩家的状态都保存在这个文件夹里
  • 然后为2个子节点的状态添加新的脚本,让我们选择我们的状态类并点击继承,我们可以看到state右边有一个脚本图标,这意味着这个类是在脚本中定义的。并且将状态保存到我们新建的玩家状态文件夹里面
  • State.gd 是状态的基类(模板),负责定义所有状态共有的行为(如 enter()、exit() 方法),不附加到任何节点,仅用于其他状态脚本继承。
  • state_machine.gd 是状态的管理者,负责控制状态切换、维护当前状态以及处理外部输入,附加到状态机容器节点(例如名为 StateMachine 的节点)。
  • Idle.gd / Run.gd 是具体状态脚本,负责实现特定状态的逻辑(例如"空闲时播放动画"或"奔跑时移动角色"),附加到对应的子节点(例如名为 Idle 或 Run 的节点)。
相关推荐
stm32 菜鸟14 分钟前
nucleo-f411re学习记录-12,Wifi模块ESP8684
学习
stm32 菜鸟2 小时前
nucleo-f411re学习记录-9,双轴XY摇杆传感器
学习
南子北游2 小时前
Python学习(基础语法1)
开发语言·python·学习
Yeh2020583 小时前
cookie与Session笔记
笔记
Atri厨4 小时前
X86存储器的段描述符学习随笔
学习
星幻元宇VR4 小时前
VR航空航天科普设备助力航天知识普及
人工智能·科技·学习·安全·vr·虚拟现实
d111111111d4 小时前
STM32-UART封装问题解析
笔记·stm32·单片机·嵌入式硬件·学习·算法
寒秋花开曾相惜4 小时前
(学习笔记)4.2 逻辑设计和硬件控制语言HCL(4.2.1 逻辑门&4.2.2 组合电路和HCL布尔表达式)
linux·网络·数据结构·笔记·学习·fpga开发
yuanpan5 小时前
Python Pygame 入门教程:从零学会创建窗口、绘图和游戏交互
python·游戏·pygame
叶子野格5 小时前
《C语言学习:指针》12
c语言·开发语言·c++·学习·visual studio