Dumb Game Lab

部落格 · 開發幕後

開發日誌 · 幕後

《網咖養成記》的顧客邏輯,我們是這樣做的

Justin Lee, Dumb Game Lab ·

網咖養成記遊戲畫面。等角視角的網咖裡,每個電腦座位都坐著顧客,店門前的人行道上有好幾位顧客正在走路。右邊座位上方浮著「等待 3」的標籤

經營遊戲的顧客行為邏輯(一般叫顧客 AI)只要守住三件事就能跑起來。座位不用數字算,而是一格只站一個人;有人站著的格子不要封死,而是在 A* 尋路裡加上權重 12;排隊只排在門外一列。這篇整理《網咖養成記》選這三招的原因、實測數字,以及還沒解決的問題。

每位顧客都帶著一份行程

每位顧客生成時,會抽到一份行程(itinerary)。行程的一格就是「使用某種設施一次」。因為是用種類名稱來寫,同一種設施不管有幾台,顧客都會從中挑一台。

網咖的行程只有一格。坐下來、用完離開就結束,是行程裡最單純的退化情況。如果遊戲完全沒給行程,系統會自動補上一份一格的行程:「隨便用一個設施就離開」。

行程有一個保險機制:下一格的設施店裡一個都沒有時,就直接跳過那一格。這樣顧客就不會為了等一個還沒蓋的設施,卡在原地動不了。

座位不是數字,是格子

一開始,替每個設施設定一個人數上限,看起來最省事。但用數字當上限的話,8 個人可能疊在同一個座標上。數字只知道有幾個人在用,不知道誰站在哪裡。

所以我們替每個設施指定一個使用格(interactionCell),一格只能進一個人。顧客選好目標設施的瞬間就先占住那一格,其他顧客占不到。不用另外寫人數上限,重疊也不會發生,因為結構上就排除了。

挑目標時,我們也不是平均抽選。平均抽的話,緊鄰座位的販賣機和房間另一頭的販賣機賣得一模一樣,不管怎麼擺,營收都一樣。要加上權重,擺放位置才會影響營收。

網咖養成記遊戲畫面。電腦桌前每張椅子都坐著一位顧客,中間可以看到櫃台和盆栽
一台電腦一格,一格一位顧客。

有人站著的格子不要封死,加上權重

路徑用的是四方向格子 A*。我們分開詢問:能不能站、能不能穿過、兩格之間能不能通行,最後再問通過這一格的成本。有顧客坐著的格子,這個成本是 12。

把人當成牆會更簡單。但這款遊戲的擺放檢查有個前提:「設施前面那一格也能通過」,靠這個前提保證房間不會被切斷。人一變成牆,前提就破了,在狹窄的房間裡顧客會整批餓著,當天營收變成 0。

改成權重之後,有繞路就一定繞過去,真的沒路才會硬擠過去。硬擠過去的畫面看起來很怪,但那是在提醒你沒留出通道,不是引擎的 bug。

路不是鋪一次就結束

本來以為加上權重 12 就好了,結果幾乎沒改善。原因是路會過期。顧客出發時算好的路,之後有人坐到路上,權重雖然有了,顧客還是照舊路走。

所以人的分佈圖每個 tick 都整張重填。用增量更新的話,只要某條路徑漏掉一次清除,就會留下幽靈把通道永遠堵住。走路中的顧客每個 tick 都會重新看下一格,被擋住就當場重算路徑。每位顧客每 0.2 秒一次。

重算後的路如果還是經過那一格,就直接走過去。讓他停下來的話,大家互相等待就會卡死。

我們在擁擠的擺放下跑了 40 秒,數「踩到站著的人的影格」。沒加權重前是 1,701,只加權重、不重算的狀態是 1,695,幾乎沒變。只加權重而不重算,幾乎什麼都改不了。問題的主因就是路會過期。

網咖養成記遊戲畫面。四位顧客沿著店前人行道走來,上方店內的電腦座位上坐著顧客
走路中的顧客每個 tick 都會重新確認下一格。

排隊只排在門外一列

