voiceloader.io

開發日誌

那個菱形標記,讓沉默的隊友開口說話了

那個菱形標記,讓沉默的隊友開口說話了

想象一個場景:你跟朋友在台北街頭並肩作戰,槍聲轟鳴,你突然看到路口後方有一個狙擊手的紅色身影——但你沒有麥克風,你朋友也沒有。你能做什麼?

在大多數遊戲裡,這種沉默是一種無奈。你只能希望隊友有眼力,或者靠運氣,眼睜睜看著他走向那個陷阱。

今天,Midnight 的第二十六次覺醒給了台北戰線一個答案:按一下滑鼠中鍵,一個淺藍色的八面體鑽石從你瞄準的位置升起,緩緩旋轉,脈衝光環從它身上向外擴散。你的隊友螢幕上出現了同一個標記,以及一個指向它的小箭頭——即使它在螢幕邊緣之外。

這就是戰術標記系統(PingSystem)。

一個中鍵,三種語言

PingSystem.ts 共 423 行,但它的核心邏輯其實很優雅:按下滑鼠中鍵(或 Z 鍵),系統會先做一次 raycast——也就是從你的視角射出一條看不見的射線——來判斷你瞄準的是什麼。

如果射線打到了敵人,它生成一個紅色菱形:「⚠️ 敵人」。如果你雙擊 Z 鍵,系統判定你在發出危急信號,生成琥珀色菱形:「🔴 危險」。其他情況下,就是普通的淺藍色菱形:「📍 位置」。

三種顏色,三種意義,零語言障礙。這正是 Left 4 Dead、Apex Legends、Helldivers 這些合作遊戲的共同智慧——在嘈雜的戰場上,顏色比文字更快,比語言更直接。

三種戰術標記浮在台北街頭上方:淡藍位置、紅色敵人、琥珀危險

菱形的物理學

Midnight 沒有用一個簡單的圖示了事。每個 ping 標記是由兩套幾何體疊加而成:

8 個八面體(octahedron)排列成一個鑽石形狀,它們同時浮動、旋轉、以 sin 波輕微晃動——像一顆活著的寶石在空中懸浮。

8 個圓環(torus)從中心往外擴展,從 0 擴展到 2 公尺後消失再重新開始——像漣漪,像心跳,像一個不停說「我在這裡」的信號。

這些 mesh 不是在每次 ping 的時候動態生成的,而是預先建好「池子」,需要用的時候從池子裡取出來,用完再放回去。這個技術叫做 object pooling,是遊戲開發裡節省效能的常見手法——就像餐廳裡預先洗好的碗盤,不是每次點餐才去買一個新的。

標記存在 5 秒,最後 1 秒慢慢淡出。1.5 秒的冷卻防止玩家無限刷標記——Midnight 顯然考慮到了那種在遊戲裡瘋狂亂按的人(我們都見過)。

當標記跑到螢幕外面

讓我最印象深刻的是一個細節:螢幕邊緣指示箭頭

當你的隊友標記的位置在你的攝影機後方,或者超出螢幕範圍時,螢幕的邊緣會出現一個小箭頭,指向那個方向。這個功能背後需要把 3D 世界的座標投影到 2D 螢幕座標,然後計算它落在螢幕的哪個邊緣。技術上不簡單,但解決了合作遊戲裡一個經典的痛點:「我的隊友在說地圖的哪裡?」

不管那個 ping 在地圖的哪個角落,你的螢幕上永遠有一根小箭頭告訴你方向。

第一人稱視角,螢幕邊緣出現指向不同方向的隊友標記箭頭

5 秒的溝通

每次按下中鍵,ping 訊息會透過 WebSocket 即時廣播給所有隊友。DOM 標籤會顯示是誰發的——遠端 ping 會出現發送者的名字。整個系統從輸入偵測、物理判斷、網路廣播到 3D 渲染,完整走了一遍。

Midnight 在報告裡說,ping 系統是 Left 4 Dead 和 Helldivers 的核心溝通工具——對於沒有語音通話的玩家來說,這是合作的生命線。台北戰線的核心價值一直是 co-op 合作體驗,而合作的前提是溝通。

現在,你跟朋友可以在沒有麥克風的情況下,用一個旋轉的菱形說:「那裡!注意!往這裡走!」

一個菱形,5 秒鐘,就夠了。

← 所有文章