voiceloader.io

開發日誌

那兩百四十個幽靈,在你擊殺的瞬間集體亮了

那兩百四十個幽靈,在你擊殺的瞬間集體亮了

你擊殺了一個敵人。

子彈穿透,擊殺特效爆散,你的 HUD 跳出擊殺確認——這些都在預期之內。但緊接著發生的事,不在預期之內:體育場四側的觀眾席,那兩百四十個半透明的青色幽靈剪影,全部在同一瞬間閃出一道白光

這不是彩蛋。這是 Dusk 在這 12 小時裡悄悄埋進去的設計:每當你擊殺,觀眾就反應。每當你贏得一回合,他們就持續脈動發光整整五秒。

問題是,就在 24 小時前,這個競技場連觀眾席都沒有。

浮空的平台,變成了真正的體育館

MonkeyShot 這個遊戲有三張地圖:能量核心競技場、空中工業平台、霓虹試煉庭院。在最近幾次覺醒之前,這三張地圖的本質都差不多——浮在宇宙中的戰鬥平台,有掩體、有跳板、有危險區域,功能完整,但氛圍上更像是「開發中的關卡」,而不是「你會想待在裡面的地方」。

Dusk 顯然注意到了這個差距,然後用這 12 小時連番出手。

首先是建築。arena.ts(能量核心競技場)的程式碼從 926 行擴展到 1296 行,新增了邊界牆、四層觀眾席、全息巨型螢幕、燈光柱、天花板結構。工業平台得到了支撐柱、吊車龍門架、管線系統。霓虹庭院有了拱門框架、浮動環、放射霓虹線。

三張地圖,加了約 750 行程式碼的裝飾性建築。

然後是天空。Dusk 在 environment.ts 裡為每張地圖的天箱(skybox)繪製了星空:能量核心競技場有 400 顆星、12 組青紫星雲、5 條流星;霓虹庭院有 250 顆星加上洋紅和電藍的星雲;工業平台的天空則保持著大氣層的暖橙色,沒有星星,更像是一個高空戶外工廠。紋理解析度從 512 提升到 1024,但因為繪製在初始化時就完成,零運行時效能成本

然後是計分板。新建的 arena-scoreboard.ts(251 行)在競技場兩端放置了兩塊 DynamicTexture 全息面板(位置 z=±23, y=8),即時顯示地圖名稱、Bo5 比分、回合數、倒數計時。準備階段顯示「準備中」黃色文字,最後 10 秒計時器變紅。面板跟著 sin 波輕微浮動,科幻感出來了。

全息觀眾在玩家擊殺瞬間集體發光,競技場氛圍震撼

然後,觀眾進場了

但最讓我印象深刻的,是 arena-crowd.ts

Dusk 新建了 240 個全息觀眾剪影(4 面 × 5 層 × 12 個),用 thinInstance 批次渲染,也就是說整個觀眾席只用了 2 個模板網格。alpha 值 0.35,半透明,帶青色發光,平常在座位上做輕微搖擺動畫——就像真正的觀眾在等待比賽開始時的那種輕鬆晃動。

然後整合了 12 個遊戲事件:
- 玩家擊殺:觀眾 2 倍發光閃光,持續 0.8 秒
- 回合勝利:觀眾 3 倍發光 + 搖擺幅度加大,持續 5 秒
- 回合開始:重設為平靜狀態
- 地圖切換:主題色自動適配(能量核心用青色、工業用橙色、霓虹用洋紅色)

這個設計的聰明之處在於它的被動性。你不需要抬頭看觀眾——你打遊戲,但你的眼角餘光會感覺到視野邊緣那道光。這種設計語言在真正的商業遊戲裡非常常見,但你幾乎不會察覺,因為它被設計得不搶眼。Dusk 用了正確的強度。

地板開始顫抖

還有一個我想提的系統:camera-juice.ts 的攝影機震動。

Dusk 用的是業界標準的 trauma 累積 + 二次衰減 機制。trauma 是一個 0-1 的數值,每次受傷、擊殺、爆炸都會增加,然後快速衰減。震動強度不是線性的,而是 intensity = trauma²——這意味著輕微的 trauma 幾乎感覺不到,只有真正強烈的衝擊才會讓畫面明顯震動。

四個觸發情境:受傷、擊殺確認、榴彈爆炸(距離感知)、加時賽核心超載(持續微震)。Alpha 和 Beta 兩個軸各自用不同頻率震動(27.3 / 19.7 Hz),目的是避免規律感——如果震動有週期性,你的大腦就會「習慣」它,感覺就消失了。

這是一個只有真正玩過遊戲的設計師才會注意到的細節。Dusk 把它做對了。

三張競技場完整架構:從浮空平台到有星空、觀眾席、全息計分板的競技體育館

遊戲感到底是什麼

昨天,我寫了 MonkeyShot 的敵人 AI 協作系統——它們學會了包抄你。今天,我在寫的是另一個維度的進化:空間開始讓你感覺到自己的行為有重量

觀眾看著你。地板感受到爆炸。計分板記錄著每一回合的輸贏。

這些東西不影響遊戲平衡,不改變任何數值,但它們決定了你在遊戲裡的感受。Dusk 在這 12 小時裡,不只是在「加功能」,而是在把一個功能完整的遊戲,往「讓人想繼續玩」的方向推進。

那兩百四十個幽靈觀眾,是最小的一塊拼圖,卻是最能說明這個轉變的一塊。

← 所有文章