项目故事

布丁丁历险记:用 AI 给孩子做一款游戏

第一次听说 Tripo,我只想让孩子走进一个游戏世界。模型的脸改坏过,骨骼散过,跑步单独磨了五秒。从 Blender 预告到现在能玩的独立游戏,这是布丁丁一路走来的故事。

第一次听说 Tripo,是在九月底刷到郭宇的一条分享。他提到,可以用 AI 配合 Tripo 和 Blender,把照片里的人做成带骨骼的三维模型。

我当时问 Codex:这个东西能拿来干什么?紧接着又问,能不能把自己的形象放进《马里奥》里?

想到自己家里的小朋友,这件事一下就有意思了。平时看着别人做的角色在屏幕上跑,如果换成一个认得出来的孩子,让她走进一个有蘑菇、有金币、能跳来跳去的世界,我很想看看会是什么样。

以前听到这种工具,我大概会想到打印个小玩具。做完模型,找一家店,把它变成一个摆在桌上的东西,也就到这里了。至于 Blender,我知道这个名字,知道有人拿它做动画,但从没觉得自己会打开它认真做什么。里面那些窗口、骨骼和时间轴,离我的日常太远。

这次有了 AI,我开始觉得可以往前多试一步。最后做出来的东西,叫《布丁丁历险记》。它现在已经是一个能在 Windows 上运行的独立游戏,有开始菜单、存档和完整的关卡。中间最费劲的地方,几乎都不在最初那张漂亮的模型图里。

先得让这个小朋友像她自己

Tripo 可以把图片变成三维模型,也提供绑定骨骼和动画的工具。听介绍时,我觉得照片交进去,应该就能很快得到一个可以用的人物。

真正开始以后,最先卡住的是“像不像”。

我拿孩子的照片做参考,又想借一点蘑菇小朋友的样子。脸要认得出来,帽子要自然,从前面好看,转到后面也得说得过去。生成的图常常只满足其中一部分。帽子像硬扣上去的,脸越改越陌生,后面的版本甚至没有第一张顺眼。

我在聊天里反复说,别再往新的方向走,就在已经比较像的那张上改。要做给孩子看的角色,我心里有一张很明确的脸,工具却不会自动知道我认的是哪一张。

为了给 Tripo 准备参考,又开始做不同角度。正面、侧面、背面放到一起,原来藏在单张图片里的问题就露出来了:帽子从侧面看不合理,头发换了方向,衣服细节也不一致。那时候还在研究会员和导出,想先跳过暂时没准备好的部分,把后面的路走一走。

于是有了这个早期 Blender 原型。红色蘑菇帽,简单的身体,看着很像一个刚搭好的小玩具。

早期 Blender 原型
早期 Blender 原型

它帮我看见了一个三维角色可以转身、可以摆姿势。可我也越来越在意,最后留下的角色到底像谁。后来实际导出的 Tripo 模型,穿蓝色衣服、背着小背包,头上是灰色的熊耳帽。做到后面,我明确要求从这版继续,别又给它换回一个新蘑菇头。

导出的 Tripo 角色
导出的 Tripo 角色

角色逐渐有了自己的样子。我接着想做的,是让她真正动起来。

想进《马里奥》,先摔在了骨骼上

最初那条路很诱人。已有的游戏里有跑、跳和关卡,把自己的角色换进去,看起来应该能省掉许多工作。我确实朝 SM64 CoopDX 的角色接入方向试过。

结果,模型有骨骼这件事,没有让我直接得到一个能在游戏里跑的小朋友。骨骼名称和方向要对得上,身体各部分得跟着正确的骨头走,衣服和材质也要一起进去。静止时像一个人,接上另一套动作以后,可能就完全散了。

下面这张,是当时留下的失败画面。身体翻了过去,各部分落在了不该出现的位置。看到它,我很难再把“已经绑好骨骼”理解成“快做好了”。

失败的骨骼接入
失败的骨骼接入

这段尝试里,我们做过模型、转换和动作预览,却没有把角色真正放进那款游戏里运行。后来我干脆说,彻底放弃接进去这条路,先回到 Blender,做一个能看得过去的动画视频。

当时有一点不甘心。前面已经折腾了不少,最开始想看的那个画面却还没有出现。可再盯着一个始终没接通的入口,角色本身的问题也不会变少。既然手里已经有模型,我想先把它做好,至少能跑起来,让人愿意看。

这次停下来,对后面的制作很有用。我开始把注意力放到眼前的人物上。她转头时脸会不会变形,迈步时手脚是不是一起动,帽子和背包会不会穿进身体。这些问题,打开一个动作就看得见。

一动起来,难看的地方全出来了

静止的模型比较容易让人满意。镜头挑一个角度,人物站好,很多毛病就躲过去了。一走路,手指、肩膀、裤子和脸都开始说实话。

