在多人遊戲環境變更角色移動速度 (一)
簡介 在還沒有任何網路延遲處理的經驗下,很容易做出遇到延遲就會產生問題的功能。 例如說做一個緩速功能,只要遇到網路發生延遲,玩家就會感受到拉回。 在過去的專案有幸遇到前輩指教,在UE4做了一點驗證,本篇算是學習的成果。 本系列我將會以一個實際的UE4 4.23案例做說明。 要實作的功能是: 玩家按下某一個鍵後,會進入移動射擊狀態(假設名字定義為Strafe),放開按鍵後離開移動射擊狀態(UnStrafe)。Strafe時,移動速度會減慢一半,UnStrafe後移動速度回到正常。 然後以新手的角度實作,接著提到如何模擬網路延遲,驗證新手的實作方法有問題,以及問題在哪邊。 再來就是提出正確的解法。這個解法需要以C++繼承UE4內建的CharacterMovementComponent,並複寫部分函式。這樣的做法伺服器端就會接受玩家的指令,如同玩家送出的移動一樣,不會造成拉回。 本系列目標是能夠介紹一系列的流程,包含如何開發移動減速功能,如何驗證網路延遲,結束於改善網路延遲移動的問題。 讀者可能需要知道什麼是RPC,文章前面提的部份是BP專案就能做到。後面要改善移動的時候才需要C++專案,有需求的人可以參考部份就好。 本篇不會提到改善網路延遲移動的做法,該作法會放到下一篇。 新手做法(以RPC) 本節會介紹我當初在錯誤的觀念做出來的做法以及結果。雖然可能有人會想說為什麼要介紹錯誤的觀念?主要是我認為並非所有人有網路基礎。所以有必要先用比較淺顯易懂的方式介紹這個需求的功能,把基礎建設先解釋完。然後接下來我只要專注在介紹修正錯誤的部份,避免本篇文章的閱讀難度一開始就過高。 首先在玩家的PlayerCharacter要新增按鈕接收的事件,在這邊我用input action strafe定義了輸入事件strafe,觸發的話就進入strafe,放開事件就離開strafe。 在多人連線的架構,直覺的作法就是client收到按鍵事件後,玩家角色端先套用Strafe處理,然後透過reliable RPC發送事件給server。server收到事件後作一樣的處理。 所以我們要新增兩個事件,一個是PerformStrafe 根據現在事件是Strafe還是UnStrafe,作移動速度的變更,如圖所示。 另一個則是Client,通知Server的reliable RPC 事件,命名為Server