當, gas通過點擊鼠標光標觸發事件時,內部的處理機制。
當通過點擊事件,命中中目標時, 可獲取到對應的TargetData 目標數據。處理相應的操作。
僅有本地的客戶端的情況下。命中并不會有什么異常。
當存在服務器時, 服務端并不能知道,客戶端的命中結果。通過GAS框架內部具有一點的數據處理發送數據的實現。
當,通過RPC的方式,實現客戶端請求服務器時,具有如下的兩個問題。GAS通過 Activate的一個函數方法來激活技能系統,?客戶端與服務器的通信只能是RPC的方式。 RPC與Activate所到達服務器的時間,具有不確定性。
考慮這樣的一個場景: 當我們點中了屏幕上的一個敵人,我們需要對ta釋放技能,造成傷害,擊殺目標(這里的每一步都很難,我們先做最簡單的,激活一個技能,搞明白GAS框架的激活流程)。
我們需要知道這個敵人所在3D世界的虛擬坐標,或者說空間向量 位置信息,及這個Actor對象信息。 所以在客戶端我們點中了目標,這個時候只能通RPC的方式,發送這些信息需要發送到服務器確認。 服務器確認信息,告知是否可以激活此次的技能。這UE5 GAS對技能處理最簡單的一種方式。
下面看GAS 如何處理 客戶端 到服務器之間的RPC數據,至關重要!
當客戶端需要與服務器發送數據時, GAS 內部有一個FGameplayAbilityTargetDataHandle 的結構體,用來存儲RPC需要發送的數據,調用? AbilitySystemComponent->ServerSetReplicatedTargetData 用來發送數據,同時帶有客戶端預測的ScopedPredictionKey,服務器會校驗這個Key值。服務器會有一個委托函數,來響應接受目標數據。 客戶端ShouldBroadcastAbilityTaskDelegates? 委托任務完成之后,廣播當前數據。
//窗口預測函數 FScopedPredictionWindow ScopedPredictionWindow(AbilitySystemComponent.Get());//RPC數據FGameplayAbilityTargetDataHandle DataHandle;/** Replicates targeting data to the server 復制數據發送到服務器*/AbilitySystemComponent->ServerSetReplicatedTargetData(GetAbilitySpecHandle(),GetActivationPredictionKey(),DataHandle,FGameplayTag(),AbilitySystemComponent->ScopedPredictionKey);//創建委托 廣播通知if (ShouldBroadcastAbilityTaskDelegates())ValidData.Broadcast(DataHandle); //廣播當前點中位置
在RPC數據到達時間不確定時,GAS內部會有自己的一個委托函數。重新綁定委托函數,廣播數據。這就解決了數據的不確定性。
這是服務器 的接收數據的處理操作。GAS 通過委托的方式來處理客戶端發送來的數據,及預測Key值。并綁定 我們需要回調的函數。
如果數據沒有到達的情況下,bCalledDelegate為false 的情況下,就繼續等待數據的到底。
這是源代碼的注釋說明。