04 · 角色与动画技术
04 · 角色与动画技术
独立游戏做不起 3A 的动画量,所以必须靠程序化动画 + 复用 + 相机调度补。 本文件的核心命题:如何用 20 条动画撑起一个看起来有 100 条动画的角色。
1. 骨骼与蒙皮预算
| 角色类型 | 骨骼上限 | 蒙皮权重/顶点 | 面数 | LOD |
|---|---|---|---|---|
| 主角 | 60–80 | 4 | 15k–30k | 2(LOD1 骨骼减半) |
| 精英敌人 | 50–70 | 4 | 8k–15k | 2 |
| 普通敌人 | 40–60 | 4 | 5k–10k | 2 |
| 群怪 | 20–30 | 2 | 1k–3k | 1 + Impostor |
| Boss | 80–120 | 4 | 30k–60k | 2 |
| NPC | 40–60 | 4 | 5k–10k | 2 |
骨骼预算比面数预算更重要——骨骼数直接决定 CPU 蒙皮成本。
骨骼分层(给 LOD 用)
Core(12–20 根) : 骨盆/脊柱/头/四肢根 —— 任何距离都需要
Mid(+15–25 根) : 小臂/小腿/手/脚 —— 中距离
Detail(+10–30 根): 手指/面部/披风/尾 —— 近距离
LOD 切换时按层剔除骨骼 → CPU 成本大幅下降。
2. 蒙皮方式选择
| 方式 | 优点 | 缺点 | 建议 |
|---|---|---|---|
| CPU Skinning | 通用,可做复杂逻辑 | CPU 贵 | 主角/少量角色 |
| GPU Skinning | 便宜,可大量 | 无法回读骨骼位置(需额外处理挂点) | 群怪/大量角色首选 |
| 顶点纹理动画(VAT) | 极便宜,可渲染上万 | 内存换;无实时 IK | 大规模群体(人群/鸟群)首选 |
| 烘焙动画到纹理 | 同 VAT |
独立游戏建议:
- 主角:CPU Skinning(需要 IK、挂点、程序化修正)
- 敌人(< 20 个):GPU Skinning
- 群怪/背景人群:VAT 或 Impostor
3. 动画资产的量化策略(省人天的核心)
用 20 条动画撑起 100 条
| 手段 | 说明 | 省多少 |
|---|---|---|
| 程序化 IK | 脚踩地、手握物、看向目标 | 省掉大量适配动画 |
| 程序化叠加 | 上半身/下半身分层混合(边跑边射) | 组合动画不用各做一套 |
| 镜像复用 | 左/右方向动画镜像 | 省 50% 方向动画 |
| 参数化速度 | 走路/跑步用同一条,改播放速度 + Blend | 省 30% |
| 程序化次级运动 | 头发/尾巴/披风/乳房/肌肉抖动 | 省掉大量手 K 帧 |
| 状态机复用 | 同一套 locomotion 给多个角色 | 省 70% 敌人动画 |
| Additive 动画 | 受伤/疲劳/呼吸/瞄准 叠加层 | 省掉组合动画 |
| 程序化表情 | 骨骼驱动的脸(眉/眼/嘴) | 省掉 50 个 blendshape |
程序化动画三件套(独立游戏神器)
① 程序化步态(Procedural Locomotion)
- 用两条腿部 IK + 骨盆上下/左右摆动曲线
- 输入:速度、坡度、转向 → 输出:行走/跑步/急停
- 好处:任意速度、任意坡度都能走,不需要做 8 个方向 × 3 个速度 = 24 条动画
② 次级运动(Secondary Motion / Spring Bone)
每根"软骨"是一个弹簧-阻尼系统:
accel = (targetPos - curPos) * stiffness - velocity * damping
- 用于:头发、尾巴、披风、耳、胸部、武器挂饰
- 成本:极低(几根骨骼 + 一个弹簧更新)
- 效果:立刻让角色"活起来"
- 这是独立游戏性价比最高的角色技术之一
③ 程序化表情/身体语言
- 用 5–8 根面部骨骼(眉 L/R、眼睑 L/R、嘴、颊)驱动表情
- 用参数(Blink、BrowUp、MouthOpen、Smile)组合出表情
- 替代 30–50 个 blendshape
4. 动画状态机与性能
| 问题 | 解法 |
|---|---|
| 状态机过于复杂 | 分層:Base(locomotion) / Override(动作) / Additive(状态) |
| 每帧重建状态机 | 缓存;避免每帧 SetTrigger |
| 动画过于频繁切换 | 加过渡时间 + 优先级;用 interrupt 规则 |
| 大量角色各跑一个 Animator | 动画 LOD:远处角色降更新频率(每 2–3 帧更新一次) |
| 动画压缩导致抖动 | 关键帧压缩阈值调低;骨骼位置精度保留 |
| 根运动不同步 | 明确 Root Motion 开关策略;物理与动画分离 |
动画 LOD 策略
| LOD | 更新频率 | 骨骼 | 混合 |
|---|---|---|---|
| LOD0(近) | 每帧 | 全部 | 全混合树 |
| LOD1(中) | 每帧 | Core + Mid | 简化混合 |
| LOD2(远) | 每 2–3 帧 | Core | 无混合,只播主循环 |
| LOD3(极远) | 每 5 帧 | 无骨骼(用 VAT 或静止) | — |
5. 2D 角色动画技术
| 方式 | 成本 | 适用 | 说明 |
|---|---|---|---|
| 逐帧(Frame-by-frame) | 极高(资产量) | 手绘风格、Cuphead 类 | 表现力上限最高 |
| 骨骼动画(Spine/DragonBones/Unity 2D Animation) | 中 | 大部分 2D 游戏 | 可复用、可换装、可做 IK |
| 网格变形(Mesh Deform) | 中 | 需要柔体感 | 介于两者之间 |
| 切图 + 位移/旋转/缩放 | 极低 | 简单 UI、Q 版 | 便宜但僵硬 |
| 程序化(代码驱动) | 低 | 简单生物、果冻怪 | 独立游戏友好 |
2D 动画资产量估算
一个角色动画资产量 ≈ 动作数 × 每动作帧数 × 方向数
逐帧:12 动作 × 12 帧 × 4 方向 = 576 张 → 极高
骨骼:12 动作 × 1 套骨骼动画 × 1 方向(可镜像/翻转)= 12 条 → 低
决策:除非美术坚持且预算充足,否则2D 独立游戏优先骨骼动画,再在关键动作(大招、死亡)上补逐帧。
6. 换装与变体(独立游戏省资产关键)
| 方式 | 适用 | 说明 |
|---|---|---|
| 模块化网格(换头/身/武器) | 3D | 需要统一骨骼与接缝处理 |
| 材质参数换色 | 3D/2D | 最便宜 |
| Palette Swap(调色板替换) | 2D 像素 | 极便宜,复古风神器 |
| 叠加层(装备 mesh) | 3D/2D | 需要处理蒙皮跟随 |
| Shader 变体(破洞/污渍/发光) | 3D/2D | 参数驱动 |
| 纸娃娃(Paper Doll) | 2D | 分层贴图叠加 |
敌人变体公式:
1 套基础模型 × (3 种配色 × 2 种体型 × 3 种武器) = 18 个视觉不同的敌人
实际资产:1 套模型 + 3 套贴图 + 2 套缩放 + 3 个武器
7. 面部与表情(按预算分档)
| 档 | 方案 | 成本 |
|---|---|---|
| 最低 | 无表情(靠身体语言 + 相机) | 0 |
| 低 | 2D 面部贴图切换(3–5 张) | 极低 |
| 中 | 6–8 根面部骨骼 + 参数驱动 | 低 |
| 中高 | Blendshape 15–25 个 | 中 |
| 高 | Blendshape 50+ + 眼球/口型 | 高(独立游戏一般不需要) |
省法:大多数独立游戏的剧情表现力,靠相机调度 + 身体动画 + 少量表情就够了。
把预算花在"镜头语言"上比花在面部 blendshape 上更划算(见 domains/07)。
8. 动画与玩法的联通(TA 的职责)
| 需求 | 技术实现 |
|---|---|
| 动画驱动位移 | Root Motion 或曲线驱动的位移量 |
| 动画事件(挥剑判定帧) | Animation Event / Notify,必须可视化编辑 |
| 输入响应延迟 | 动画前摇裁剪(cancel window);输入缓冲 |
| 命中判定与动画对齐 | 用动画曲线定义"伤害窗口",不要硬编码帧号 |
| 动画取消 | 定义可取消区间(Attack → Dodge 在 X 帧后) |
| 打击感 | 见 domains/03 的时间轴 |
| 角色与地形贴合 | 脚部 IK + 地面检测 |
| 角色与环境交互 | IK 目标点(手扶墙、抓边缘) |
TA 该提供的工具:动画事件编辑器、伤害窗口可视化、动画帧数/曲线查看器。
9. 常见坑
| 坑 | 表现 | 解法 |
|---|---|---|
| 骨骼命名不统一 | 换装/复用失败 | 强制骨骼命名规范 + 校验器 |
| 蒙皮权重爆炸 | 关节处扭曲 | 限制 4 骨骼/顶点;自动归一化 |
| 缩放为负 | 法线翻转 | 导出时应用变换 |
| 动画导入缩放不一致 | 角色大小差 100 倍 | 统一导出预设 |
| 根运动导致角色漂移 | 位置被动画覆盖 | 明确 Root Motion 策略 |
| 骨骼太多导致 CPU 高 | 大量角色时掉帧 | 骨骼 LOD + GPU Skinning |
| 动画压缩导致手指抖 | 远处不明显,近处明显 | 关键骨骼提高压缩精度 |
| 换装穿模 | 装备与身体穿插 | 定义 Body Mask / 体积碰撞检查 |
| 面部 blendshape 内存高 | 内存爆 | 用骨骼表情替代 |
10. 自检清单
- 骨骼预算定了吗?主角/敌人/群怪分别是多少?
- 骨骼分层(LOD)做了吗?
- GPU Skinning / VAT 用上了吗?
- 程序化三件套(IK / 次级运动 / 参数化步态)用了几个?
- 动画资产量估算过吗?有复用策略吗?
- 动画 LOD 有吗?
- 骨骼命名规范有校验吗?
- 换装/变体方案定了吗?1 套模型能变几个?
- 动画事件(伤害窗口)可视化了吗?
- 面部方案与预算匹配吗?(别做过度的 blendshape)
- 2D 项目:逐帧还是骨骼?混合策略是什么?
- 关掉所有动画,角色还是那个角色吗?(剪影测试)
11. 一句话总结
独立游戏的角色表现力 = 1 套骨骼 × 程序化动画 × 参数化变体, 而不是"做很多动画"。 你省下的每一条动画资产,都是在给"次级运动"和"相机调度"这两种更便宜的表现力买单。