目的
對於非常高延遲的使用者,這個功能不希望開放,因為可能降低其他使用者的體驗。
利用對Ping的判斷,更改武器中控制SSR的布林值,注意伺服器和客戶端需要同步,所以可以對該布林值變為可複製的,利用屬性賦值,當伺服器上的值發生了改變就可以傳遞到客戶端
//只需要對當前武器的Owner客戶端產生改變就可以了
DOREPLIFETIME_CONDITION(AWeaponParent, bUseServerSideRewide,COND_OwnerOnly);
實現方法
檢測Ping
這一部分在Controller進行,透過利用UE自帶的GetPing,然後和設定閾值作比較即可。
通知RPC
該ServerRPC用來告知當前客戶端的Ping過高還是過低
修改SSR布林值
利用委託的方式,當ServerRPC被呼叫時,進行委託的廣播,然後所有監聽該委託的事件執行
就是在Weapon類中,設定一個函式,然後繫結到Controller的這個委託上,該函式內部執行對SSR的布林值的控制
// Controller
//.h
DYNAMIC_...(FOnCallPing, bool bIsTooHigh)
FOnCallPing OnCallPing
UFUNCTION(Server)
ServerCallHighPing(bool bhigh);
//.cpp
if(//ping too high)
{
ServerCallHighPing(true);
}
else
{
ServerCallHighPing(false);
}
ServerCallHighPing(bool bhigh)
{
OnCallPing.Broadcast(bhigh);
}
// Weapon
//.h
setSSR(bool bhigh);
Controller* controller;
//.cpp
OnEquipped()
{
if(controller && HasAuthority && !controller->OnCallPing.IsBound())
controller->OnCallPing.AddDynamic(setSSR);
}
OnDropped() //丟槍時就拋棄委託
{
if(controller && HasAuthority && controller->OnCallPing.IsBound())
controller->OnCallPing.RemoveDynamic(setSSR);
}
setSSR(bool bhigh)
{
bSSR = !bhigh;
}