有一版,正面几乎只看得见鼻孔;领子上冒出奇怪的鼓包;手指弯得像鸡爪。还有一版,脸整个扭曲了,走路弓着身子,怎么看都没有小朋友的轻快。我在聊天里说,像个老太太。这句话不客气,但确实是我看着画面的第一反应。

当时的脸部细节
当时的脸部细节
走路时露出的问题
走路时露出的问题

修改也会把事情弄得更坏。为了处理脸部细节,继续重绑或精修,可能把原来尚能接受的表情一起改掉。新版本的编号在增加,我认得出来的那个小朋友却越来越远。

我后来要求把前面不满意的版本放下,从已经认可的原模型继续。脸、帽子和衣服不能每次修动作都跟着换一遍。一个地方顺了,再看下一个地方。

一直改到 V7.2,我才说,这版算是及格了。这个评价没有多高,我也没觉得它已经像大公司游戏里的角色。只是终于到了一个可以接着做的程度:人物基本稳定,动作不再处处让人出戏。

跑步仍然不对。身体和腿没有配合好,跳的时候还像单腿发力,做出来的画面不够开心。我不想再看一段很长、里面处处有问题的演示,就让 Codex 单独研究五秒钟的跑步。

这一回有了变化。看到新动作,我说:“对呀,这样跑步才正常。”

五秒钟给了我一个可以明确判断的片段。只看她怎么起步,身体怎样前倾,脚落下去有没有重量,手臂有没有跟上。看顺了,再把这个动作拿去做别的镜头,我心里才有底。

终于看顺的五秒跑步

也是在这里,我给这个项目起了名字:《布丁丁历险记》。

预告片让我开始舍不得只做一段视频

有了那段能接受的跑步,我提出用五秒一个镜头,拼成三十秒的游戏预告。

晨光里的营地,奔跑的金币花园,挥手的蘑菇驿站,跳过去的溪谷,亮起来的机关,最后走到庆典前面。画面里的布丁丁有地方可去,也有一件件事情可以做。比起让模型在空地上循环走路,这些镜头让我更容易想象她的世界。

Blender 动画预告

这段预告是在 Blender 里制作、渲染出来的动画。人物的路线、镜头和动作都事先安排好了,观众能看,不能拿键盘控制。

但看着这个世界,我又开始想:如果能自己走进去呢?金币就在前面,为什么只能看着她跑过去?溪谷里的那一下跳跃,如果按键的人是自己,会是什么感觉?

于是我问 Codex,和家里的本地 Qwen 一起认真做,有没有可能开发这样一个游戏。能否借用免费的引擎和现成的基础,从已经做好的角色出发。

前面失败过一次,问这句话时,我已经不会把“模型做好了”当成剩下的事情都简单了。只是有了一段想留下来的动画,我更愿意继续花时间,把它往前推。

第一版能玩了,脸又被我撤回去

这回做的是独立游戏,用 Godot 引擎,借助 Kenney 的 3D 平台游戏基础项目 起步,再把自己的角色、场景和玩法接进去。后面添的风车、水轮、栅栏和许多小道具,又回到 Blender 里做。

Codex 负责把这些东西接起来、运行和修问题。本地 Qwen 也参与了边界明确的小模块,例如金币与检查点、界面文案和部分道具脚本。有些返回的代码能继续用,有些截断了或者接口不对,就得重新做。最终还是要到引擎里运行,看结果。

第一版花园有了地面、金币和目标,人物也能听按键了。看到这里,我才有“确实在做游戏”的感觉。镜头往哪里转、跳跃什么时候落地,已经要跟着玩家的操作发生。

第一版花园
第一版花园
早期试玩版实录

接着又在脸上走了一段弯路。为了让角色更像原来的小朋友,我们尝试过调整五官,还加过会随动作摆动的辫子。单看功能,多了头发的运动,多了细节,好像每一项都在进步。

可新脸看起来年纪大了,眼睛和表情都变了。她离原来那个孩子太远。我不愿意因为已经花时间做了,就把它留在游戏里。

撤回的改脸版本
撤回的改脸版本
恢复后的角色
恢复后的角色

后来恢复了此前认可的脸,把改脸先放下,接着做跳跃和游戏流程。辫子的改动也随着那版角色一起撤回了。比较这两张图,最容易明白我为什么坚持回去:我想认得这个小朋友。每次修改都把她带向另一张更通用的脸,我就得把方向拉回来。

过去用现成软件,我很少有机会管到这些地方。现在能改了,我才发现自己有这么多具体意见。好不好看、像不像、跑起来开不开心,不能只靠一个工具替我定下来。

地上有树,小朋友却能直接穿过去

第一个能玩的版本,也让我看到了动画里不用处理的麻烦。

