godot2D游戏教程系列二(15)

0 阅读5分钟

前言:

  • 我是根据b站上的视频进行学习,并且总结写下笔记,然后做此分享。笔记非常详细以至于你可以通过查看文章进行快速学习并且制作出游戏出来。当然视频学习的链接我也放在下面了:
  • 视频学习:www.bilibili.com/video/BV1Nd…
  • 音频/美术资源包下载: pan.baidu.com/s/1mY05SbG3…

完成目标:

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


一、理解状态机作用

  • 用来管理角色不同状态(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 的节点)。