這次我們來討論一些沒那麼有趣,但是至關重要、與執行息息相關的話題。在遊戲的原型體驗達到設計預期後,就算正式開始投入製作了。在這一步,通常會需要將各類系統的結構和數據流清晰的整理出來。這一步是非常重要、但是經常被人忽視的。在投入製作之前,將系統結構清晰的整理出來,有助於多線程的推進進度,還可以降低後期維護和更新的成本(前提是能夠堅持每次能進行結構整理)。所以這一次我們就嘗試把匹諾曹的戰鬥系統的核心部分抽象地剝離出來,並且進行一些說明。
本文所展示的內容並不是完整的匹諾曹戰鬥系統,僅僅只是作為一個示例,講述一下構建系統的基本方法。
戰鬥頂層系統
要確認第一個要點是:從不同層級來觀察系統,關注的側重點也不同。如果在最頂層討論戰鬥系統,那麼我們就會更加關注模塊之間的溝通和數據流動;對於涉及到模塊內部的溝通,可以暫且忽略不計,然後在下一層級中考慮。例如,在匹諾曹的武器系統中,最有特色莫過於武器組合功能。玩家可以將武器拆分為刃和柄,並且可以自由地將不同武器的刃和柄組合起來,構成一把獨特的武器。刃會決定武器的基礎屬性和處決模組;柄會影響武器的加成類型和攻擊模組。但是在討論頂層系統的時候,其他系統並不需要了解這些數據是從何而來的。對於傷害計算的模塊來說,它只需要瞭解武器所產生的攻擊數值,再從怪物模塊中獲得抗性,就能夠得到最終的傷害。所以在這一層級進行討論的時候,武器系統只需要對外提供攻擊這一數據。
那麼到底要如何開始呢?首先可以將注意力集中在某個最出挑的系統上。以匹諾曹為例的話,就會選擇武器系統上。除了上面提到的傷害數值,武器系統中還可以抽象出以下的幾個數值。
在這些數值裡,我們暫時可以將“耐久度”、“加成類型”、“攻擊模組”和“處決模組”放到一邊,重點關注頂層層級的數據溝通。“重量”將會影響角色的負重,進一步影響精力恢復的效率。“虛構技”消耗虛構值;“虛構恢復”恢復虛構值。這樣我們就能引出戰鬥資源的模塊。戰鬥資源的最大值又受到角色屬性的影響。這樣就基本上能夠將戰鬥系統的主要部分。
隨後再從圖中已有的數據出發,反推其影響因素就能夠得到戰鬥系統的核心部分。例如武器的重量會累計在角色負重上,那麼還有什麼其他的系統會影響角色負重呢?這樣就能引出防禦零件系統和義手系統。以此類推,就能逐漸完善系統的結構。
子系統-武器
然後我們再以武器系統為例,做一個子層級的系統圖。首先將刃和柄的概念帶入。然後簡單調整一下剛剛提到的幾個數據,就能得到下面的圖。可以看出來的是,在子層級的視角下,模塊內部的數據溝通是關注的重點。其次就是對外的數據接口,也就是“該系統需要給其他系統提供什麼信息”。
在武器系統裡,武器面板和最終傷害的計算相對複雜一點。首先,刃提供基礎數值,柄提供加成類型,再根據加成類型獲取對應的角色屬性,得到加成數值。基礎數值和加成數值相加,就得到武器的面板數值。除此之外,遊戲將攻擊的動作分為“斬擊”和“戳刺”。武器的刃也有一個叫做攻擊類型的參數,用於表示刃對不同攻擊動作的適應程度。如果刃的攻擊類型的柄的攻擊動作不匹配的話,那麼就會降低最終傷害。
總結
如果設計者對整個系統是有完整的想象和預期的,那麼完成系統構建本身其實並沒有什麼難度。因此拆解一個完整的系統其實就是在描述已知的規則和交互,我們是站在一個完整的視角去看待系統的。只要對這個遊戲足夠的瞭解就能夠一點一點的理出系統結構。但是實際工作中的難點在於一邊調整設計目的和結構性內容,一邊還需要維護系統穩定、推進工作流程。尤其是當需求通過表層的現象被提出來的時候,就可能因為圖方便,隨意地從表層修改,相當於在系統中搭上手腳架。搭著搭著,日積月累,整個系統就開始變成黑盒了,沒有人知道完整的邏輯和系統之間的影響,每次微小的改動都可能有極高的風險。這種情況還是希望能儘量避免的。
真的能避免嗎……