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 的节点)。
相关推荐
H Journey1 小时前
学习OpenCV之HSV 颜色模式
人工智能·opencv·学习·hsv
菜菜小狗的学习笔记1 小时前
黑马程序员java web学习笔记--项目部署(Linux)
笔记·学习
charlie1145141911 小时前
通用GUI编程技术——Win32 原生编程实战(五)——ListView 控件详解
windows·学习·gui·win32·编程指南
承渊政道2 小时前
C++学习之旅【智能指针的使⽤及其原理】
开发语言·c++·笔记·vscode·学习·visual studio
承渊政道2 小时前
C++学习之旅【异常相关内容以及类型转换介绍】
c语言·c++·笔记·vscode·学习·macos·visual studio
飞Link2 小时前
洞察数据的“分寸感”:深度解析对比学习(Contrastive Learning)
开发语言·python·学习·数据挖掘
承渊政道2 小时前
C++学习之旅【深入回溯C++11的发展历程】
c语言·c++·笔记·vscode·学习·macos·visual studio
zzcufo10 小时前
OpenScreenInPopUp
笔记·学习
Shining059610 小时前
CUDA 编程系列(三)《内存模型与规约优化》
人工智能·学习·其他·学习方法·infinitensor