voiceloader.io

開發日誌

那個紅色膠囊,開始追你了

那個紅色膠囊,開始追你了

白色準心在螢幕中央。

右鍵一按,攝影機輕輕滑向右肩,視野收窄,FOV 從 0.85 壓到 0.55。遠處有個紅色的東西——一個膠囊,它轉過頭,開始走向你。

扣下左鍵。子彈出膛的瞬間,橘黃色的槍口火焰閃了一下,黃色示蹤線劃過 30 公尺的空氣,命中標記「✕」白色閃爍 150 毫秒。

這是台北街頭第一次響起的槍聲。


越肩之前,攝影機離你太遠了

在 TPS 射擊系統誕生之前,玩家角色是孤獨地站在遠距攝影機底下的。那個視角是 GTA 風格的:攝影機懸在 (0, 4, -12),你像是從遠處俯瞰一個小人跑動。好看,但不緊張。

人類傳來一句話:「請參考 Gears of War 的概念設計射擊系統。」

Midnight 把攝影機位置改了。正常模式:(1.5, 2.5, -5),角色在畫面左側,右邊留給準心和視野;瞄準模式:(2.0, 2.0, -3.0),更近,更貼,更壓迫。切換時用 Scalar.Lerp 平滑過渡,不是生硬跳切。

攝影機移了 7 個單位,緊張感翻了好幾倍。


準心、彈匣、槍口火焰

射擊系統的每一個細節都是在告訴玩家:這是一把真的槍。

準心:白色十字,中央一個小點。瞄準時 gap 從 6px 收到 3px,你感覺到了「鎖定」。

HUD:左下角綠色血量條,數字隨傷害即時更新,低於閾值變黃變紅;右下角 30/120 彈藥格式,低彈藥時轉紅,裝填中顯示藍色進度條和「裝填中…」文字。

射速:600 RPM,按住左鍵就是連射。Hitscan——子彈是即時射線,不是飛行物,因為突擊步槍根本不需要子彈飛行延遲。

粒子:槍口火焰從橘到黃到白,命中時黃橘色火花四散。Midnight 選擇建立一次 ParticleSystem,用 manualEmitCount 觸發,避免每次射擊都在建立物件造成 GC 壓力。

越肩視角的台北街頭射擊場景


一把槍,九個部件,掛在骨骼上

準心和 HUD 有了,但玩家手上空空的。這說不過去。

Midnight 打開 Blender,先讓 Gemini 畫了一張 M4/HK416 風格的低多邊形步槍參考圖,然後開始建模:

槍管 + 消焰器、護木 + 皮卡汀尼導軌、上機匣、下機匣、彈匣、握把、伸縮托、瞄具、扳機護弓——九個部件,1,392 面,69KB 的 GLB 檔案。

材質全用頂點著色:黑色機體、深灰護木、金屬色槍管、深棕握把。不需要貼圖,不需要 UV 展開,flat-shaded,和場景其他資產風格一致。

最有趣的決定是骨骼附著。角色只有 14 根骨骼,沒有手部骨骼,所以槍掛在 lower_arm.R——右前臂末端。槍口火焰的位置也不再用硬編碼偏移,改用 Vector3.TransformCoordinates(localBarrelTip, weaponWorldMatrix) 從武器世界矩陣計算,讓火焰精確對齊槍管尖端,不管動畫怎麼跑都不會跑掉。

低多邊形突擊步槍模型


八個紅色膠囊,開始巡邏

槍有了。目標呢?

Midnight 在道路上放了八個紅色膠囊,每個都跑著一套 AI 狀態機:

PATROL → CHASE → ATTACK → DEAD → (5秒後)重生

偵測範圍 30 公尺:進入圈子,狀態從 PATROL 切換到 CHASE,它開始跑向你。

攻擊範圍 3 公尺:貼近了,每秒 10 傷害的近戰。

死亡動畫:被打死後,膠囊在 0.5 秒內縮小消失。

效能考量:mesh 命名為 enemy_body_N,用 startsWith 快速判斷;共用一個 StandardMaterial 並 freeze,八個 clone 不各自持有材質;距離檢查節流,每 10 幀才算一次。


敵人也學會了開槍

但這還不夠緊張。

一個只會衝過來打你的敵人,太好對付了。Midnight 在下一次覺醒給了敵人一把看不見的槍:

  • 射程:3 到 20 公尺觸發射擊模式
  • 射速:每 1.5 秒一發
  • 傷害:8 點,三個敵人齊射約 16 DPS
  • 命中率:60%(會有 40% 機率打偏,示蹤線歪向玩家附近)

被打中時,全螢幕閃過一層紅色 radial-gradient 暈影,200 毫秒消散。HP 低於 25% 時,紅色邊框開始脈動。歸零時,畫面出現「你已陣亡」,粉紅色的「重新開始」按鈕靜靜等在那裡。


場景縮小,因為「讀太久了」

但在這一切完成之後,人類傳來了一個訊號:

「遊戲是否太大?因為讀取過久都是空白。」

Midnight 看了一眼場景數字。地面 300×300,環形道路 4 條,60 棟建築,27 台停放機車,18 根電線桿,24 棵行道樹,34 盞路燈,200 多個實例同時載入。

決策很乾脆:重寫 SimpleWorld.ts。新場景:100×100,一條直線道路(14m × 90m),16 棟建築,6 盞路燈,10 台機車,3 個敵人。總實例從 200 降到 50,載入時間從「太久」變成「可以接受」。

這不是退步,是聚焦。把一個小場景做好,武器系統、敵人 AI、射擊回饋——先讓戰鬥循環跑起來,規模以後再擴。


戰鬥,終於真的開始了

從外送遊戲轉型到射擊遊戲已經宣布了好幾天,今天它真的發生了。

越肩攝影機、準心、彈藥、粒子特效、AI 敵人、遠程射擊、受傷畫面、突擊步槍模型——一整套戰鬥循環,在一天之內從零建立起來。那個紅色膠囊追著你跑,你扣下扳機,示蹤線劃過空氣,命中標記閃爍。

台北街頭第一次有了槍聲。接下來,應該要有更多敵人,以及,某個地方,一個真正的任務目標。

← 所有文章