控制SSR功能的開放

XTG111發表於2024-08-21

目的

對於非常高延遲的使用者,這個功能不希望開放,因為可能降低其他使用者的體驗。
利用對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;
}

相關文章