沒座位的時候,如果讓顧客在店裡排隊,隊伍會堵住通道,尋路就亂掉。所以排隊一律排在門外一列。還沒進門的顧客站在門外的隊伍裡,已經進門的顧客不排隊,直接放棄這一步離開。有沒有座位,是在門前空地那一格詢問。以前是在入口那一格問,結果客滿時顧客會推開門走進來,又轉身走出去。

隊伍也不是能無限排。隊伍上限是「能站的格數」和遊戲設定上限(預設 4)兩者中比較小的那個。超過上限就不排,直接回頭;如果在走過來的路上就發現隊伍已滿,會在隊尾旁邊的人行道上轉身離開。

重點是不能默默把沒接到的顧客刪掉。放棄的顧客會做出放棄的動作、跳出彈窗,遊戲也會統計「在哪一種設施、因為什麼原因漏掉了」。瓶頸如果在畫面上看不到,玩家就沒有理由想到「再多放一台吧」。因為連流失發生了這件事都看不到。

網咖養成記遊戲畫面。電腦座位上坐著顧客,右邊座位上方浮著「等待 3」的標籤。左邊可以看到 +2,135 韓元的營收彈窗
「等待 3」的標籤讓人一眼就能從畫面上看出瓶頸在哪裡。

排隊的顧客全部看向同一邊

做好排隊之後,收到了玩家回報(2026 年 9 月 19 日):「希望排隊的時候大家都面向同一個方向」。我們檢查後發現,朝向只在走路時才會決定。從人行道走上來的顧客面向牆壁,走到隊尾的顧客面向隊尾,被往前拉一格的顧客面向隊首,一列隊伍裡混著三個方向。

解法很簡單:到達排隊位置時,讓排隊的顧客全部面向隊首。門外的隊伍是沿著牆筆直的一列,所以大家方向一致。這次學到的規則是:每個停下來的位置,都要指定看向哪一邊。

排隊時我們讓身體不再動。本來用晃動身體來表現焦急,結果收到兩次「像在飄」「一個人在發抖」的反應,現在只留下呼吸的動作。

網咖有八成營收來自坐下之後

在行程裡網咖只有一格,但營收不會在那裡結束。行程的一格是「只去一次的地方」,不能重複,而坐著的顧客偶爾再點東西,發生在使用中掛鉤,不是行程。這些加點的訂單占了單日營收的八成。

所以顧客邏輯不只是座位能多快填滿,還跟坐下的顧客坐多久才點餐息息相關。同樣的道理,我們也做了一個選項:點的東西還沒送到時,就算停留時間結束,顧客也不會離開座位。

還沒解決的問題

走路中的顧客之間短暫重疊的畫面,目前還在。尋路只把「已經就位停下來的人」(使用中的顧客和隊伍內側)當成權重,走路中的人不放進分佈圖。因為讓走路的人互相閃避,在窄通道裡會變成面對面互相繞圈的死結。反正過幾個影格,他們就會離開那一格。

所以走路中的顧客互相重疊的影格,依規則視為正常。真要好好解決,要設計的不是閃開,而是讓路的順序,但那超出了目前的範圍。

FAQ

經營遊戲的顧客 AI 要怎麼做?

讓每位顧客帶著一份行程,一位位占住目標設施的使用格,路徑用 A* 尋路。有人站著的格子不要封死,而是加上較高的成本(這裡是 12);沒座位時就讓顧客排在門外一列。

經營遊戲裡的 NPC 要怎麼避免互相卡住?

不要把站著的人當成牆,而是當成權重放進去,並依這個權重不斷重算路徑。只加權重、不重算,幾乎沒有效果。在擁擠擺放跑 40 秒的實測裡,踩到站著的人的影格只從 1,701 降到 1,695。

遊戲裡的排隊隊伍排在店內還是店外比較好?

《網咖養成記》只排在門外一列。排在店裡會堵住通道,讓尋路亂掉。已經進門的顧客不排隊,直接放棄這一步,而放棄會被統計並顯示在畫面上。

顧客沒搶到座位就離開,直接刪掉可以嗎?

不可以刪。要顯示放棄的動作和彈窗,並依種類統計,玩家才能看出瓶頸,判斷「再多放一台吧」。

更多文章

新遊戲與小消息,大約每月一封。

其他語言English한국어日本語繁體中文