6 種 NPC 角色類型(附真實世界的即時 3D 範例)
做你自己的 NPC 角色類型
任務、商人、敵人、夥伴、背景、可互動 — NPC 角色的六種類型,每一種都配上一個你現在就能走進去的真實 3D 世界。
真正在 3D 世界裡出貨的 NPC 角色類型,大多落在六個分類裡:任務、商人、敵人、夥伴、背景、可互動。你選哪一類,就決定你得接上哪些系統 — 對話狀態、物品欄、尋路、仇恨,或者什麼都不用接 — 也決定了當玩家做出你沒預料到的行為時,哪個地方會先壞掉。
這一頁把這六種 NPC 角色類型逐一拆開來談。每一種都會有定義、讓它在引擎裡真正運作的機制、我們最常看到的失敗模式,以及一個用 Neta Studio 3D Game Builder 做出來的即時世界 — 你可以直接走進去,而不是看截圖。
快速解答:六種類型
這六種是:任務 NPC,負責派發與完成目標;商人 NPC,用貨幣交換物品;敵人 NPC,會戰鬥而且在戰鬥之間持續存在;夥伴 NPC,跟著玩家跑;背景 NPC,用來填充場景但不互動;可互動 NPC,指的是在原地做出反應的物品、動物與固定裝置。
整個分類體系就是這一句話。接下來這一頁會逐一處理 — 每一種類型在機制上做什麼、什麼會先壞掉,以及一個用這個產生器做出來、你可以打開走進去逛的世界。
為什麼先決定類型,再決定模型
網格、骨架和動畫組,在各種類型之間基本上可以互換。同一個村民網格、同一段待機動畫,可以是任務發布者、商人,也可以是背景角色。真正不一樣的是元件堆疊:對話圖、物品欄表格、導覽網格代理、仇恨半徑、觸發體積,或是一個存檔旗標。
先決定類型,你的時間就會花在調校那個真正需要的系統上。先決定模型,你就會做出四個永遠用不到的系統。Mini World 是並排比較最省事的地方,因為六種全塞進同一個場景,中間也不會出現讀取畫面。
任務 NPC
任務 NPC 擁有的是劇情狀態。它提出一個目標、知道那個目標完成了沒有,並在完成時給出獎勵。機制上,這是一張至少有三個進入條件的對話圖 — 未開始、進行中、已完成 — 再加上一個指向目標旗標的參照,讓世界裡其他部分可以去設定它。
失敗模式是把那個旗標存在 NPC 自己身上。只要 NPC 被銷毀、被串流卸載,或世界重新載入,任務就重設回未開始,而玩家手上還拿著你叫他去撿的東西。這時玩家物品欄裡躺著一件沒有主人、也沒有地方能交的任務物品。把旗標放進玩家存檔,用一個穩定的任務 ID 當鍵,然後讓對話圖在面板開啟時讀那個變數,而不是在 NPC 生成時讀。
第二件要弄對的事是交還判定。如果完成判定只在 NPC 腳邊一個很窄的體積內觸發,那麼坐在移動載具上交任務、或隔著圍籬交任務的玩家就會漏掉。給完成判定一個寬鬆一點的半徑,再加一道視線檢查,並且把它跟互動提示分開,這樣走近 NPC 不會自動完成一個玩家根本還沒讀過的任務。
想看完整個循環,The Cyclops' Island 是最短的路徑。那裡只有一個發布者、一串很短的目標,以及一個會打開島上其他區域的獎勵。走過去、接下目標、離開、再回來,然後看看你帶著物品回來時,對話的進入條件發生什麼變化。那個三態轉換就是任務 NPC 的全部;看過一次之後,你在哪裡都重做得出來。
商人 NPC
商人 NPC 用貨幣交換物品。整個機制就是這樣。機制上,一個商人就是兩張表加一道檢查:一份帶買價的物品 ID 庫存清單、一條賣價規則,以及在交易成立前先跑的貨幣比較。
商人在經濟裡的角色遠比一筆交易大。商人是主要的貨幣回收口,也正是這一點擋住了戰利品不斷累積成一個玩家已經不在乎的數字。商人同時是節奏閥門:商人的庫存決定玩家接下來能挑戰什麼。當測試玩家卡住時,第一個該檢查的是商人庫存,不是敵人難度。
這是最容易做的類型。一個觸發體積、一份物品清單、一個面板。不用導覽網格、不用仇恨,不想做對話圖也可以。工作量幾乎都落在那個面板上。
它同時也是最容易做得很無聊的類型。固定庫存會把商人變成自動販賣機:玩家買一次就再也不回來。兩個便宜的做法。第一,補貨 — 用計時器或在世界事件觸發時換掉庫存清單。第二,設門檻 — 在玩家去過某地或清掉某個東西之前,先把物品藏起來。這兩個都不需要新系統。賣價一定要嚴格低於買價,否則玩家手上會出現一個無限迴圈,經濟在第二張地圖之前就結束了。
敵人 NPC
敵人 NPC 是一個敵對的行為者,不管玩家有沒有在跟它打,它都存在於世界裡。它在戰鬥之外有狀態 — 待機、巡邏、警戒 — 並且有一個切換進戰鬥的轉換。這就是敵人 NPC 和單純的 CPU 對手之間的界線。
CPU 對手只存在於一場對局裡。它在對局開始時生成、對局結束時移除,回合之間不帶任何狀態。它的行為被對局規則框住,而對局就是整個世界。敵人 NPC 得回答 CPU 對手從來不會被問到的問題:玩家離開之後它去哪裡、死了之後會不會回來、玩家存檔再讀檔之後它還在不在。
為什麼這個區別在設計上重要:敵人 NPC 的配置屬於關卡設計,不是對局調校。你是在世界座標裡挑仇恨半徑、巡邏路線和牽引距離,而這些數字會改變整張關卡讀起來的樣子。仇恨半徑大於關卡視線距離時,戰鬥會在玩家看到敵人之前就開始。牽引距離拉太長,會把一場戰鬥變成横越整張地圖的追逐,順便把路上每一場遭遇都拖進來。給每個敵人三個可以逐個調整的數值:仇恨半徑、牽引距離,以及脫戰時間。
另一半是持續性。要針對每個敵人決定它重生不重生、由什麼觸發 — 世界重新載入時、計時器到時,還是永不重生。你不決定的話,預設行為幾乎都是永不重生,於是一輪玩完之後你就默默刪掉了世界的一塊。敵人死亡還需要一條屍體規則:要嘛屍體在計時器到時消失、並在那一刻掉出戰利品,要嘛屍體留著、戰利品表從屍體上讀取。兩者混用,就會做出可以撿兩次的敵人。
夥伴 NPC
夥伴會跟著玩家、參與移動或戰鬥,並且跨場景帶著狀態 — 生命值、物品欄,有時還有好感度。它是唯一一種大部分時間都在畫面上、而且在其中大部分影格裡都在做事的類型。
讓夥伴難做的是尋路問題。夥伴是一個導覽網格代理,而它的目標是另一個會移動的代理。最先壞掉的是門口:如果夥伴的代理半徑大於門洞扣掉間隙之後的寬度,它就拒絕尋路穿過,玩家只能自己走過去。狹窄樓梯、梯子和移動平台也是同樣的壞法。三個設定可以解決大部分情況。跟隨偏移 — 瞄準玩家身後的一個點,而不是玩家的精確 transform — 一段停止距離,讓夥伴不會擠到鏡頭前面,以及一條追趕規則。
追趕規則不是選配。如果夥伴已經離開視線超過幾秒,又落後好幾個身長,就把它傳送到玩家身後最近的導覽網格點上。每個玩家早晚都會把夥伴卡在幾何體上,而且每個玩家都會注意到自己做了這件事。沒有傳送的話,問題不是夥伴迷路;而是玩家得走回去找它,兩次,然後就再也不帶它出門了。
也因為牽涉的範圍這麼大,夥伴是最難做到能出的類型。夥伴會碰到所有東西:它會拉走敵人的仇恨、它會擋住玩家自己的移動、它會踩到壓力板、它會佔用生成預算、它會出現在只為單一角色排練過的腳本演出裡,還會在對話時站在鏡頭前面。其他每個系統現在都得回答「夥伴在這裡會做什麼」。你走過商人旁邊,商人什麼都不做。夥伴在每一個場景裡都會做點事,包括那些從來沒為它設計過的場景。這就是為什麼夥伴比這份清單上任何其他項目都更容易被砍掉。
背景 NPC
背景 NPC 存在的目的,是讓一個地方看起來有人住。沒有對話、沒有物品欄、不能互動。通常三到四段待機動畫、一段走路循環,加上一條曲線路徑或一個小小的巡邏半徑。
你需要的數量比你想的少。關鍵是同一時間有幾個落在鏡頭視錐內,不是整張關卡裡有幾個。只要有一部分在動,幾個看得見的角色就能讓一條街讀起來是有人氣的。眼睛讀的是動作和剪影,不是人數。在鏡頭真的會看的地方稀疏地放幾個錨點 — 沿著主要路線、在玩家會走的門附近 — 讓關卡其餘部分空著就好。
讓一群人看起來不對的具體原因,是同步。如果每個背景 NPC 都在同一個影格開始同一段待機動畫,整個場景讀起來就變成一排假人。把每個實例的動畫起始時間用該動畫長度的隨機比例錯開,再給走路的角色稍微不同的速度,讓它們在一段長視線裡慢慢散開。Agent Sprite Forge 是產出群眾所需要那一小組動畫最快的方法 — 幾段待機加一段走路 — 不用為每個角色手工做動畫。
成本控制在這裡比其他任何地方都重要,因為背景 NPC 是唯一一種你會大量擺放的類型。讓它們不要進導覽網格,免得吃掉真正需要尋路的代理要用的查詢。全部共用一副骨架和一張材質圖集。給它們零碰撞,或者一個不會擋住玩家的推開半徑。也不要因為怕玩家跟它講話就給它一張對話圖 — 一句佔位台詞等於在教玩家這個世界很薄,而他們一定會去試。
可互動 NPC
可互動 NPC 是在原地做出反應的:按鈕、拉桿、門、告示牌、動物。它們有一個狀態和一個反應。它們沒有行程表、沒有路線、沒有對話樹。
跟道具的分界線是狀態。道具播一段動畫然後回到靜止,或是做一件事但不記得自己做過。一旦某個物件有了持續存在的狀態變數 — 上鎖或解鎖、開或關、餵過或還餓著 — 而且第二次互動時行為不同,它就進入 NPC 的領域,需要跟任務旗標一樣的存檔紀律。一個狀態位元加一個反應,那是道具。兩個以上狀態、各自有不同反應,那就是 NPC,即使這個 NPC 是一扇門。
動物屬於這一類,不是背景。一隻在玩家越過某個半徑就逃跑的動物,有感知輸入和反應,那就是一個小狀態機。實作方式跟你做一扇門一樣:一個互動或感知半徑、一個會寫進存檔的狀態變數,以及一個至少有兩段動畫的動畫狀態機。
失敗模式是提示會穿過幾何體觸發。如果互動半徑給得寬鬆又沒有視線檢查,玩家就會拿到牆另一側那扇門的互動提示。用一條射線加上半徑來決定提示要不要出現,並且把互動本身也綁在同一個檢查上,而不是只綁在提示上。否則提示會在牆邊消失,但排隊中的輸入還是會把門打開。
你該做哪一種?
照目標挑,不要照角色長什麼樣挑。第一欄是你想讓玩家做的事。第二欄是能做出這件事的類型。第三欄則是一旦其他東西都疊在上面之後,要改就會變得很貴的那個部分。
如果一個角色要做兩件事,就把它做成一個角色、掛兩組元件,而不是兩個角色並排站著。一個兼發任務的商人,就是一個可互動物件、兩個面板、共用一個存檔參照。代價是這兩條流程現在必須互相對測 — 一個先解完任務、從沒開過商店的玩家,會看到庫存處於一個你大概沒寫過對應情況的狀態。
如果不確定一個角色該歸哪一類,就從背景開始往上加。加一個觸發體積和一張對話圖,就能在不動網格的情況下把背景 NPC 變成任務發布者。反過來就很貴:要把互動從夥伴身上拆掉,意味著它出現過的每一個場景都得重測。
| 目標 | 類型 | 首先要弄對的事 |
|---|---|---|
| 玩家需要一個理由前往某處 | 任務 NPC | 任務旗標存在玩家存檔裡,用穩定的任務 ID 當鍵 |
| 玩家需要把戰利品換成能用的裝備 | 商人 NPC | 庫存表,加上一道在交易成立前先跑的貨幣檢查 |
| 玩家需要一場技術或資源的考驗 | 敵人 NPC | 仇恨半徑、牽引距離和脫戰時間,逐個實例調校 |
| 玩家需要活著走完一條長路線 | 夥伴 NPC | 跟隨偏移、停止距離,以及一條追趕傳送規則 |
| 場景需要讀起來有人住 | 背景 NPC | 共用動畫並把相位隨機錯開,而且不掛導覽網格代理 |
| 世界需要在原地對玩家做出反應 | 可互動 NPC | 一個持續存在的狀態變數,以及一個帶視線檢查的觸發體積 |
走進它真正所屬的那個世界
精靈角色是沒有地方站的角色。最後這一步是別人沒提供的:把你剛做好的精靈表放進一個有人可以走動的世界裡 — 一座小島、一顆行星、一個下雨的街角。這個網站上的每個世界,都是從一段文字描述做出來,並發布成一個可以直接玩的頁面。
常見問題
NPC 角色總共有幾種類型? +
以我們的分法有六種:任務、商人、敵人、夥伴、背景、可互動。這是功能上的分類,不是生物學上的分類。分法是照角色需要哪些系統來組織的 — 對話狀態、物品欄、尋路、仇恨,或只是一個狀態旗標 — 所以兩個模型完全不同的角色,可以是同一種類型。
敵人也算 NPC 嗎? +
算,只要它在戰鬥之外也存在於世界裡。敵人 NPC 有待機、巡邏和警戒狀態,而且在戰鬥之間持續存在,所以它需要一條重生規則和一條存檔規則。只在對局內存在的 CPU 對手,在這個意義上不是 NPC,因為它沒有任何東西能活過那場對局。
哪一種最容易做? +
商人。一個觸發體積、一份帶價格的物品清單、一道貨幣檢查、一個面板。沒有導覽網格、沒有對話圖,除了玩家本來就有的物品欄和錢之外,也沒有任何狀態要存。
夥伴 NPC 需要 AI 嗎? +
它們需要的是尋路和跟隨規則,遠比需要決策來得多。難的部分是貼著一個會移動的目標、穿過門口和樓梯、一直待在導覽網格上,再加上失手時的追趕傳送。決定夥伴攻擊什麼,只是這件工作裡很小的一塊。
什麼是背景 NPC? +
一個不能互動的角色,擺在那裡是為了讓場景讀起來有人住。沒有對話、沒有物品欄,通常不掛導覽網格代理,也常常沒有碰撞。它是為鏡頭而存在的,所以重要的是同一時間看得見幾個,以及它們的動畫循環有沒有互相錯開。
一個 NPC 可以是兩種嗎? +
可以,而且通常就該這樣 — 一個兼發任務的商人,就是一個可互動物件、兩個面板、共用一個存檔參照。代價是組合爆炸的測試:每一個任務狀態乘上每一個商店狀態,都是你得檢查的情況,而玩家最先找到的,往往就是你沒寫的那一種。
回到 3D Game Builder
31 個完成的 3D 世界、遊戲和場景全都在同一頁 — 每一個都能直接玩。