godot2D游戏教程系列二(16)

前言:

完成目标:

成功编写状态机核心脚本,实现:

  • 初始化所有状态
  • 设置默认状态为 Idle
  • 每帧自动更新当前状态

一、创建状态机脚本

  • 新建 StateMachine.gd
  • 继承 Node
  • 定义变量 currentState 用来存储当前状态

作用:

状态机负责"记录现在处于什么状态"。


二、在 _ready() 中初始化所有状态

  • 遍历所有子节点(Idle、Run 等)
  • 确保它们是 State 类型
  • 告诉每个状态:"你的父节点是我"
  • 调用它们自己的初始化方法

作用:

让所有状态提前准备好。


三、设置默认状态

  • 默认选择第一个子节点(Idle)
  • 调用 Enter() 方法

效果:

游戏一开始角色自动进入待机状态,并播放待机动画。


四、每帧更新当前状态

  • ​_physics_process(delta)​ → 调用当前状态的物理更新(移动、重力)
  • ​_process(delta)​ → 调用当前状态的逻辑更新(输入、切换状态)

作用:

状态机只负责"转发",

真正的逻辑写在各个状态里面。


最终效果

现在:

  • 游戏启动 → 自动进入 Idle
  • 每帧自动调用当前状态逻辑
  • 状态机负责管理
  • 各状态各司其职

玩家状态系统正式开始运作。

实现过程:

  • 编写状态机脚本,在ready函数中初始化所有的状态脚本,将待机状态设置为初始进入游戏的默认状态。
  • 状态机的概念
  • 想象你在玩一个 RPG 游戏:
  • 状态机是"大脑",决定角色现在该做什么(站立、跑步、攻击)。
  • 状态是具体的行为:
  • IdleState:播放站立动画,检测"按方向键→跑步"。
  • RunState:播放跑步动画,检测"松开方向键→站立"。
  • 初始化:游戏开始时,角色默认进入 IdleState。
  • 每帧更新:
  • 物理更新(_physics_process):处理移动、重力。
  • 逻辑更新(_process):检查输入、切换状态。
  • 代码
  • (1) 创建状态机脚本
  • 新建一个脚本 StateMachine.gd,继承自 Node(因为要挂到场景树上)。
  • 声明一个变量 currentState,用来存储当前状态。
  • extends Node
  • class_name StateMachine # 允许其他脚本通过"StateMachine"这个名字引用它
  • var currentState: State # 存储当前状态(假设State是所有状态的基类)
  • (2) 初始化所有状态
  • 在 _ready() 里遍历所有子节点(Idle、Walk、Attack)。
  • 对每个子节点说:"你的父状态机是我",并调用它的初始化方法。
  • func _ready():
  • for child in get_children(): # 遍历所有子状态(Idle、Walk等)
  • var childState = child as State # 确保子节点是"状态"类型
  • childState.parentStateMachine = self # 告诉子状态:"我是你爹(状态机)"
  • childState.Ready() # 让子状态自己初始化(比如加载动画)
  • (3) 设置初始状态
  • 默认把第一个子状态(比如 Idle)设为当前状态。
  • 调用初始状态的 Enter() 方法(比如播放"站立"动画)。
  • currentState = get_child(0) # 第一个子状态是初始状态
  • currentState.Enter() # 进入该状态(比如播放动画)
  • (4) 每帧更新当前状态
  • 在 physicsprocess 里告诉当前状态:"处理物理逻辑"(比如移动角色)。
  • 在 _process 里告诉当前状态:"处理普通逻辑"(比如检测输入)。
  • func physicsprocess(delta):
  • currentState.UpdatePhysics(delta) # 让当前状态处理物理(如重力、移动)
  • func _process(delta):
  • currentState.Update() # 让当前状态处理输入/动画
相关推荐
一木 之林1 小时前
Dify学习笔记 03 · RAG检索增强生成:三代范式、评估与落地(第40-45、55-56集)
笔记·小程序·交互·dify
apple-mapping2 小时前
网络RTK定位学习总结
学习·网络rtk
狗凯之家源码网2 小时前
吃瓜主题 3.0 视频源码深度评测与实战指南
音视频
楚山之石2 小时前
【Lancet Neurology 】多发性硬化认知障碍的 SDMT 筛查、灰质萎缩标志与认知康复循证路径
图像处理·人工智能·学习·mri
海海不掉头发4 小时前
CSDN博客_时序预测9模型复现对比
人工智能·学习·软件工程
蓝祁子yoky6 小时前
Qt学习日记 Day13:网络编程(一)-TCP基础与Socket实战
网络·qt·学习
美狐美颜sdk6 小时前
视频美颜SDK中的YUV与RGBA格式有什么区别?直播APP开发解析
人工智能·计算机视觉·音视频·美颜sdk·直播美颜sdk·视频美颜sdk
箓维6 小时前
TCP Socket的进阶实现
网络·笔记·tcp/ip
二哈赛车手6 小时前
新人笔记---hermes定时功能设计,具体讲解以及可优化点
java·人工智能·笔记·spring·ai·typescript
音视频牛哥7 小时前
不止于超低延迟:SmartMediaKit iOS Unity3D RTSP/RTMP 播放器的核心竞争力
音视频·unity3d rtsp播放器·unity3d rtmp播放器·smartmediakit·ios unity rtsp·ios unity rtmp·unity3d ios播放器