教程操作教程阅读约 6 分钟
在 Godot 4 里绑定 3D 角色并配上动画: AFK AI 插件、AnimationPlayer 和 AnimationTree
在 FileSystem 面板里点选模型,点 Rig,大约一分钟后,旁边就有了带动画的绑定好的 GLB,走路和待机已经在循环。
Signed in as you@example.comSign out
3 of 3 rigs left this month.
Model: hero.glb
Body typeHuman
AnimationsAll animations
FacingAuto
RigRigging...Cancel
- hero_riggedNode3D
- └Skeleton3DSkeleton3D
- └HeroMeshInstance3D
- └AnimationPlayerAnimationPlayer
- └Idle_Aloop ⟳
- └Walkloop ⟳
- └Jogloop ⟳
- └Sprintloop ⟳
- └…
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 的服务器上运行。只会上传你选的那个模型文件。
安装插件
- 从 Godot 插件页面下载插件。
- 把其中的
addons/afk_ai文件夹复制到项目的addons文件夹里。项目里没有addons文件夹就新建一个。 - 打开 Project > Project Settings > Plugins,勾选 AFK AI 旁边的 Enable。
右侧 Inspector 旁边会出现 AFK AI 面板。
绑定模型
- 登录。 在 AFK AI 面板里点 Sign in。浏览器会打开 afk.ai,在那里用 Google 账号登录。面板会显示你的邮箱和本月剩余的绑定次数。如果浏览器回不到 Godot,它会改为显示一个登录码:粘贴到 I have a sign-in code 下面,点 Use。
- 选模型。 在 FileSystem 面板里点选模型文件。
- 选选项。 Body type:人物和所有两条腿走路的角色选 Human,动物或生物就选对应的类型。Animations:选 All animations,或者只要骨骼就选 Rig only。Facing:保持 Auto。
- 点 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 能按速度在动画之间混合,也能处理攻击这类一次性动作。在编辑器里设置一次就行:
- 给角色添加一个 AnimationTree 节点。在 Inspector 里把 Anim Player 设为
Hero/AnimationPlayer,Tree Root 设为新建的 AnimationNodeStateMachine。 - 在底部的 AnimationTree 面板里右键,添加一个 BlendSpace1D。命名为
Locomotion,打开它,添加 3 个点:Idle_A 在 0,Walk 在 1.5,Jog 在 4(把它的 Max Space 设为 4)。 - 再次右键,添加 Sword_Attack 动画。把 Start 连到 Locomotion,Locomotion 连到 Sword_Attack,再把 Sword_Attack 连回 Locomotion,这条连线的 Switch Mode 设为 At End,Advance Mode 设为 Auto。
- 在 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。
手里拿剑,修改循环
想让角色手里拿东西,就选中它的 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 能用在每一只狼身上。动物教程列出了每种类型的动画。
- 龙
- 四足
- 有蹄类
- 恐龙
- 蜘蛛
- 鱼
怎样算一次绑定
每次请求到达 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,什么引擎都能用。
更多教程
操作教程
在 Blender 里自动绑定角色:免费的 AFK AI 插件
选中模型,点 Rig,大约一分钟后,绑定好、带动画的副本就站在它旁边。支持 Blender 4.2 及以上版本。
操作教程
在 Unreal Engine 5 里自动绑定角色:从静态网格体到带动画的骨骼网格体
右键点击网格体,选 Rig with AFK AI,一分钟后,同一个文件夹里就有了带骨骼、物理资产和动画的骨骼网格体。
操作教程
在 Unity 里自动绑定任意 3D 模型:直接可用的 Humanoid,动画片段齐全
在 Project 窗口里选中模型,点 Rig。一分钟后,绑定好的 FBX 就在它旁边,已设为 Humanoid,每个动画都是一个片段。