遊戲中的戰鬥回放的實現原理和機制是什麼?包括即時戰鬥和離線戰鬥。
01-06
謝邀。
就大部分遊戲來說,遊戲進程其實就受兩個東西影響。一是用戶輸入,而是隨機數種子。只要把這兩個記錄下來就可以回訪整個遊戲進程了。當然,用戶輸入會被抽象成具體操作,比如在幾分幾秒造了哪個兵。
當然,還有另一個更底層的錄製方法,從API的層面截取視頻音頻流。這在開發工具中比較常用。
把遊戲的邏輯模塊和展示模塊完全隔離開。如果是網路遊戲,那麼邏輯模塊存在於伺服器端,展示模塊存在於遊戲客戶端中;否則,兩個模塊都位於客戶端程序中。
邏輯模塊處理一切的用戶輸入,然後根據用戶輸入判斷遊戲中的每個實體應該播放何種動畫,再將計算的結果傳入展示模塊。
例如,玩家向前移動靠近怪物,並釋放火球術攻擊怪物。那麼邏輯模塊將依次傳輸如下命令至展示模塊:- 時間0s,創建主角,向前移動,速度為1m/s
- 時間0s,創建怪物,播放idle動畫
- 時間1s,主角停止移動
- 時間1s,主角播放釋放法術動畫
- 時間1.5s,創建一個火球,速度為10m/s,運動方向為主角到怪物的方向
- 時間1.8s,火球停止運動
- 時間1.8s,火球逐漸消失
- 時間1.8s,怪物轉向主角,朝主角方向移動,速度0.5m/s
- ……(自行腦補)
回合制簡單,記錄用戶操作序列和遊戲隨機種子就好了
實時遊戲fps或者moba,或者rts就要看情況了
rts如果是確定性的,都是定點數運算,隨機種子,邏輯幀驅動,時序確定,那也類似於回合制,記錄操作序列和隨機種子就好了
確定性不強的,那記錄一下計算操作結果,屬性變化也是有必要的
可以看lol的engineer博客,關於確定性的文章
當然如果對結果精確性要求不高的話,簡單記錄,讓遊戲自己去跑,有點偏差也可以接受
還有一種技術 對屬性值關鍵幀做記錄,有款rts 是這麼做的,這樣甚至可以做 遊戲的逆向回放看著挺複雜,其實關鍵就是一些具體參數,這些參數記錄下來然後根據參數重新模擬戰鬥場面就行了。
程序就是這樣,看起來很複雜,其實關鍵在於你輸入的參數是什麼。
Game Programming Patterns Command 模式
一樣的輸入,一樣的輸出
一種是記錄隨機數種子和操作序列 完全模擬一遍 一種是錄下所有服務端發給客戶端的協議
推薦閱讀:
※Cocos Creator 會不會像Cocos Studio一樣半路被停掉?
※遊戲項目盈利後沒有給策劃分紅是業內常態嗎,這是否合理?
※剛入職unity開發擔心完不成需求,怎麼辦?
※分散式的環境下, MySQL和Redis如何保持數據的一致性?
※手機遊戲產業中,「開發商」、「運營商」、「渠道商」分別指什麼?