Godot Player CharacterBody2D 移动和停止配置

学习视频:https://player.bilibili.com/player.html?bvid=BV1NC4y1q7bZ&autoplay=0

资源下载:https://cupnooble.itch.io/sprout-lands-asset-pack

https://www.patreon.com/posts/scripts-godot-4-68719570

原视频地址:https://www.youtube.com/watch?v=Luf2Kr5s3BM

一、基础节点结构(场景树)

  1. 根节点 :CharacterBody2D (重命名为 PlayerCat)
  2. 子节点 :
    • Sprite2D:用于显示角色精灵图(spritesheet)。
    • CollisionShape2D:添加矩形碰撞形状,调整大小以匹配精灵。
    • AnimationPlayer:创建和管理动画片段。
    • AnimationTree:用于控制动画状态和混合。

二、Sprite2D 和动画基础

  1. 导入纹理 :将精灵图(如 basic_character_sprites.png)拖入 Sprite2D 的 texture 属性。
  2. 设置像素风格 :在 项目设置 > 渲染 > 纹理 中将默认纹理过滤器设为 nearest,使像素清晰。
  3. 切分精灵图 :根据精灵图网格(如 4x4)设置 Hframes 和 Vframes。
  4. 创建动画 :在 AnimationPlayer 中为每个方向(上、下、左、右)创建 idle 和 walk 动画片段,通过关键帧设置 frame 属性。

三、Animation Tree 详细配置

1. 添加节点
  • 将 AnimationPlayer 和 AnimationTree 添加为 CharacterBody2D 的子节点。
  • 在 AnimationTree 的 Animation Player 属性中,指定刚才添加的 AnimationPlayer。
2. 设置状态机
  • 在 AnimationTree 中,选择 Tree Root 为 AnimationNodeStateMachine。
  • 创建两个 BlendSpace2D 节点,分别命名为 idle 和 walk。
  • 连接节点:start → idle,idle ↔ walk(双向过渡)。
3. 配置 BlendSpace2D
  • idle** BlendSpace**:
    • 添加四个动画:idle_down、idle_up、idle_left、idle_right。
    • 设置它们在二维空间中的位置(基于输入方向向量):
      • idle_down: (0, 1.1)
      • idle_up: (0, -1.1)
      • idle_left: (-1, 0)
      • idle_right: (1, 0)
    • 重要 :将 Blend Mode 设为 Discrete(立即切换,非插值),适合像素动画。
  • walk** BlendSpace**:
    • 类似地添加 walk_down、walk_up、walk_left、walk_right 动画。
    • 设置同样的位置坐标(如 walk_down 在 (0, 1.1))。
    • 同样将 Blend Mode 设为 Discrete。
4. 激活 AnimationTree
  • 在 AnimationTree 属性中,将 Active 勾选上。
  • 在 Parameters 中,可以手动设置 idle/blend_position 的默认值(如 (0, 0.5) 使角色初始面朝下)。

四、脚本中的动画控制

1. 获取引用
plain 复制代码
@onready var animation_tree = $AnimationTree
@onready var state_machine = animation_tree.get("parameters/playback")
2. 更新混合位置(根据输入方向)

在 _physics_process 中,根据输入向量更新 idle 和 walk 的 blend_position:

plain 复制代码
animation_tree.set("parameters/idle/blend_position", input_direction)
animation_tree.set("parameters/walk/blend_position", input_direction)
3. 状态切换(idle ↔ walk)

根据角色是否移动(速度是否为 Vector2.ZERO)切换状态:

plain 复制代码
if velocity != Vector2.ZERO:
    state_machine.travel("walk")
else:
    state_machine.travel("idle")
4. 初始方向设置

可以在 _ready 中设置初始面向方向:

plain 复制代码
animation_tree.set("parameters/idle/blend_position", Vector2(0, 0.5))

五、最终效果

  • 角色会根据移动方向(WASD/方向键输入)自动切换对应的 idle 和 walk 动画。
  • 动画过渡平滑(通过 BlendSpace2D 混合)。
  • 当停止移动时,角色保持最后朝向的 idle 状态。
  • 所有动画资源由 AnimationPlayer 管理,AnimationTree 负责逻辑切换。

核心要点

  1. AnimationTree 是 Godot 4 中强大的动画状态机工具,适合管理多方向、多状态的角色动画。
  2. BlendSpace2D 可根据二维向量(如输入方向)混合多个动画。
  3. Discrete 模式 适合像素动画,避免平滑插值导致的模糊。
  4. 通过脚本动态更新 blend_position 和切换状态,实现流畅的动画响应。

这样配置后,你的 2D 角色就能具备完整的八方向移动动画系统了!

附录

python 复制代码
extends CharacterBody2D

@export var move_speed : float = 100
@export var starting_direction : Vector2 = Vector2(0, 1)

@onready var animation_tree = $AnimationTree
@onready var state_machine = animation_tree.get("parameters/playback")

func _ready() -> void:
	print("parameters/conditions/is_moving",animation_tree.get("parameters/conditions/is_moving"))
	update_animation_parameters(starting_direction)

func _physics_process(delta: float) -> void:
	var input_direction = Vector2(
		Input.get_action_strength('right') - Input.get_action_strength('left'),
		Input.get_action_strength('down') - Input.get_action_strength('up')
	)

	update_animation_parameters(input_direction)
	
	velocity = input_direction.normalized() * move_speed if input_direction != Vector2.ZERO else Vector2.ZERO
	
	move_and_slide()

	pass

func update_animation_parameters(move_input: Vector2) -> void:
	# 使用 playback 手动旅行到指定状态
	if move_input.length() > 0.1:
		state_machine.travel("Walk") # 确保这里的字符串和状态机里的状态名完全一致
	else:
		state_machine.travel("Idle")
	
	# 方向更新保持不变
	if move_input.length() > 0.1:
		var dir = move_input.normalized()
		animation_tree.set("parameters/Idle/blend_position", dir)
		animation_tree.set("parameters/Walk/blend_position", dir)
相关推荐
魔士于安5 天前
unity 丑陋哥布林 哥布林有humannoid 动画没 带动画
unity·游戏引擎·材质·贴图·模型
淡海水6 天前
13-04-面试-源码级深度追问链
数据结构·unity·面试·c#·游戏引擎·源码·il2cpp
小小数媒成员7 天前
UGUI 性能优化(详细,全,深入)
开发语言·unity·游戏引擎
goujunwe8 天前
GEO 评估方法:如何自测你的内容,会不会被 AI 引用
搜索引擎·网络安全·游戏引擎·全文检索·中文分词
林川~019 天前
Unity 常用 API 与核心类全解:从生命周期到协程,附性能避坑清单(Unity 6 适配)
unity·游戏引擎·常用api
WiChP10 天前
【V0.1B16】从零开始的2D游戏引擎开发之路
开发语言·算法·游戏引擎
狂人开飞机11 天前
23、实战平台跳跃游戏
游戏·游戏引擎·godot
淡海水12 天前
11-02-Unity-Mono-vs-IL2CPP-两种脚本后端的数据结构行为差异
数据结构·unity·游戏引擎·il2cpp·mono
彧azz12 天前
初学Unity:编辑器
笔记·学习·unity·游戏引擎