大家好!這篇貼文將簡要介紹 Hytale 的 NPC 框架現況、外觀,以及我們未來的發展方向。有些內容會比較技術性一點,所以不感興趣的部分可以跳過或快速瀏覽。NPC 相關系統非常多,這篇貼文不可能涵蓋全部!
目前現況
目前的 NPC 框架支援多種行為,橫跨多個系統,全都使用資料驅動(data-driven)的資源來設定。你不需要懂任何程式語言就能建立它們——即使是最複雜的 NPC,也幾乎完全由資料驅動。
我們透過多個行為相關系統來實現這一點,但這篇主要會介紹兩個核心:「角色」(Roles,NPC 的核心)以及「戰鬥行動評估器」(Combat Action Evaluator)。
文件與教學
想更深入了解 NPC 的話,我們的朋友 hytalemodding 已經製作了很多很棒的文件,我們也提供了生成的 NPC 文件以及一份書面教學。
配合這份教學,我們還製作了 6 部影片系列,針對某些部分做更細部的說明;建議兩者一起使用以獲得最佳體驗:
角色(Roles)
每個 NPC 都有一個「角色」。這代表它們的整體行為模式,以及對世界中不同刺激的反應方式。只要更改 NPC 的角色,就能完全改變它的行為集合。我們提供了許多可自訂數值的模板,讓建立新 NPC 變得快速又有效率。
除了行為本身,角色還決定了 NPC 的移動方式、攜帶物品、外觀等等。
技術層面來說,這種行為由我們稱為「指令列表」(instruction lists)的概念來表示。這跟決策樹(decision trees)或行為樹(behaviour trees)類似,但我們簡化了一些語義。每個指令包含一個「感測器」(sensor)——用來查詢遊戲狀態,決定這個指令是否可執行——以及如果選中該指令時,NPC 應該執行的動作或運動。或者,動作與運動可以替換成巢狀的指令列表,讓行為可以建構得更複雜。
如果你熟悉行為樹,可能會好奇差異在哪裡——感測器有點類似裝飾器(decorators),結構仍是樹狀。關鍵在於我們遍歷指令列表的語義:我們一律採用「fallback selector」節點的語義。每個指令依序評估,一旦匹配就執行。除非指令中特別加入旗標,否則不會繼續評估後面的指令。這確保了 NPC 邏輯的流程無論樹多大、多深都容易追蹤。
雖然個別元素類型(感測器、動作、運動等)是用 Java 寫的,但指令列表完全用 JSON 建構。目前我們有超過 150 種不同的元素類型可以用來組合行為,並有框架讓模組作者用 Java 輕鬆新增更多。雖然不是全部都已完成,但我們正積極迭代並盡量新增!
我們設計 NPC 框架的初衷,就是希望能在不同層級與它互動。不管你是完全新手還是老手,都能有適合的方式讓你的創作活起來。


這裡有一個範例:把羊的角色從「Template_Animal_Neutral」(中性動物,家畜行為)改成「Template_Predator」(掠食者),它就從溫順變成攻擊性。
甚至還可以給它隨機武器,馬上就能做出「Die Hard Sheep」模組!

戰鬥行動評估器(Combat Action Evaluator)
雖然指令列表已經給予設計者極大的彈性來設定 NPC 與戰鬥行為,但如果要做出不只基本攻擊、還需要快速決定何時使用特定攻擊的角色,用純指令列表很快就變得繁瑣。
戰鬥行動評估器就是為了滿足這些需求而存在。它作為 NPC 核心行為的輔助框架,能在每一刻根據自身狀態、周圍世界、敵人或盟友做出智慧決定。每個可能的攻擊(或其他戰鬥動作)都會被指派一組條件,標示出最佳使用時機——例如 HP 低時、敵人靠近時、玩家試圖繞背時。這些條件會被評估,每個動作互相權衡,決定 NPC 想採取的行動。
這種決策方式為 NPC 帶來一點「模糊性」,讓戰鬥遭遇更有趣,設定也更精簡。缺點是學習曲線較陡,NPC 有時可能不會照你預期行事!效能也比較耗,但我們希望透過迭代改善。
例如,Skeleton Praetorian 能智慧地決定使用不同能力:格擋、低血召喚、衝鋒,搭配基本攻擊。

