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)设置 HframesVframes
  4. 创建动画 :在 AnimationPlayer 中为每个方向(上、下、左、右)创建 idlewalk 动画片段,通过关键帧设置 frame 属性。

三、Animation Tree 详细配置

1. 添加节点
  • AnimationPlayerAnimationTree 添加为 CharacterBody2D 的子节点。
  • AnimationTreeAnimation Player 属性中,指定刚才添加的 AnimationPlayer
2. 设置状态机
  • AnimationTree 中,选择 Tree RootAnimationNodeStateMachine
  • 创建两个 BlendSpace2D 节点,分别命名为 idlewalk
  • 连接节点:startidleidlewalk(双向过渡)。
3. 配置 BlendSpace2D
  • idle** BlendSpace**:
    • 添加四个动画:idle_downidle_upidle_leftidle_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_downwalk_upwalk_leftwalk_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 中,根据输入向量更新 idlewalkblend_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/方向键输入)自动切换对应的 idlewalk 动画。
  • 动画过渡平滑(通过 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)
相关推荐
ysn111113 小时前
Unity合批实战
unity·游戏引擎
Howrun7774 小时前
虚幻引擎_玩家控制器APlayerController(进阶)
游戏引擎·虚幻
IMPYLH5 小时前
Lua 的 Package 模块
java·开发语言·笔记·后端·junit·游戏引擎·lua
警醒与鞭策5 小时前
大模型对比
unity·性能优化·c#·游戏引擎·cursor
Howrun7775 小时前
虚幻引擎_玩家控制器APlayerController(初阶)
游戏引擎·虚幻
呆呆敲代码的小Y6 小时前
【Unity工具篇】| Unity项目中如何使用LuBan插件,详细集成步骤
游戏·unity·游戏引擎·u3d·luban·免费游戏·unity工具
哈小奇15 小时前
Unity URP管线Linear空间丝绸材质
unity·游戏引擎·材质
哈小奇16 小时前
Unity URP管线Linear空间下玻璃效果
unity·游戏引擎
极客柒21 小时前
Unity 大地图高性能砍树顶点动画Shader
unity·游戏引擎