Mixamo 动画接入 Godot 笔记
角色动画是《警匪大作战》的门面,自己手 K 帧太慢,所以走 Mixamo 这条现成路线:下载带骨骼的动画 FBX,修一修,再喂给 Godot 的 AnimationPlayer。这条链路看着简单,中间的坑却不少。这篇把完整流程和我遇到过的几个典型问题记下来。
一、从 Mixamo 下载
Mixamo 上选好角色和动画(idle、run、walk 之类),下载时选 FBX 格式,并且勾选「With Skin」,否则只拿到动画没有蒙皮,进了 Godot 绑不上网格。建议同一角色的所有动画都用同一套骨骼下载,后面拼起来才不会有骨骼对不上的问题。
二、用 Blender 修复
下载的 FBX 不能直接丢进 Godot,通常要过一道 Blender:
- 轴向:Mixamo 默认是 Y-up,而 Godot 是 Y-up 但骨骼朝向习惯不同,必要时在 Blender 里做一次旋转/应用变换,避免角色进引擎后「脸朝地」。
- 骨骼命名:部分动画的骨骼命名带了后缀,统一一下方便后续用 AnimationPlayer 的轨道映射。
- TPose 修正:如果导入姿态歪了,在 Blender 里把 rest pose 摆正再导出。
这里也踩到过 Blender 5.1 的 FBX 导入 bug(见「模型瘦身」那篇),修完才能正常读。
三、导入 Godot 与 AnimationPlayer
Blender 导出 GLB/FBX 后,拖进 Godot。给角色节点挂一个 AnimationPlayer,把动画片段挂上去。注意 Godot 4 的动画库管理方式和 3.x 略有差别,片段要在 AnimationPlayer 的「动画」面板里逐个确认,重命名成 idle、run 这种好调用的名字。
四、CharacterAnimator 的扩展
我的角色控制器里有个 CharacterAnimator.gd,核心是一个 update_move_anim 函数,根据速度在 idle/run/walk 之间切换。后来加了加速道具,需要让动画也反映「在加速」,于是把函数扩展成两个参数:
func update_move_anim(is_moving: bool, has_speed_boost: bool) -> void:
if has_speed_boost:
play("run_fast")
elif is_moving:
play("run")
else:
play("idle")
这样警察踩到加速道具时,角色会切到更快的奔跑动画,手感一下就出来了。
五、贴图变白与背面剔除
接入后遇到两个视觉 bug:
- 贴图变白:原因是材质引用在动画/实例化过程中丢了。给角色加一个
materials数组属性,显式持有材质引用,避免被回收或覆盖,白模问题消失。 - 模型消失:用
look_at()让角色转向时,部分网格因为背面剔除被裁掉,从某些角度看人不见了。临时方案是给相关 Mesh 设CULL_DISABLED,先保证可见,后续再细查法线。
六、小结
Mixamo 接 Godot 的链路是「下载(带 Skin)→ Blender 修轴向/骨骼 → Godot AnimationPlayer 挂片段 → 脚本里做状态切换」。真正的麻烦不在流程本身,而在骨骼朝向、材质引用、剔除这几个隐蔽点。把 update_move_anim 扩成两参数、用 materials 数组锁材质,基本就稳了。