教程操作教程阅读约 6 分钟

在 Godot 4 里绑定 3D 角色并配上动画: AFK AI 插件、AnimationPlayer 和 AnimationTree

在 FileSystem 面板里点选模型,点 Rig,大约一分钟后,旁边就有了带动画的绑定好的 GLB,走路和待机已经在循环。

AFK AI (dock)

Signed in as you@example.comSign out

3 of 3 rigs left this month.

Model: hero.glb

Body typeHuman

AnimationsAll animations

FacingAuto

Rig

Rigging...Cancel

Scene › hero_rigged
  • hero_riggedNode3D
  • └Skeleton3DSkeleton3D
  • └HeroMeshInstance3D
  • └AnimationPlayerAnimationPlayer
  • └Idle_Aloop ⟳
  • └Walkloop ⟳
  • └Jogloop ⟳
  • └Sprintloop ⟳
  • └…
按插件界面绘制,并非截图:AFK AI 面板正在绑定 hero.glb,以及它保存在旁边的绑定好的副本,动画都在 AnimationPlayer 里。

Godot 很擅长播放动画,却没法自己做绑定。所以一个角色通常要来回折腾一圈:先导出,到 Blender 里绑定(或者用 Mixamo,但只支持人形),再找动画,导出 GLB,导入后还要把每个循环动画重新设为循环。

AFK AI 插件在 Godot 编辑器的一个面板里就能完成这一圈。在 FileSystem 面板里点选模型,再点 Rig。大约一分钟后,hero_rigged.glb 就保存在 hero.glb 旁边,带着为它的身体打造的骨骼、蒙皮权重,动画都在 AnimationPlayer 里。待机、走路和跑步已经设为循环。

准备工作

Godot
4.2 及以上版本,标准版和 .NET 版都行。
模型
项目里的 .glb、.gltf 或 .fbx,最大 50 MB。.gltf 必须把所有内容放在一个文件里;如果旁边还带着 .bin,就改为导出 .glb。
afk.ai 账号
免费,用 Google 账号登录。每次绑定消耗账号当月的一次绑定次数,和在 afk.ai/rig 上一样。
网络
绑定在 afk.ai 的服务器上运行。只会上传你选的那个模型文件。

安装插件

  1. 从 Godot 插件页面下载插件。
  2. 把其中的 addons/afk_ai 文件夹复制到项目的 addons 文件夹里。项目里没有 addons 文件夹就新建一个。
  3. 打开 Project > Project Settings > Plugins,勾选 AFK AI 旁边的 Enable。

右侧 Inspector 旁边会出现 AFK AI 面板。

绑定模型

  1. 登录。 在 AFK AI 面板里点 Sign in。浏览器会打开 afk.ai,在那里用 Google 账号登录。面板会显示你的邮箱和本月剩余的绑定次数。如果浏览器回不到 Godot,它会改为显示一个登录码:粘贴到 I have a sign-in code 下面,点 Use。
  2. 选模型。 在 FileSystem 面板里点选模型文件。
  3. 选选项。 Body type:人物和所有两条腿走路的角色选 Human,动物或生物就选对应的类型。Animations:选 All animations,或者只要骨骼就选 Rig only。Facing:保持 Auto。
  4. 点 Rig。 面板会显示当前进度:上传、等待、绑定、下载。这期间可以继续干活。

完成后,hero_rigged.glb 会保存在 hero.glb 旁边,已导入并选中。原模型不做任何改动。同一个模型再绑定一次会得到 hero_rigged_2.glb,不会覆盖任何东西。

绑定好的 GLB 里有什么

把 hero_rigged.glb 拖进场景就能用:它会作为一个节点导入,所有内容都在它下面。

Skeleton3D
为该身体类型打造的骨骼,网格已蒙皮到上面。人类有 66 根骨骼,每根手指都有,命名为 pelvis、spine_01、hand_r、foot_l 等等。
AnimationPlayer
所有动画,各用自己的名字。人形模型最多 593 个:Idle_A、Walk、Jog、Sprint、Jump_Start、Sword_Attack、Dance_Groove,还有几百个。免费账号能用免费动画,套餐解锁其余全部。
循环
待机、走路、跑步、飞行和游泳已经在循环。插件会在 Godot 导入之前,把这些写进文件的导入设置。
朝向
角色朝向 +Z,和所有 glTF 模型一样。

用 AnimationPlayer 播放动画

最简单的玩家角色:一个 CharacterBody3D,带一个 CollisionShape3D(胶囊体),把绑定好的模型拖到它下面,重命名为 Hero。给 CharacterBody3D 挂上这个脚本:

extends CharacterBody3D

const SPEED := 4.0
var gravity: float = ProjectSettings.get_setting("physics/3d/default_gravity")

@onready var hero: Node3D = $Hero
@onready var anim: AnimationPlayer = $Hero/AnimationPlayer

func _physics_process(delta: float) -> void:
	var input := Input.get_vector("ui_left", "ui_right", "ui_up", "ui_down")
	var direction := Vector3(input.x, 0.0, input.y)
	velocity.x = direction.x * SPEED
	velocity.z = direction.z * SPEED
	if not is_on_floor():
		velocity.y -= gravity * delta
	move_and_slide()

	if direction.length() > 0.1:
		# the model faces +Z: turn that toward where it's going
		hero.rotation.y = lerp_angle(hero.rotation.y, atan2(direction.x, direction.z), 10.0 * delta)
		anim.play("Jog", 0.2)   # 0.2 s blend from whatever was playing
	else:
		anim.play("Idle_A", 0.2)

运行后,用方向键就能让角色四处慢跑,松开按键后会平滑地回到待机。对正在播放的动画再调用 play,它会接着播放,所以每帧都调用也没问题。