以下是召喚能力條件設定的部分片段:
現實檢驗
聽起來好像已經很成熟,甚至可以直接上線了,對吧?
嗯……其實還不行。還有很多粗糙邊角、缺少的功能,以及需要大幅改進的領域。正如我們談到系統能做什麼,也必須談談還沒到位的地方。
強大的功能伴隨強大的工具需求。我們在這方面還差很遠。雖然有計劃做視覺化編輯與除錯,但目前大多數 NPC 設定都是直接在 JSON 檔案用文字編輯器完成。雖然可行,但很痛苦。我們雖然提供了多種除錯途徑,但都不直覺,大多需要閱讀大量詳細日誌。
我們提到戰鬥行動評估器的學習曲線,但這其實適用於 NPC 的所有部分。我們希望有更平順的入門體驗,但目前只能提供有限的模板範例、元素文件與簡單教學。
還有許多重大功能尚未實裝。NPC 在戰鬥中定位不佳、不會適當迴避或群聚;飛行 NPC 能起降,但游泳 NPC 無法離開水面,反之亦然。需要新增的功能清單還很長。
效能潛在問題也很多。我們目前能支援相對多的 NPC,但路徑尋找(pathfinding)等部分還需大幅優化。我們盡量關閉路徑尋找,否則效能很容易崩。
還有大量技術債要處理:例如 NPC 目前無法主動破壞方塊(除了投射物爆炸),因為某些非 NPC 系統的限制需要重構(但它們能放置方塊!);NPC 物理也需要完整重做,與玩家系統統一。路還很長——甚至還沒談到生成(spawning)!
到處都是 Bug
社群很多人指出釋出的遊戲影片中有大量 Bug。由於開發速度快,很多影片已經過時,最嚴重的 Bug 其實已經修好了!不過我想特別談談路徑尋找的挑戰,以及這對早期存取釋出的影響。
路徑尋找是個大而複雜的主題——很多一般遊戲都掙扎。更何況是程序生成、可完全修改的方塊世界,我們無法依賴已知地形的優化技巧。
因此目前的路徑尋找很慢。雖然不會造成明顯效能問題,但慢到我們目前不允許所有 NPC 隨時使用,並對其能力嚴格限制。這就是為什麼洞穴迅猛龍不會跳過缺口追玩家。我們無法預先在世界中放「跳躍點」,因為世界隨時可能改變,每增加一格跳躍距離,對每次搜尋的成本都很大。
我們不預期早期存取釋出前能解決,但我們承諾會全面改善路徑尋找,已開始開發新方法,若證實可行,將解決大部分問題。
下一步是什麼?
工具優先度很高。如果要好好支援模組作者,就必須給他們好玩的創作工具!一開始不會有完整除錯工具套件,但我們會盡量整合現有資源。
同時也要處理路徑尋找與移動問題,解決技術債,避免玩家在複雜環境面對多個 NPC 時效能瓶頸。很多地方都能改善,讓早期階段的戰鬥也感覺有趣。
新增更多模板也能讓世界更生動,為 Orbis 不同種族的獨特行為注入生命。這些模板也作為模組作者的靈感來源,或直接套用如果行為適合。
這一切都朝向製作真正的大 Boss 邁進——將所有 PvE 系統推到極限的遭遇戰。需要做的工作遠比這裡列的多,但我們一步步來,逐步推進。給我們多一點時間,就能全部實現!
先睹為快:除錯指令
這篇貼文本來計畫在早期存取釋出前發布。在此之後,我們投入不少努力讓 NPC 對模組作者更友善。雖然還沒有視覺編輯器或深度除錯,但我們加入了多種視覺化功能,讓你更容易理解 NPC 運作方式(我們自己也用這些找到不少 Bug!)。有些功能還在開發中,以下是目前進行中與即將推出的預覽。
這些視覺化可透過對個別 NPC 開啟特定 NPC 除錯旗標來啟用。可在遊戲內聊天視窗輸入 /npc debug set <flag>(NPC 在視野內),或在 NPC 角色的 Debug 屬性中加入逗號分隔的旗標清單。輸入 /npc debug presets 可取得完整旗標列表與預設組合,以下是最實用的視覺化旗標:
/npc debug set VisAiming

顯示 NPC 實際瞄準的目標。適用於有瞄準指令的 NPC。
/npc debug set VisMarkedTargets

視覺化 NPC 目前鎖定的所有標記目標。大多數標準模板中,NPC 有一個 LockedTarget,通常是正在交戰的實體。適合了解 NPC 如何及何時切換焦點,尤其在群體中。
/npc debug set VisSensorRanges


以環形與視野扇形顯示目前檢查的感測器範圍,以及範圍內哪些實體被哪些感測器匹配。這能快速概覽 NPC 的「感測能力」。雖然顯示為扇形與環,但技術上是可受高度條件限制的球體與錐體。
第一張截圖顯示熊在睡覺,只有一個感測器活躍。第二張顯示熊有聽覺、視覺與絕對偵測範圍。雖然羊被視野半徑偵測到(有目標標記),但在視野錐外,羊群仍然安全!
/npc debug set VisLeashPosition

顯示 NPC 目前的拴繩位置。
/npc debug set VisFlock

顯示與該 NPC 關聯的群體(flock),包括標記領袖與目前群組成員。