自己開發工具很容易自嗨,經常忘記做工具是為了開發遊戲,我在開發 CATO 關卡編輯器時候,難以剋制自己不增加需求、優化性能。如果不是為了磨練技術或者需求特殊,我還是儘量使用插件,把精力放在遊戲內容開發上,避免感動自己。
這次分享的是 CATO 這個項目用上的 20 款 Unity 插件。我使用 Unity 2021.3 版本,所有插件都在兩年開發週期內在 PC、Mac、iOS、Android、NS、PS5 上得到驗證。
LeanTween
Asset Store 鏈接
tween 是一種區別於時間軸動畫的工具,可以在代碼層面控制物體的位移旋轉動畫。CATO 的旋轉、合體、鑽管道,包括 UI 等等小動畫都是靠 tween 實現的。
理論上用啥 tween 插件都一樣,我用自己魔改的 LeanTween,但 DoTween 更新勤快,下個項目可能會換過去。關於 CATO 的程序生成動畫可能會另開一篇講。
下面的代碼分別是永動機旋轉的代碼與合體後的壓縮形變動畫代碼,用 tween 的方式寫起來偏描述性,調教參數看效果也方便。比如壓縮形變動畫(squash and stretch)的要點是體積恆定,這種就能靠方程直接計算出來,比手 key 穩定方便。
UniTask
Github 鏈接
延時或延幀是常見的需求,但 Unity 默認的 async 或者 coroutine 寫起來很囉嗦,而用 UniTask 就有很優雅的封裝,建議直接看主頁豐富的例子。我常在一連串演出的 tween 用上 UniTask。
Tail Animator
Asset Store 鏈接
這款尾巴插件設置起來方便,能調教的參數也很多。例如貓咪在靜止時候尾巴會瞎擺,如果靠動畫控制除了曲線編輯費勁,還容易有循環感;而用這個插件的話就能很容易調出無序的擺尾感。
當 CATO 跑動時候,尾巴會跟隨位置角度擺動,就像 Celeste 的角色頭髮動畫,這種程序生成動畫會讓角色移動更加絲滑生動。
Rewired
Asset Store 鏈接
Rewired 是一款輸入方案插件,直接與手柄硬件底層通信,不是簡單的 Unity Input 封裝,支持大量的手柄和平臺,會幫玩家解決手柄斷聯等等繁瑣的問題。
Rewired 上手有門檻,沒那麼直覺,但經過配置是可以實現複雜需求的,比如菜單和遊戲內可以區分兩套不同的輸入方案,比如代碼上可以直接讀取短按長按的狀態等等。它也封裝了觸屏相關的輸入,觸屏按鈕在 Rewired 概念裡也是一種手柄,所以移植手機端在代碼層面幾乎不需要適配。
在開發過程中,我需要一個入口來綁定關卡編輯器的操作快捷鍵,Rewired 自帶的 Control mapper 完全符合需求,交互與界面繁雜了一些,但好在功能全面,直接把 prefab 實例化就能使用。
我見過幾個遊戲是直接集成 Control mapper 的,當然了 UI 樣式會匹配遊戲。但如果像我們一樣需求更加刁鑽,也可以用 Rewired 封裝的 InputMapper 實現自己的按鍵綁定邏輯。
此外推薦一下 Kenny 的免費按鍵圖示庫,樣式全面包含鍵盤與御三家手柄,甚至有 Steam Deck 版本。Rewired 的最新版本可以配合這套素材,直接顯示 UI 按鍵圖示。
Nice Vibration
Asset Store 鏈接
手柄震動適配方面,我使用的是 Nice Vibration 這款插件,但現在 Nice Vibration 被收購了已經不單賣了,我建議直接購買 Feel 這款插件,它包裡自帶最新版本的 Nice Vibration。Feel 與本篇文章 Corgi Engine 是同一個作者。
CATO 在出入管道口、爬牆、飛天等等都有對應的震動手感,無論是手柄震動還是 iOS 上的 Haptic Engine,都可以做到一處編寫處處調用,十分方便。但目前 Nice Vibration 對多手柄震動的支持不是很友好,在使用前需要試試它的能力範圍。
Dreamteck Spline
Asset Store 鏈接
Dreamteck Spline 是一款曲線編輯插件,遊戲中的管道、線纜就是配合插件製作的。
實際上,遊戲中的管道貓/液體貓也是這個插件實現的,其實就是截取曲線片段,實時生成 mesh。
遊戲中的過山車賽道也是這個插件製作的,只需要拖放節點,曲線就會自動擬合,操作很直覺。賽道上的障礙物擺放也可以通過插件的位置映射功能實現。
Shape
Asset Store 鏈接
Shape 這款插件可以在 Unity 場景繪製向量圖形,十分強大。接口直覺,文檔也全面,你永遠可以相信 Freya 做出來的工具易用性。
我會用它來做一些小動畫,像下圖 CATO 合體後頭頂的小動畫就是用 Shape 做的,我起名為 blip,因為是程序控制的動畫,節奏把控很方便,從其他項目一直保留到現在。
Shape 可以實現描繪外邊、虛線等等需求,顏色支持 HDR,比如下圖的黃色高亮鏡頭框就是配合 bloom 實現的效果。綠色選中框使用 Immediate-mode 繪製出動態模糊效果。
Immediate-mode 用起來像是 Unity 多了一個 Draw() 回調,可以控制每一幀的渲染內容,用起來有些古典。例如下圖的吐司預覽曲線也是採樣數學結果,用 Shape 實時繪製出來的。
Shape 不便宜,但它是一款孤品,這種高級工具只能靠付費支持才能存在,Unity 的插件生態也是我難以離開到 Godot 的原因之一。
Trajectory
Github 鏈接
物理學中拋物線採樣的插件,我用這個插件來計算吐司的拋物線,效果如上圖。和我一樣數學菜又懶得學的朋友可以試試看。
Corgi Engine
Asset Store 鏈接
大名鼎鼎 Corgi Engine,2D 平臺跳躍框架,功能豐富,自帶的 demo 也很多。因為過於強大,想要拓展功能的話需要些時間閱讀代碼,搞明白框架的工作方式。
Corgi Engine 的角色控制器拓展能力很強,像 CATO 的跳躍、加速、起飛、爬牆甚至死亡,都各是一種能力,每種能力獨立一個 GameObject 掛在角色子節點下,管理方便。角色的狀態機也好用,實現幀級別的控制沒問題。
CATO 發售後我給插件作者發了郵件,他說沒想到 CATO 也是使用 Corgi Engine 做出來的。另外推薦一下這位作者在 Youtube 上關於快熟原型的演講,我定期拿出來複習,受益匪淺。
Easy Performant Outline
Asset Store 鏈接
CATO 的畫面像素化穩定有兩個原因,一個是鏡頭固定,所以採樣內容不會有太大變化;另外一個是 EPO 這個描邊插件,它可以穩定輸出 1 pixel 寬的描邊,我們遊戲裡使用雙描邊來突出角色位置。
EPO 只是一個普通描邊插件,但為什麼能在我們遊戲裡渲染出穩定的 1 pixel 描邊不虛化,至今我都沒搞明白。我試過像素化的採樣高度和 EPO 的採樣高度即使對上了,有時也會虛化翻車。所以我用了一個極度草臺班子的方法:窮舉遊戲的像素化分辨率高度,並把 EPO 調至描邊正常的參數,再把這些參數硬編碼進代碼裡,怎麼說呢,到現在全平臺都沒翻車過😂。
EPO 插曲
2024 年初我在移植主機時候,發現 EPO 這款插件在 PS5 上不起作用。嘗試在官方 Discord 尋求幫助,發現多人都遇到此問題,但插件作者聯繫不上了,因為他在烏克蘭。
擱置了快兩個月,我試圖使用 ChatGPT 分析錯誤,沒想到真的成功定位並修改了 BUG。找到這個解決方案相當開心,半夜跑到的 Discord bug 頻道報告,恰巧有個法國團隊兩天後就要打 PS5 首日補丁,因為這個問題解決了,對方激動到想請我喝啤酒!他們的遊戲叫《泰拉往事》。
喜報,2024 年 11月,作者已經定居英國開始新生活,插件的更新也頻繁起來了。一個小技巧,如果一個插件上架好幾年,最近還在維護更新,那這個插件基本就值得購買。
Easy Save 3
Asset Store 鏈接
把遊戲存檔保存為文件的插件,封裝了常用的存檔加密、備份等功能,接口直覺,文檔易讀。據我所知《小飛船大冒險》、《迷你空管》都在用。
ES3 可以直接序列化 class 保存為 json,CATO 的關卡編輯器文件都是直接用 ES3 序列化的,保存後可讀性強,用 git 管理起來也方便。
ES3 讀寫靈活度很高,比如在 NS、PS5 主機上是無法直覺操控文件讀寫的,我就用 ES3 的 cache 模式輸出為 raw bytes,再讀寫到主機的文件系統,繞了點彎但移植主機也沒問題就是了。
Hierachy 2
Asset Store 鏈接
應該不少朋友也會在 Hierachy 插入空物體命名分割符,而這款插件讓分割符更加清晰,一點簡單的視覺提升。我用的這款插件已經開始收費了,理論上替代品還是不少,隨便搜搜看需求下載免費的就行。
InGame Debug Console
Asset Store 鏈接
打包後也能在遊戲內看日誌的插件。集成起來超簡單,把插件的 prefab 扔到啟動場景就能常駐,使用時靠快捷鍵喚醒。
但我覺得這個插件最強的是作弊命令功能,只需在代碼內給回調方法註釋 ConsoleMethod 作弊屬性,就能直接終端調用,支持參數。測試遊戲時候很常用,比如解鎖所有關卡、設置幀率等等。
Graphy
Asset Store 鏈接
性能監測工具,全平臺無痛集成,可以配合 InGame Debug Console 的作弊功能來啟用。
I2
Asset Store 鏈接
I2 自稱是目前 Unity 最完善的本地化系統,支持文本以外內容的本地化(雖然我沒用上)。
I2 在 Unity 編輯器下比較難用,不建議使用,正確使用方式還是要靠 excel 表格導入。但我用的是 Google Sheet 模式,配置後就能一鍵同步,甚至可以在運行時直接同步,迭代效率極高,有在考慮下回作為數值源文件使用。
使用 Google Sheet 的好處就是協作管理方便,我使用了一個主表格來同步若干個子表格,各個表格又與相應本地化人員共享編輯權限,打版本前只需同步主表格即可。
Build Manager + Version
CATO 的打包流程魔改於這兩款插件,Version 這款插件可以一鍵增加版本號,避免繁瑣的編輯和人類錯誤。而 Build Manager 則能方便管理多個平臺的打包配置,例如路徑、Scripting Desfines 等等,我只需按下一個按鈕就能自動打包 Win、Mac、Linux 三個平臺。
這兩個插件的名字過於普通,所以需要通過原鏈接查看,難以搜索,我都是在 OpenUPM 找到的。
Github 鏈接:
https://github.com/Team-on/UnityBuildManager
https://github.com/LotteMakesStuff/LMS.Version
Smart Library
Asset Store 鏈接
一款類似 Blender 資源管理的插件,可以把當前工作常用資源組織起來。例如我在編輯一個吐司皮膚,就把相關的模型、材質、prefab、配置等等內容放到一個組下快速訪問。
UEvent
Github 鏈接
在我的編寫習慣中,極度依賴事件來解耦代碼,用來用去最順手的就是 UEvent 這款插件。簡單來說,派發事件無需指定對象,且可傳遞任意參數。
想要監聽事件,只需給回調方法加上 Listen + 事件名,寫起來很簡潔。這種事件監聽模式的好處之一,就是刪除圖中任意事件代碼都不影響程序運行,因為不存在引用依賴。
Odin Inspector
Asset Store 鏈接
Odin Inspector 是一款功能強大的編輯器增強插件,它的使用案例建議到官網查看才夠全面,這裡我簡單舉例 CATO 的使用場景。
OnValueChanged 可以監測數值變動進行回調,在 Editor 模式直接調參查看編輯效果。
Inspector 的變量多起來閱讀不方便,可以用 [Title] 屬性註釋給變量分組。
給方法加上 [Button] 屬性註釋就能直接在 Inspector 變成按鈕。
給 reference 的 ScriptableObject 加上 [InlineEditor] 屬性註釋就能直接在 Inspector 內編輯,無需繁複跳轉。
數值類 ScriptableObject 很適合用 [TableList] 屬性註釋來格式化內容,閱讀與編輯方便不少。
Toolbar Extender
Github 鏈接
Toolbar Extender 是直接覆蓋 Unity 編輯器工具欄的一款插件,可以方便植入操作按鈕。我加了一個幀率按鈕,一鍵切換低中高幀率,在 debug 動作和物理遊戲的幀敏感 bug 特別實用。此外也可以用來跳轉常見場景,比如圖中的 LD 按鈕就是快速跳轉關卡編輯器的按鈕。
用過 Scriptable Object 的朋友都知道,它內容的變動經常不自動保存,所以每次都需要瘋狂 ctrl+s 或者去菜單操作才安心些,於是我給編輯器加入一個順手的保存按鈕,就是上圖的 S 按鈕。
結語
這篇文章主要傳播使用插件的可能性,並不代表每個工具都對你的項目好使。我覺得挑插件最重要的是知道自己需求,多試試插件的 demo。如果不是親自試用過,和別人交流就會泛泛而談:有人說這個插件有坑,有人說很牛逼,有人說性能不好。希望各位保持開放靈活的開發態度,不被工具束縛住。