LV. 45
GP 1k

RE:【情報】大家盼望已久的 Cities: Skylines II!2023 年 10 月 25 日 0:00 推出!

樓主 紅石刺客 assassinW
大家好,我是 Sergey。大家或許更熟悉 MacSergey 這個名字。
我製作了《Cities: Skylines》中一些熱門的模組,諸如道路劃線工具(Intersection Marking Tool)、節點控制器更新版(Node Controller Renewal)、道路工具箱(Network Multitool)等等。
2 年前我受到 Colossal Order 的聘請,目前正在開發 《Cities: Skylines II》的模組製作功能。
今天由我來撰寫這篇開者日誌,旨在與大家分享我們製作代碼模組的方法。


改善代碼模組製作:
代碼模組製作是《Cities: Skylines》重要的部分,我們希望 《Cities: Skylines II》也能有相同,甚至更多模組製作的可能性。
我們相信,可以修改遊戲是件很酷的事,並且能帶來許多啟發。
如果您觀察一下不同玩家如何使用模組遊玩《Cities: Skylines》,您會看到完全不同的遊戲風格,彷彿他們玩的根本是不同的遊戲。
一些玩家喜歡鉅細靡遺地還原現實世界;一些玩家喜歡管理交通&產業生產鏈;一些玩家則放飛自我,讓 100 場龍捲風襲卷城市。

對於「完美的功能組合」,每個人都有不同見解。
我們從社群中汲取了許多熱門建議,將它們納入遊戲的基礎功能,但老實說,要實現所有玩家的所有願望是不可能的。
這時就該模組出場了。每個人都可以按自己的喜好加入內容、修改遊戲,即便您是全世界唯一需要這種功能的玩家。

對我來說就是這樣的情況。
我是在 2019 年得知《Cities: Skylines》這款遊戲,當時我在網上看到 1 篇文章,說 1 名玩家在該遊戲中複刻了他的家鄉城市,這讓我也躍躍欲試起來。
於是我便開始玩《Cities: Skylines》,我喜歡遊戲自帶的功能,但到了某個時刻,我開始設想「要是能做到這樣或那樣的事就好了。」就這樣,我意識到我可以修改遊戲,但遺憾的是我找不到任何能實現我想法的模組,於是我決心自己來編寫。
我沒想到我的模組會流行起來,也沒想到有其他人需要這些功能,結果我的模組大受歡迎。

我覺得很棒的一點是,儘管 《Cities: Skylines》發布以來已過去 9 年,但還有新的模組陸續出現。
對於社群來說,這其中一些模組已經成為遊戲的必要部分。
這只是因為直到有人為自己製作了這些模組,並分享出來,其他人才意識到他們需要這些功能!


為《Cities: Skylines II》製作模組:
《Cities: Skylines》為模組製作提供的支援非常有限。
通常您會遇到 1 個瓶頸 —— 遊戲不讓您輕易修改一些內容,您就需要花費數日才能實現這種修改。
其他模組作者也會遇到同樣的限制,並以自己的方式實現修改,而這些實現方式可能彼此衝突。

在《Cities: Skylines II》中 ,我們希望提供一切可能的支援,讓模組製作更加輕鬆,如此一來您就不必自己實現幾乎所有模組都需要的、獨立於其功能之外的通用功能。
我們還進行了一些生活品質方面的改善,這樣您就不必花費數日研究您應該安裝哪個外部工具版本,或是如何在 IDE 中創建模組項目,新增所需的遊戲從屬模組來編寫您的模組。

要實現我們的目標,第 1 步是製作模組製作工具鏈並投入使用。
只需按一個鍵就可以安裝所有需要的從屬模組&外部工具,諸如模組製作所需的 Unity 引擎、Burst 編譯器、ECS。
如果任何從屬模組有更新,或者運行要求發生改變,模組製作工具鏈會在您打開遊戲時立即通知您,並提供更新,讓您保持最新的開發設定。
UI 會顯示您所需要的模組製作工具的安裝進度

接下來,我們製作模組專案範本它使用新的 .Net 範本機制,在 Visual Studio 或 Rider 上創建新專案時會顯示在專案清單中。
所有需要的從屬模組、路徑、構建後操作都設定好了,您只需按下「構建」按鈕,模組將被編譯、後處理,並放入正確的資料夾,您啟動遊戲就可以看到它。
Visual Studio 中的模組專案範本會創建新的專案對話

模組完成後,可以使用預設 IDE 的發布選項,直接從 Visual Studio 或 Rider 發布到 Paradox Mods 上。
專案範本中有個空的發布設定檔需要填寫,填寫完畢後,點擊選項,選擇「發布」選項。
您的模組將發布到 Paradox Mods,其他玩家可以訂閱並使用。
Rider 的發布選項


改善模組:
遊戲使用 Unity 引擎的一些新技術,諸如實體組建系統或 Burst 編譯,來利用多執行緒和低級別改善,這能將部分計算的速度提升 30 至 40 倍。
但是需要額外知識才能運用這些技術,從而從中受益,否則使用這些技術可能反而降低。
《Cities: Skylines》中人們習慣使用的模組製作方法在《Cities: Skylines II》並不會收穫最佳的結果。

您依然可以使用 Harmony 之類《Cities: Skylines》中普遍的模組製作工具,但續作中其局限更多了。Harmony 只能修改託管代碼,但經過 Burst 編譯之後,為了改善,遊戲的部分代碼成了非託管代碼。
Harmony 無法修改此類代碼,但這不是問題,因為所有遊戲實體&組成部分的資訊都可以在模組系統中找到,不需要修改現存遊戲代碼就可以變更或增加。

