自己开发工具很容易自嗨,经常忘记做工具是为了开发游戏,我在开发 CATO 关卡编辑器时候,难以克制自己不增加需求、优化性能。如果不是为了磨练技术或者需求特殊,我还是尽量使用插件,把精力放在游戏内容开发上,避免感动自己。
这次分享的是 CATO 这个项目用上的 20 款 Unity 插件。我使用 Unity 2021.3 版本,所有插件都在两年开发周期内在 PC、Mac、iOS、Android、NS、PS5 上得到验证。
tween 是一种区别于时间轴动画的工具,可以在代码层面控制物体的位移旋转动画。CATO 的旋转、合体、钻管道,包括 UI 等等小动画都是靠 tween 实现的。
理论上用啥 tween 插件都一样,我用自己魔改的 LeanTween,但 DoTween 更新勤快,下个项目可能会换过去。关于 CATO 的程序生成动画可能会另开一篇讲。
下面的代码分别是永动机旋转的代码与合体后的压缩形变动画代码,用 tween 的方式写起来偏描述性,调教参数看效果也方便。比如压缩形变动画(squash and stretch)的要点是体积恒定,这种就能靠方程直接计算出来,比手 key 稳定方便。
延时或延帧是常见的需求,但 Unity 默认的 async 或者 coroutine 写起来很啰嗦,而用 UniTask 就有很优雅的封装,建议直接看主页丰富的例子。我常在一连串演出的 tween 用上 UniTask。
这款尾巴插件设置起来方便,能调教的参数也很多。例如猫咪在静止时候尾巴会瞎摆,如果靠动画控制除了曲线编辑费劲,还容易有循环感;而用这个插件的话就能很容易调出无序的摆尾感。
当 CATO 跑动时候,尾巴会跟随位置角度摆动,就像 Celeste 的角色头发动画,这种程序生成动画会让角色移动更加丝滑生动。
Rewired 是一款输入方案插件,直接与手柄硬件底层通信,不是简单的 Unity Input 封装,支持大量的手柄和平台,会帮玩家解决手柄断联等等繁琐的问题。
Rewired 上手有门槛,没那么直觉,但经过配置是可以实现复杂需求的,比如菜单和游戏内可以区分两套不同的输入方案,比如代码上可以直接读取短按长按的状态等等。它也封装了触屏相关的输入,触屏按钮在 Rewired 概念里也是一种手柄,所以移植手机端在代码层面几乎不需要适配。
在开发过程中,我需要一个入口来绑定关卡编辑器的操作快捷键,Rewired 自带的 Control mapper 完全符合需求,交互与界面繁杂了一些,但好在功能全面,直接把 prefab 实例化就能使用。
我见过几个游戏是直接集成 Control mapper 的,当然了 UI 样式会匹配游戏。但如果像我们一样需求更加刁钻,也可以用 Rewired 封装的 InputMapper 实现自己的按键绑定逻辑。
此外推荐一下 Kenny 的免费按键图示库,样式全面包含键盘与御三家手柄,甚至有 Steam Deck 版本。Rewired 的最新版本可以配合这套素材,直接显示 UI 按键图示。 手柄震动适配方面,我使用的是 Nice Vibration 这款插件,但现在 Nice Vibration 被收购了已经不单卖了,我建议直接购买 Feel 这款插件,它包里自带最新版本的 Nice Vibration。Feel 与本篇文章 Corgi Engine 是同一个作者。
CATO 在出入管道口、爬墙、飞天等等都有对应的震动手感,无论是手柄震动还是 iOS 上的 Haptic Engine,都可以做到一处编写处处调用,十分方便。但目前 Nice Vibration 对多手柄震动的支持不是很友好,在使用前需要试试它的能力范围。
Dreamteck Spline 是一款曲线编辑插件,游戏中的管道、线缆就是配合插件制作的。
实际上,游戏中的管道猫/液体猫也是这个插件实现的,其实就是截取曲线片段,实时生成 mesh。
游戏中的过山车赛道也是这个插件制作的,只需要拖放节点,曲线就会自动拟合,操作很直觉。赛道上的障碍物摆放也可以通过插件的位置映射功能实现。
Shape 这款插件可以在 Unity 场景绘制向量图形,十分强大。接口直觉,文档也全面,你永远可以相信 Freya 做出来的工具易用性。
我会用它来做一些小动画,像下图 CATO 合体后头顶的小动画就是用 Shape 做的,我起名为 blip,因为是程序控制的动画,节奏把控很方便,从其他项目一直保留到现在。
Shape 可以实现描绘外边、虚线等等需求,颜色支持 HDR,比如下图的黄色高亮镜头框就是配合 bloom 实现的效果。绿色选中框使用 Immediate-mode 绘制出动态模糊效果。
Immediate-mode 用起来像是 Unity 多了一个 Draw() 回调,可以控制每一帧的渲染内容,用起来有些古典。例如下图的吐司预览曲线也是采样数学结果,用 Shape 实时绘制出来的。
Shape 不便宜,但它是一款孤品,这种高级工具只能靠付费支持才能存在,Unity 的插件生态也是我难以离开到 Godot 的原因之一。
物理学中抛物线采样的插件,我用这个插件来计算吐司的抛物线,效果如上图。和我一样数学菜又懒得学的朋友可以试试看。
大名鼎鼎 Corgi Engine,2D 平台跳跃框架,功能丰富,自带的 demo 也很多。因为过于强大,想要拓展功能的话需要些时间阅读代码,搞明白框架的工作方式。
Corgi Engine 的角色控制器拓展能力很强,像 CATO 的跳跃、加速、起飞、爬墙甚至死亡,都各是一种能力,每种能力独立一个 GameObject 挂在角色子节点下,管理方便。角色的状态机也好用,实现帧级别的控制没问题。
CATO 发售后我给插件作者发了邮件,他说没想到 CATO 也是使用 Corgi Engine 做出来的。另外推荐一下这位作者在 Youtube 上关于快熟原型的演讲,我定期拿出来复习,受益匪浅。
CATO 的画面像素化稳定有两个原因,一个是镜头固定,所以采样内容不会有太大变化;另外一个是 EPO 这个描边插件,它可以稳定输出 1 pixel 宽的描边,我们游戏里使用双描边来突出角色位置。
EPO 只是一个普通描边插件,但为什么能在我们游戏里渲染出稳定的 1 pixel 描边不虚化,至今我都没搞明白。我试过像素化的采样高度和 EPO 的采样高度即使对上了,有时也会虚化翻车。所以我用了一个极度草台班子的方法:穷举游戏的像素化分辨率高度,并把 EPO 调至描边正常的参数,再把这些参数硬编码进代码里,怎么说呢,到现在全平台都没翻车过😂。
2024 年初我在移植主机时候,发现 EPO 这款插件在 PS5 上不起作用。尝试在官方 Discord 寻求帮助,发现多人都遇到此问题,但插件作者联系不上了,因为他在乌克兰。
搁置了快两个月,我试图使用 ChatGPT 分析错误,没想到真的成功定位并修改了 BUG。找到这个解决方案相当开心,半夜跑到的 Discord bug 频道报告,恰巧有个法国团队两天后就要打 PS5 首日补丁,因为这个问题解决了,对方激动到想请我喝啤酒!他们的游戏叫《泰拉往事》。
喜报,2024 年 11月,作者已经定居英国开始新生活,插件的更新也频繁起来了。一个小技巧,如果一个插件上架好几年,最近还在维护更新,那这个插件基本就值得购买。
把游戏存档保存为文件的插件,封装了常用的存档加密、备份等功能,接口直觉,文档易读。据我所知《小飞船大冒险》、《迷你空管》都在用。
ES3 可以直接序列化 class 保存为 json,CATO 的关卡编辑器文件都是直接用 ES3 序列化的,保存后可读性强,用 git 管理起来也方便。
ES3 读写灵活度很高,比如在 NS、PS5 主机上是无法直觉操控文件读写的,我就用 ES3 的 cache 模式输出为 raw bytes,再读写到主机的文件系统,绕了点弯但移植主机也没问题就是了。
应该不少朋友也会在 Hierachy 插入空物体命名分割符,而这款插件让分割符更加清晰,一点简单的视觉提升。我用的这款插件已经开始收费了,理论上替代品还是不少,随便搜搜看需求下载免费的就行。
打包后也能在游戏内看日志的插件。集成起来超简单,把插件的 prefab 扔到启动场景就能常驻,使用时靠快捷键唤醒。
但我觉得这个插件最强的是作弊命令功能,只需在代码内给回调方法注释 ConsoleMethod 作弊属性,就能直接终端调用,支持参数。测试游戏时候很常用,比如解锁所有关卡、设置帧率等等。
性能监测工具,全平台无痛集成,可以配合 InGame Debug Console 的作弊功能来启用。
I2 自称是目前 Unity 最完善的本地化系统,支持文本以外内容的本地化(虽然我没用上)。
I2 在 Unity 编辑器下比较难用,不建议使用,正确使用方式还是要靠 excel 表格导入。但我用的是 Google Sheet 模式,配置后就能一键同步,甚至可以在运行时直接同步,迭代效率极高,有在考虑下回作为数值源文件使用。
使用 Google Sheet 的好处就是协作管理方便,我使用了一个主表格来同步若干个子表格,各个表格又与相应本地化人员共享编辑权限,打版本前只需同步主表格即可。
CATO 的打包流程魔改于这两款插件,Version 这款插件可以一键增加版本号,避免繁琐的编辑和人类错误。而 Build Manager 则能方便管理多个平台的打包配置,例如路径、Scripting Desfines 等等,我只需按下一个按钮就能自动打包 Win、Mac、Linux 三个平台。
这两个插件的名字过于普通,所以需要通过原链接查看,难以搜索,我都是在 OpenUPM 找到的。
一款类似 Blender 资源管理的插件,可以把当前工作常用资源组织起来。例如我在编辑一个吐司皮肤,就把相关的模型、材质、prefab、配置等等内容放到一个组下快速访问。
在我的编写习惯中,极度依赖事件来解耦代码,用来用去最顺手的就是 UEvent 这款插件。简单来说,派发事件无需指定对象,且可传递任意参数。
想要监听事件,只需给回调方法加上 Listen + 事件名,写起来很简洁。这种事件监听模式的好处之一,就是删除图中任意事件代码都不影响程序运行,因为不存在引用依赖。
Odin Inspector 是一款功能强大的编辑器增强插件,它的使用案例建议到官网查看才够全面,这里我简单举例 CATO 的使用场景。
OnValueChanged 可以监测数值变动进行回调,在 Editor 模式直接调参查看编辑效果。
Inspector 的变量多起来阅读不方便,可以用 [Title] 属性注释给变量分组。
给方法加上 [Button] 属性注释就能直接在 Inspector 变成按钮。
给 reference 的 ScriptableObject 加上 [InlineEditor] 属性注释就能直接在 Inspector 内编辑,无需繁复跳转。
数值类 ScriptableObject 很适合用 [TableList] 属性注释来格式化内容,阅读与编辑方便不少。
Toolbar Extender 是直接覆盖 Unity 编辑器工具栏的一款插件,可以方便植入操作按钮。我加了一个帧率按钮,一键切换低中高帧率,在 debug 动作和物理游戏的帧敏感 bug 特别实用。此外也可以用来跳转常见场景,比如图中的 LD 按钮就是快速跳转关卡编辑器的按钮。
用过 Scriptable Object 的朋友都知道,它内容的变动经常不自动保存,所以每次都需要疯狂 ctrl+s 或者去菜单操作才安心些,于是我给编辑器加入一个顺手的保存按钮,就是上图的 S 按钮。
这篇文章主要传播使用插件的可能性,并不代表每个工具都对你的项目好使。我觉得挑插件最重要的是知道自己需求,多试试插件的 demo。如果不是亲自试用过,和别人交流就会泛泛而谈:有人说这个插件有坑,有人说很牛逼,有人说性能不好。希望各位保持开放灵活的开发态度,不被工具束缚住。
评论区
共 43 条评论热门最新