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)
相关推荐
mxwin6 小时前
Unity Shader 半透明物体为什么不能写入深度缓冲?
unity·游戏引擎·shader
晚枫歌F7 小时前
三层时间轮的实现
网络·unity·游戏引擎
努力长头发的程序猿11 小时前
Unity使用ScriptableObject序列化资源
unity·游戏引擎
mxwin11 小时前
Unity Shader 手写基于 PBR 的 URP Lit Shader 核心光照计算
unity·游戏引擎·shader
魔士于安12 小时前
Unity windows 同步 异步 打开文件文件夹工具
游戏·unity·游戏引擎·贴图·模型
笑虾12 小时前
cocos2d-x lua 加载 Cocos Studio 导出的 csb
游戏引擎·lua·cocos2d
魔士于安12 小时前
unity lowpoly 风格 城市 建筑 道路 交通标志
游戏·unity·游戏引擎·贴图·模型
mxwin12 小时前
Unity GPU Shader 性能优化指南
unity·游戏引擎·shader
董董女友1 天前
unity mcp 配置指南
unity·游戏引擎
垂葛酒肝汤1 天前
Unity的可视化网格和文字标签
unity·游戏引擎