為幫助最佳化您的模組,我們還提供 1 個模組後處理器,進行遊戲中使用的 burst 編譯&低級別改善,好讓模組享有和遊戲所用引擎一樣的可能性,而不需要您自己另外鑽研實現方式。
我們為這個工具設定的目標是引導您使用正確方式,減少最常見的錯誤,防止您花費大量時間定位錯誤。
在團隊完成所有改善後,您還可以透過它獲得與遊戲相同的效能&最佳化效果。

改善並非必須,因為它並非對所有代碼都有好處,改善與否還是取決於您代碼的作用。
很多情況下建議最佳化,因為 Unity API 使用原始程式碼生成,會在後處理階段將一些代碼替換為實際的實現。
如果您的代碼使用這樣的 API 調用,並且您不使用我們在所生成模組專案範本和模組後處理器中為您創建的設定,您的代碼將不會生效,並且會出現「未實現」異常。


模組相容性:
如果您為《Cities: Skylines》製作過模組,您會知道遊戲更新對模組相容性的影響,在 《Cities: Skylines II》中,我們希望努力改進這個問題。
模組修改的遊戲代碼可能改變,所以完全避免模組出錯是不可能的,但我們正在努力減少模組因遊戲更新而出錯的可能性。

如果您熟悉模組製作,您多半知道模組出錯的原因,但如果不然,我將試著簡短解釋一下原因:模組修改遊戲代碼時,會使用一些「簽名」(類名、方法參數、欄位等)來定位代碼的特定部分。
進行更新或損毀修復時,基礎遊戲代碼發生變化,模組尋找的「簽名」不再存在,又或者,所修改的部分代碼與更新前的運作方式有些不同了。
我們無法得知數千個模組分別修改哪部分代碼,即使我們知道,還是需要修改這些代碼才能修復遊戲故障、增加新功能。
要不損壞模組,唯一方法是完全不更新遊戲,但是我們當然需要更新遊戲。
在開發《Cities: Skylines》最新的幾個資料片時,我經歷的其中 1 個有趣時刻是,發布資料片後我意識到我的某個模組損壞了,原因是我自己為了修復故障或增加新功能,修改了基礎遊戲代碼。

在 《Cities: Skylines II》中,這個問題應該有所緩解,因為模組功能與遊戲功能運作方式一樣。
為了製作某個徹底的新功能,您不需要找到遊戲代碼中的不同位置,便可徹底修改來加入您的模組功能,也不需要擔心未來遊戲更新時,其中一部分基礎遊戲代碼會發生改變。
您唯一需要做的事是創建您自己的系統並將其登錄在更新循環中。
從那一瞬間起,遊戲會像對待一切基礎遊戲系統一樣對待您的系統。
另一個例子是遊戲設定。
我們製作了 1 個簡單但靈活的自動系統,它可以從您的模組中獲取您用特殊屬性標記的屬性,並將其填入遊戲設定中。同樣,您可以透過調用 1 個方法來登錄您的設定,而不用糾結如何為您的模組創建 1 個設定頁。
遊戲設定系統説明您更輕鬆地為模組新增設定

我們還最佳化了遊戲處理模組和其從屬模組的方式。
如果某個模組整合進第 2 個模組中,從第 3 個模組中獲取資料,還變更第 4 個模組中的內容,事情可能變得很複雜。
這在《Cities: Skylines》中是個問題,該作在管理模組和遊戲的複雜關係上遇到很多困難。
您多半在《Cities: Skylines》中遇到過這種情況:由於 2 個模組使用同一從屬模組的不同版本,其中1 個模組會損壞另個模組。
《Cities: Skylines II》努力找尋多數此類複雜關係,並解決模組之間的從屬模組衝突。
另外,不存在「某模組必須先於另個模組模組載入才能生效」這樣的模組載入順序。
在《Cities: Skylines II》中,您不必擔心這種問題出現。


模組作者視角:
在來到 Colossal Order 工作之前,我曾是名工程師,但我此前從未在遊戲工作室工作過。
我來自模組製作社群,因而我知道從遊戲開發者的角度來看,有些事情可能沒有那麼重要。
遊戲開發者在開發過程中會使用特殊的引擎工具,而且可以接觸所有原始碼,但模組作者沒有這些東西。
有時候,使用開發者工具只需滑鼠點幾下的事,沒有這些工具就需要花費數小時,甚至數天,其中差別就是如此巨大。自從我開始在 Colossal Order 工作,我很多次想到「啊,這在引擎編輯器裡做起來真簡單,可是我&其他模組作者之前做起來卻那麼困難。難怪遊戲裡沒有改進這個問題。」依靠我的模組製作經驗,我注意到這些差別,可以強調它們,以便我們進行改善,讓模組製作變得遠比之前簡單和高效。

我們不只依靠我的模組製作經驗,我們還有個模組製作測試,有許多為《Cities: Skylines》製作了熱門模組的作者。
他們有權搶先體驗《Cities: Skylines II》&模組製作工具鏈,因而可以開始探索遊戲&其模組製作的可能性。
這段時間,他們甚至製作了一些簡單模組,其中一部分你們可能已經試用過了,而我們還在開發模組製作支持。
我們聽取他們的回饋,像是他們希望模組製作 API 裡有什麼內容,或是希望哪部分遊戲代碼更容易訪問。
我們希望幫助他們實現創作,讓遊戲向著各種有趣的方向發展。

開發能幫助其他模組作者的功能,對我來說是種很有啟發性的體驗,光是看到搶先體驗的模組作者使用我加入遊戲的工具為《Cities: Skylines II》製作超棒的新模組,我已經感到有點自豪了。
我希望我們將模組製作支持加入遊戲後,可以儘早看到更多社群成員的作品,我們將根據回饋,持續改進支援。

板務人員:(代管中)歡迎申請板主