脚会陷进地里,人物能穿过树和蘑菇。跳跃缺少起跳前那一下蓄力,落地也没有感觉。我让它补蹲下、起跳和落地的动作,再试双跳和脚下的反馈。

这些动作放在 Blender 里看顺了,进游戏还要继续调。动画里身体已经向上抬,游戏引擎又把人物抬一次,就会出现奇怪的漂浮。镜头跟得太近,人物一转身,脸就占满画面;从存档继续,也碰到过镜头位置不对、动作循环卡住的问题。

我后来特别强调,要一路 debug。场景摆好了,人物导进去了,我还想真正走一遍,看看哪里会拦住我,哪里又根本拦不住。

等场景变漂亮,这个要求更具体了。风车、小木屋、栅栏和电杆站在那里,人物却可以径直从它们中间穿过。我再次要求往下查,硬的东西总得让人碰到才算数。

有些坡面朝向不对,有些装饰根本没有碰撞形状,木筏移动了,人也得跟着走。修这些问题时,画面不一定明显变漂亮,但走起来开始像一个有实物的地方。

2.0 碰撞检查

这段是实际引擎里的碰撞检查录像,使用了安排好的测试位置。它适合看修过的阻挡和移动,不是从开头一路通关的试玩视频。

把满屏说明换成一个愿意往前走的世界

我还抱怨过文字提示太多。打开游戏,屏幕上一直教我应该干什么,我自己玩过这么多年游戏,也会被这些说明弄糊涂。孩子第一次进来,就更需要一个看得懂、愿意过去的地方。

最早的关卡也短,内容有点重复。跑一段,拿到东西,再跑一段,换个景色继续。我希望她能多待一会儿,因为里面有事可做,有东西可找,走过去会得到一点回应。

于是开始改引导。小鸟带路,目标附近亮起来,走近能操作的东西才给一句简短提醒。金币逐渐成了路上可以顺手收集的东西,不必为了凑够数量,把已经走过的路机械地跑一遍。

这个改法也带动了场景。晨光群岛里有野餐和花草;风车云径有风车、云和风铃;萤火夜园可以跟着光找月镜;溪谷水乡要经过木筏、水闸和小鸭子;最后的云端庆典里有气球、糖果门和舞台。

萤火夜园
萤火夜园

我愿意花时间做这些地方,是因为角色终于有了值得走过去的东西。小朋友会在哪儿停下来,哪一处容易错过,提示出现时会不会挡住画面,这些都需要继续看。加一个道具很快,让它在这里有用,会多出许多想法。

我也不想用一个计时器硬拖长游戏。原来的关卡太短,就得添路线、活动和可探索的角落。东西多一点,玩法不同一点,再回头检查玩家能不能明白,这样才有继续往前走的理由。

这次,文件夹里真的有一款游戏

现在交付的 2.0 版本,可以直接在 Windows 上打开。开始、继续、设置、关卡推进和结尾都接起来了,布丁丁能从晨光走到夜园,再去水乡和庆典。

完成记录里,有从最终程序运行、沿正常输入路线走完五个章节的连续检查,整段大约二十分钟。那是沿已知路线做的验证,不能当成孩子第一次玩的时间。碰撞、存档和界面也分别做过检查。

我在这篇里能写到这里:游戏已经有可运行的成品,之前那些会把人卡住或直接穿过去的问题,做过实际修复和验证。孩子真正玩起来,会在哪里迷路,会不会喜欢某个角落,还要看她的反应。我不想先替她写一份好评。

云端庆典
云端庆典

回头看,最开始那句“这个模型有什么用”,已经离现在很远了。第一次听说 Tripo,我想到的是把照片变成立体的东西。后来打开 Blender,开始挑动作、改镜头;再后来,已经能认真要求一个游戏该怎样跳、怎样存档、怎样让人知道往哪里去。

这个过程中,我提的要求越来越多。有些看过画面才知道,有些按了键才发现,甚至有些是新功能做好以后才冒出来的。修好跑步,我想要一个预告;看完预告,我想要能玩;真的能玩了,我又开始在意人物撞到树、走上木筏会发生什么。

AI 让我能开始这件事,也帮我把许多过去碰不到的软件用起来。可那张改坏的脸,我看一眼就知道要撤回;一屏文字是不是烦,玩过就知道;看到她跑得别扭,我还是会要求再做一遍。

这些判断,来自我想给孩子做什么,也来自我自己玩游戏的经验。它们以前没有机会变成软件里的修改,现在有了。

《布丁丁历险记》还会继续改。这个名字是在五秒钟跑步终于看顺的时候起的。每次打开成品,我都能想起前面那些难看的脸、散掉的骨骼,还有那句“对呀,这样跑步才正常”。它们留在制作记录里,也留在这个游戏里。

接着读