用 AnimationTree 混合动画

AnimationTree 能按速度在动画之间混合,也能处理攻击这类一次性动作。在编辑器里设置一次就行:

  1. 给角色添加一个 AnimationTree 节点。在 Inspector 里把 Anim Player 设为 Hero/AnimationPlayer,Tree Root 设为新建的 AnimationNodeStateMachine。
  2. 在底部的 AnimationTree 面板里右键,添加一个 BlendSpace1D。命名为 Locomotion,打开它,添加 3 个点:Idle_A 在 0,Walk 在 1.5,Jog 在 4(把它的 Max Space 设为 4)。
  3. 再次右键,添加 Sword_Attack 动画。把 Start 连到 Locomotion,Locomotion 连到 Sword_Attack,再把 Sword_Attack 连回 Locomotion,这条连线的 Switch Mode 设为 At End,Advance Mode 设为 Auto。
  4. 在 Project > Project Settings > Input Map 里添加一个名为 attack 的动作,给它绑一个按键。

然后在同一个脚本里,删掉那两行 anim.play,改为驱动 AnimationTree:

@onready var tree: AnimationTree = $AnimationTree
@onready var playback: AnimationNodeStateMachinePlayback = tree.get("parameters/playback")

func _process(_delta: float) -> void:
	tree.set("parameters/Locomotion/blend_position", Vector2(velocity.x, velocity.z).length())
	if Input.is_action_just_pressed("attack"):
		playback.travel("Sword_Attack")

AnimationTree 处于激活状态时,动画由它来播放,所以不要再调用 AnimationPlayer 的 play。

StartLocomotionBlendSpace1D · Idle_A, Walk, Jog↓ travel("Sword_Attack")↑ At EndSword_Attack
示意图:AnimationTree 的状态机。Locomotion 按速度混合 Idle_A、Walk 和 Jog;travel() 跳转到 Sword_Attack,播完后返回。

手里拿剑,修改循环

想让角色手里拿东西,就选中它的 Skeleton3D,在下面添加一个 BoneAttachment3D,把 Bone Name 设为 hand_r,再把剑放到这个挂点下面。剑会在所有动画里跟着手走。

想修改哪些动画循环,就在 FileSystem 面板里双击 hero_rigged.glb,打开 Advanced Import Settings。在左侧 AnimationPlayer 下选中动画,修改 Loop Mode,再点 Reimport。

动物、生物和道具

点 Rig 之前,先在面板里选好身体类型:狗、猫、狼选 Fox,有蹄类选 Horse,还有 Bird、Dragon,恐龙选 Kaiju,以及 Spider、Insect、Snake、Fish、Kangaroo、Frog、Turtle、Ghost,道具选 Object。每种都有为它的身体打造的骨骼,以及为它制作的动画:奔跑、扇翅膀、咆哮、游泳、蜿蜒爬行。播放方式完全一样,用同样的 AnimationPlayer 和 AnimationTree。绑定为同一身体类型的模型,骨骼名和动画名都一样,所以一只狼的 AnimationTree 能用在每一只狼身上。动物教程列出了每种类型的动画。

  • 龙
  • 四足
  • 有蹄类
  • 恐龙
  • 蜘蛛
  • 鱼
另外 6 种身体类型,在 afk.ai/rig 上绑定后,分别播放各自配套的动画。

怎样算一次绑定

每次请求到达 AFK AI 的绑定,都会消耗本月的一次绑定次数,和在 afk.ai/rig 及其他 AFK AI 插件里一样。Cancel 只是停止等待,绑定本身不会停,照样计次。绑定失败不计次数。次数用完后,面板会提示你,并显示 See plans,点击打开 afk.ai 的套餐。

常见问题

Godot 有内置的自动绑定工具吗?

没有。Godot 能导入已有的骨骼和动画,它的重定向功能也能把一套人形骨骼对应到另一套上,但它不会绑定网格。AFK AI 插件补上的正是这一步,交给 Godot 的是一个普通的 GLB。

支持 Godot 3 吗?

不支持。需要 Godot 4.2 及以上版本。用 Godot 3 的话,就在 afk.ai/rig 上绑定模型,再导入下载的 GLB。

能在 C# 项目里用吗?

能。插件是 GDScript 写的,.NET 版 Godot 也能运行,绑定好的 GLB 也完全一样。在 C# 里这样播放动画:GetNode<AnimationPlayer>("Hero/AnimationPlayer").Play("Jog", 0.2);。

为什么是 GLB 而不是 FBX?

GLB 是 Godot 导入效果最好的格式:在所有 Godot 4 版本里,骨骼、蒙皮权重和所有动画都能原样导入。原模型可以是 FBX,返回的是 GLB。

插件会进入导出的游戏吗?

游戏用到的是绑定好的 GLB。插件本身只在编辑器里起作用;想在导出时排除它的文件,就在导出预设的 Resources 标签页里排除 addons/afk_ai/*。

能一次绑定多个模型吗?

一次一个,每个大约一分钟。想用脚本绑定整个文件夹的模型,就用绑定 API:它生成的是同样的 GLB。

绑定好的角色能用在商业游戏里吗?

能。骨骼和动画采用 CC0,模型仍归你所有。

Blender、Unity 或 Unreal 也有 AFK AI 插件吗?

有。参见 Blender、Unity 和 Unreal Engine 教程,AFK AI 插件总览介绍了全部 9 款软件。

绑定模型,让它动起来

AI 在浏览器里完成绑定,模型就能直接播放几百个动画。下载一个 GLB,什么引擎都能用。

绑定模型

更多教程