动画、背景和特效怎样进入游戏
人和 AI 一起做游戏 · 第 9 篇

本篇依据截至 2026 年 8 月 2 日的开发记录,回顾 2026 年 6—7 月及 8 月初的开发过程。正文中的“当前”、数值、画面、候选资源与验证结论均指当时快照,不代表现售版本的状态。
上一篇谈的是静态美术资源怎样从候选变成可以使用的组件。到了动画场景,问题会再多一层:角色不只有一张图,建筑会在受损后改变状态,战场会随着镜头横向移动,技能效果还要准确地出现在单位脚下。
这些内容看起来都属于“画面”,进入《Kibble Street TD》时却走的是不同路径。角色动画需要知道当前动作,建筑动画需要服从生命状态,背景需要按层移动,特效则要在正确时刻出现并自行结束。把它们做成图片只是开始,真正的接入工作是为图片补上可执行的规则。
角色动画不是一段视频,而是一组状态
以狗阵营远程单位为例,它在战斗里有待机、移动、攻击、眩晕、倒下和胜利六种状态。六组画面共享同一个角色身份,但承担的任务完全不同:待机和移动需要循环,攻击只播放一次,倒下播放完成后停在最后一帧,胜利则在结算阶段持续循环。

制作过程中并没有为了“统一”而一次性重做全部动作。已有的待机和攻击能够继续使用,移动、眩晕、倒下和胜利则分别重做。这样可以把返工限制在真正有问题的状态里,也能单独检查每个动作的节奏、脚底接触和角色比例。
这里最难的并不是画出六个不同姿势,而是让观众相信它们始终是同一个角色。耳朵、背包、衣服、武器、身体比例和主要配色都要保持一致;移动时脚掌要落在同一条地面线上,倒下时可以改变高度,却不能突然改变体型。人先锁定角色的标准形象和动作意图,AI 再围绕每个状态制作候选、拆帧和整理预览。只让 AI 根据六段文字各画一次,通常会得到六个相似但并不相同的角色。
图集旁边还要有一份帧布局清单
移动动画最终是一张 858×143 像素的横向图集,里面有六个 143×143 像素的画面。仅有这张图还不够,游戏还需要一份帧布局清单,逐帧记录画面在图集中的横纵坐标和宽高,并说明它属于哪个状态。

运行时不会凭经验把图片平均切成六块,而是读取这份清单,再核对帧数、矩形范围和播放方式。移动状态每帧持续 0.11 秒并循环;眩晕同样循环,但节奏是每帧 0.15 秒;倒下每帧 0.20 秒,播放一次后停在末帧。清单缺失、帧数不一致或某个矩形越界时,加载会直接报错,而不是悄悄退化成一张静止图片。
这个约束看起来严格,却能把最难发现的问题提前暴露出来。否则一张六帧图集被误切成五帧,可能只在某个动作播放到末尾时短暂闪烁;等它进入完整战斗以后,再从单位逻辑、图片尺寸和播放代码里逐项排查,成本会更高。
建筑动画描述的是状态变化
角色动画通常由移动、攻击等行为触发,建筑更接近一台状态机。狗阵营主基地的完整过程由四段组成:常态循环、从常态进入受损、受损循环、从受损进入倒塌。

常态和受损各使用四帧循环,让旗帜、灯光和细节保持轻微活动。第一次进入受损状态时播放六帧过渡,只执行一次;生命归零后再播放八帧倒塌过程,并把最后一帧保留为废墟。这样,建筑当前是什么状态和刚刚发生了什么变化可以分别表达。
如果把四段内容做成一条永远循环的长动画,战斗逻辑就无法决定何时受损、何时倒塌,也很难在暂停、加速或重新进入画面时恢复到正确位置。拆成状态与过渡之后,图片仍然只是图片,游戏负责选择当前应该播放哪一段。
战场背景不是一张铺满屏幕的大图
《Kibble Street TD》的战斗区域按 1080×1920 的竖屏基准设计,但横向世界宽度是 4320。当前战场被拆成远景、路面、中景建筑和近景前景四层,并按从后到前的顺序组合。

远景负责天空和山体,路面提供单位实际站立的基线,中景建筑形成街区主体,近景则遮挡最靠近镜头的部分。分层以后,可以替换建筑而不重画天空,也可以调整近景遮挡而不碰单位所在的道路。更重要的是,透明区域让四层能够在运行时重新组合,而不是把所有关系永久焊在一张大图里。
层数并不是越多越好。每增加一层,都要多处理一组尺寸、位置、透明边缘和滚动边界。这里使用四层,是因为它们分别承担明确职责;装饰如果不需要独立移动或遮挡,就没有必要继续拆分。
远景要比街道走得慢
镜头从战场左端移动到右端时,中景、路面和近景按照正常距离移动,远山只移动同一距离的六分之五。这个很小的速度差会产生空间深度:近处街区从视野中快速经过,远处山体则显得更遥远。

视差效果真正麻烦的地方不在公式,而在边界。主场景的最大横向位移是 3240,远景因为宽度较短,最大位移是 2700,二者正好保持六分之五的比例。左端、中段和右端都必须检查,确认任何位置都不会露出空白,也不会让建筑、道路和前景错开。
AI 在这里更适合重复做检查:读取每层尺寸,计算三个关键位置,批量生成对照预览,再把边缘异常列出来。是否需要视差、哪一层应该更慢、速度差是否抢眼,仍然是人根据实际观感决定。
特效要和角色、背景保持独立
冻结道具触发时,画面会先播放五帧启动冲击,再在受影响单位脚下播放四帧冷雾。它们不是远程单位动作的一部分,也没有画进战场背景,而是作为独立表现临时挂到每个单位附近。

特效尺寸会根据单位脚底阴影调整,因此坦克、近战、远程和攻城单位不必各做一套冻结图。视觉动画只负责说明“这里发生了冻结”,不直接申请伤害结算;真正的停止移动和恢复时机由战斗规则管理。播放结束后,临时表现自动移除,角色继续使用自己的状态动画。
这种分离避免了两个常见问题:同一技能不必复制进所有角色图集,调整冷雾也不会改变单位动作。背景、角色、特效和规则可以分别修改,只要它们之间的触发条件和位置合同保持一致。
这个环节由谁负责
人负责锁定角色身份、动作含义、地面接触、图层顺序、播放节奏和最终观感,也负责决定某次变化应该进入角色、建筑、背景还是特效系统。
AI 负责围绕已确认形象制作分状态候选,整理帧序列与布局清单,生成接触点、边界和组合预览,并重复检查尺寸、帧数、透明区域和引用关系。运行时再用严格校验保证清单和图片一致。
这套分工的重点不是让 AI 一次生成完整动画,而是把大量可重复工作压缩到每个状态都能被人快速判断的程度。
如果你想开始
先不要做一个角色的全部动作。选一个最容易判断的移动状态,准备一张完整主体的标准姿态,制作六帧短循环,固定脚底基线,再生成一份逐帧矩形清单。把它放进真实场景,连续观察循环接缝、角色尺寸和地面接触。
这一段能够稳定播放以后,再增加攻击、受伤和倒下状态;需要环境深度时,再把背景拆成真正需要独立移动的层。先让一个最小版本跑通,比同时制作几十组图集更容易找到问题。
动画、背景和特效进入游戏之后,画面会丰富很多,但好不好玩仍然不能只靠观看判断。
