在接觸的瞬間,讓眼睛跟上。
一擊太快的時候,你看得到動作,卻可能錯過「打中的那一瞬間」。打擊停頓,就是在那一瞬間製造短暫停頓的手法。 在這個實驗裡,攻擊方與目標會在接觸時短暫維持姿勢,接著目標才開始移動。
請先用 4f 播放,再換成 0f。這個 demo 的模擬是 60 Hz,兩者只差約 67 毫秒。盯著目標看,是不是更容易抓到打中的瞬間?
這是讓你拿回自己遊戲裡驗證的起點,而不是萬用公式。連續攻擊、沉重的一揮、從遠處觀看的戰鬥,同樣長度的停頓,扮演的角色也各不相同。
停住動作。晃動視角。
打開 畫面震動,再把打擊停頓設為 0f。視角會動,但角色不會停在接觸姿勢上。接著改成 4f,把兩者疊在一起試試看。
這兩種效果,作用的對象不一樣。
- 打擊停頓改變的是動作的時機。 這個 demo 讓兩個角色同時停住,但依遊戲設計,也可以只停住部分對象。
- 畫面震動改變的是視角。 這個 demo 的震動會在 12 個影格(60 Hz 下為 200ms)內逐漸衰減。即使角色停住,震動仍會繼續。
把震動加大,不一定能彌補接觸姿勢不夠清楚的問題。如果打擊感難以辨識,請先把兩者都關掉,重新檢視剪影、距離與時機。
把「4 影格」數清楚。
接觸從 第 27f 開始。設停頓長度為 S 影格,停住的區間就是 27 ≤ frame < 27 + S。4f 設定下,第 31f 已經在移動;0f 設定下,目標從第 27f 就開始移動。
這個 demo 畫出的是每一步更新之後的狀態。在 0f 時,接觸判定與第一次移動發生在同一步,所以會出現衝擊記號,但不會畫出停在接觸狀態的姿勢。「4f」包含接觸那一步本身,並不是在接觸那一格之後再多加 4 格。
用滑桿和 ±1f 按鈕,就能在不播放動畫的情況下確認邊界。播放以每步 1/60 秒的固定步長推進,所以就算是 120 Hz 的螢幕,動作也不會變成兩倍速。¼ 倍速只改變播放速度,不改變一個模擬影格的意義。
畫面震動也不是每次都取新的亂數,而是用整數雜湊重現相同的值。回到同一個影格,就會回到同一個畫面。震動幅度以圖中的世界座標定義,因此在螢幕上的大小會跟著圖一起縮放。
在自己的遊戲裡,試驗的順序。
- 先關掉畫面震動,確認只靠接觸姿勢能不能看出打中。
- 標明模擬的更新頻率,其他條件不變,比較 0f、2f、4f。
- 同時觀察打中的瞬間與恢復移動之後。太強烈的重音,也可能打亂操作的節奏。
- 有需要的話,再加一點視角震動,程度以讓動作更好讀為限。
- 在連續攻擊、畫面邊緣與減少動態效果的設定下,也確認一次。
要問的不是「怎樣才能更華麗?」,而是「希望玩家注意到什麼?」。
以下是不依賴特定引擎的虛擬碼。請限定要停住的對象,輸入、UI 與特效則使用各自適合的時鐘。這不是在特定引擎上驗證過的實作範例。
on_contact:
held_steps = chosen_hit_stop_frames
shake_steps = 12
each_fixed_step:
# Contact is resolved before this step's hold decision.
if held_steps > 0:
held_steps -= 1
else:
advance_affected_actors()
if shake_steps > 0:
draw_camera_offset(shake_steps)
shake_steps -= 1
else:
clear_camera_offset()
碰撞判定與更新處理的順序,會影響結果。除了計時器或停頓旗標,也請測試接觸時與恢復時實際畫出來的姿勢。
已知的依據,與尚未確定的事。
- 關於原始貼文
- 這是編輯資料中記錄的貼文連結。原始 WIP 尚未經過獨立查證,因此我們不對作者的實作方式做任何陳述。
- 實驗條件
- 本站 demo,固定 60 Hz 模擬。接觸發生在第 27f。4f 設定下維持第 27~30f 的姿勢,第 31f 恢復移動。畫面震動持續 12 個模擬影格。
- 致謝
- @LivingWorldProj ↗ — 編輯資料中記錄的靈感來源。本站未引用文字,也未轉載任何媒體。
如需更正錯誤、變更或移除致謝,請透過 @FableQuest 私訊 聯絡我們。若無法私訊,請在公開貼文中標記我們。 更正紀錄