讓 RPG 敵人向玩家學習——2007 年的神經網絡原型
2007 年,我的工程學畢業專題提出了一個至今仍影響我工作的問題:敵人能否從玩家的行為中學習,而不是完全依照固定的腳本行事?
我以 C++ 和 DirectX 製作了一個小型 3D 動作 RPG 原型。玩家在競技場中以物理攻擊、法術、治療和目標鎖定,對抗一群史萊姆般的代理。在這個可遊玩的示範背後,是一個實驗性的神經網絡,負責決定 NPC 應該遊蕩、跟隨還是逃避。
我做了甚麼
這個項目結合了三個經常被分開處理的範疇:遊戲系統架構、即時圖像和機器學習。引擎使用 Win32 遊戲循環,分為初始化、更新和渲染三個階段,配合物件導向的角色控制器,約有 50 個 C++ 原始碼檔案和數量相若的標頭檔。
渲染方面包括 3D 世界中的 2D sprite、面向鏡頭的 billboard、動畫貼圖幀、alpha 混合和滑鼠選取。原型亦包括天空盒、光照、粒子效果、鏡頭遮擋、HP 和 MP 系統、幀率監察,以及每個代理的除錯資訊。

為即時決策而設的小型網絡
我刻意讓學習模型保持精簡,以便在遊玩期間更新。它有四個輸入、一個包含三個運算神經元的隱藏層,以及三種可能的行為輸出。
- 輸入:與玩家的距離、怪物的生命比例、附近怪物的數目,以及牠的當前動作。
- 輸出:遊蕩、跟隨或逃避。
- 學習:前饋評估,然後進行誤差修正和反向傳播。
更大的構想是模仿學習。開發者或玩家可以透過與代理對戰來產生訓練資料。位置、生命值、移動、障礙物和所選的動作,都會成為對手學習如何回應的例子。這是一次早期的嘗試:把玩家行為視為遊戲數據,而不是人手編寫每一個反應。
實驗實際發現了甚麼
這個可適應系統很有潛力,但還未可靠到可以稱為完成。而這個結果,成為了整個項目最有用的部分。
- 加入更多隱藏層並沒有令代理變得更好。較深的版本變得更難預測,而且需要更多運算。
- 較小的網絡帶來更直接的對應,用於遊戲內實驗亦更實際;不過縮得太小同樣會產生差劣的決定。
- 在權重修正過程中加入動量,改善了穩定性。
- 線上訓練非常依賴所擷取的玩家例子的質素和範圍。細小或雜亂的訓練資料無法產生令人信服的行為。
- 除錯的可見度很重要。顯示代理的狀態、目標、生命值和輸出,才令學習系統能在運行中的遊戲內被評估。
因此,這個原型展示了整條流程,以及學習類似玩家動作的可能性;同時亦顯示神經網絡並不會自動比人手編寫的行為更好。遊戲仍然需要清晰的輸入、可量度的結果、良好的訓練數據,以及保障玩家體驗的後備方案。

為何這個 2007 年的項目對我仍然重要
很多結論今天又再顯得切合時宜。今天我們可以建立更大的模型、收集更多數據,但互動 AI 仍然必須在遊戲循環中運行、向開發者解釋自己的狀態,並產生讓人覺得公平的行為。只有在改善玩家體驗時,複雜度才有幫助。
報告亦提出了圍繞模型的實用工具:AI 測試台、角色和地圖編輯器、效能分析、可編輯的遊戲數據,以及在遊玩期間更好地收集玩家屬性的方法。這些想法與我今天對 AI 輔助開發的看法一脈相承:有用的智能需要介面、迭代循環和清晰的創作目的。
存檔說明:這篇回顧根據我 2006–07 年工程學士畢業報告《AI Role Playing Game Development》撰寫。截圖來自我為該項目製作的原型;文字已為今天的網誌重新撰寫。