Rhell 在“动画控制器”中的动画(上)和游戏中的动画(下)
独立开发者 SlugGlove 如何在 Unity 中为《Rhell》构建了 1.02 亿种法术组合:扭曲的世界与动荡的时间

一位独立游戏开发者如何制作出一款拥有1.02亿种潜在法术组合的电子游戏?雷尔:《扭曲世界与动荡时间》是一款半开放世界角色扮演游戏,玩家需将魔法符文串联起来,对物体施放法术并改变其品质,从而解开谜题。
即使对于一支大型开发团队而言,构建这个复杂的系统也是一项巨大的挑战;而独立开发者SlugGlove却将其视为又一道待解的谜题。我们与SlugGlove团队进行了深入交流,探讨了他们从动画制作转向游戏开发的历程,他们在Unity中设计和测试《Rhell》魔法系统的思路,以及他们在管理项目范围和避免工作过载方面的宝贵建议。
从动画制作到C#代码编写
SlugGlove 最初并非以程序员为志向;他们的背景在于 3D 动画和精灵图制作。在制作毕业动画项目时,他们意识到自己并不想制作一部动画短片——而是希望将作品融入游戏中,赋予其生命。
SlugGlove 开始接触 Unity,并在学习 C# 的同时进行尝试。对于那些可能因尝试使用游戏引擎而望而却步的艺术家,他们特别强调了Unity内置动画套件的易用性。
“当时我正在使用Blender,我个人觉得它非常易于上手,”SlugGlove说道。“从这个项目转到 Unity 之后,我基本上就是在制作动画片段,并用动画控制器来排列它们。这比传统动画制作要简单得多。“如果其他动画师正在寻找一个测试动画的解决方案,Unity 非常容易上手且易于掌握。”
最初只是一个作品集项目,后来发展成了几款实验性的游戏,最终才开始了《Rhell》的开发:扭曲的世界与动荡的时间。
构建基于组合的法术系统
《Rhell》的核心卖点在于其模块化魔法系统。玩家可以在雷尔的法术书中一次最多合成五枚符文,由此产生数百万种潜在的组合。与其为每种可能的组合创建独特的 ScriptableObject 或预制件,SlugGlove 通过整数和预制件变体找到了一个优雅的解决方案。
整数法
游戏并未将每枚符文视为复杂的资产,而是直接将其视为数字。“符文本身在项目中并不是一个独立的资产,”SlugGlove 解释道。“更准确地说,当你按下按钮一,系统会将其保存为一个整数。它从零加速到40。“施法时会读取最多五个整数的列表。”
系统并非为“火+冰”这类组合编写指定的交互代码,而是读取整数(例如 11、12),将其移除,并动态修改一个本地化类对象,使其应用“水”的属性(例如整数 32)。最后一个咒语会根据这些整数添加和修改值,直到得出最终的结果类。这种模块化的数学化方法使游戏逻辑保持轻量级,并避免了《SlugGlove》需要创建数千个独立素材资源。
瑞尔将火与冰符文融合成水
通用对象系统
为了确保法术效果始终如一,SlugGlove 使用了预制件变体。“Rhell 中的每一个物体,都是那个小小灰色立方体的变体,”他们解释道。“我的想法是,如果任何法术都能对这个方块生效,那么它就能对游戏中的任何其他东西生效。”“我基本上做了一个我能做出的最复杂的魔方。”
由于木桶、巨石和熔岩海从技术上讲都是同一个基础预制件的变体,SlugGlove 只需为每种法术交互实现一次即可。修改基础预制件即可更新游戏中的数百个对象,从而节省大量开发时间。
玩家角色雷尔是这条规则的唯一例外。由于她需要定制的移动控制器和独特的动画状态(例如在燃烧时四处弹跳),SlugGlove 不得不将通用对象代码细致地映射到玩家控制器上。
以下是《Rhell》中玩家角色的几种自定义动画状态:扭曲的世界与动荡的时间
通过随机测试节省时间
乍一看,要处理1.02亿种咒语组合,似乎是一场噩梦般的测试任务。SlugGlove 并未因此却步,再次想出了一个简单而富有创意的解决方案:暴力随机化。
他们首先在游戏中添加了一个“随机”符文,该符文会在构成符文系统的整数中随机选择一个。为了测试可能的交互,SlugGlove 会加载到一个房间,并不断对物体施放“随机”法术,直到出现报错提示。
“我就会坐在房间里,一遍又一遍地施放‘随机值’法术,直到在Unity里看到那个我们都再熟悉不过的小红图标,”他们笑着说。“曾出现过一种情况:如果你让某个对象“回溯时间”、复制它并使其具有“粘性”,然后尝试取消“粘性”特效,系统会报null引用报错。“多亏了随机值,我才知道我得解决这个问题。”
“随机”符文的实际应用
门户网站的问题
在游戏中,雷尔可以通过传送门符文发送物品从一个地点到另一个地点。这带来了另一个亟待解决的独特难题。SlugGlove 发现,当受“生长”符文(该符文可使物体变大)影响的物体发送到传送门时,会与周围的几何体发生重叠,从而导致剪切问题。
受到“生长”符文的特效影响,通过传送门发送时会出现剪切问题
SlugGlove 的最初方案是:如果放大的物体在从传送门中出现时,其盒型碰撞体检测到剪切,则会导致传送失败。然而,这并不理想,因为这与他们对雷尔法术系统那种开放、沙盒式特性的Vision相悖。
“从游戏设计的角度来看,这种感觉糟透了,”SlugGlove 说道。“我不想引入那些会限制玩家及其行动自由的设定。“光说‘不’真的让人很不爽。”
为了优先考虑玩家的游玩体验,而非追求略微更真实的物理交互效果,SlugGlove 编写了一个自定义的碰撞处理脚本。如果某个物体试图穿过传送门时检测到碰撞,脚本会将传送门从碰撞点处向外推开一小段距离,以便该物体能够畅通无阻地生成。
受“生长”符文特效影响的物体从传送门中出现,后置
关注过程,而非结果
除了在开发《Rhell》的过程中提升他们的 Unity 技能外:在《扭曲世界与动荡时间》的制作过程中,SlugGlove还学习了FL Studio,用于创作游戏原声带。我们询问了他们,在同时处理如此繁重的任务、并参与如此浩大的项目时,是如何避免出现职业倦怠的。
“我只是把它当作一个新玩具,”他们说。“如果你总在想‘万一失败了怎么办?’或者‘万一我做出来的东西不好怎么办?’,那你只会感到压力山大。”我尽量关注积极的一面,并从中寻找乐趣。最坏的情况是,如果我学不会这个音乐软件,我也可以请朋友帮忙。“总会有备选方案的。”
这种积极态度在SlugGlove对有志于游戏开发的年轻人的鼓励话语中体现得淋漓尽致——这些年轻人可能在还没打开游戏引擎之前,就已经因作用域蔓延和适销性等问题而感到气馁:
“至少,为自己做点让你引以为豪的事情。请专注于思考:“我做这件事开心吗?”因为只要你玩得开心,那就OK。制作电子游戏真的既傻气又好玩。“这并不一定总是件令人压力山大的事。”
雷尔:《扭曲世界与动荡时间》现已在 Steam 上线。请访问我们的 Steam 策展页面,探索更多 Made with Unity 制作的游戏,并前往 Unity 博客和资源中心阅读更多 Unity 开发者的故事。
