Local Role
在UE4的多人游戏编程中,使用HasAuthority()来判断Character或者Actor是否存在于服务器上,在之前我们提到过,多人游戏的基础是C-S(服务端——客户端),在服务端中存在的Actor和Character拥有绝对的主权,既Authority为权威性,对于游戏中有影响的操作都需要放置在Server上完成,再通过Server下发到所有Client上。
而在UE4中,对于Actor的网络复制我们有两个重要的属性,这两个属性可以告诉我们:
- 谁对Actor具有权威性
- Actor是否被设置为网络复制
- 以及网络复制的模式
首先我们需要确定哪一个运行的实例对Actor拥有权威性(Authority),因此我们需要检查LocalRole是否为ROLE_Authority。如果为ROLE_Authority,则当前在引擎中运行的实例对该Actor具有权威性。
我们可以查看引擎中的源码:
FORCEINLINE_DEBUGGABLE bool AActor::HasAuthority() const
{
return (GetLocalRole() == ROLE_Authority);
}
因此只有服务器上的Actor才是具有权威性的。
对于RemoteRole以及LocalRole,当查询的实例改变时,相应的值可能会发生反转。
例如,在Server中上面两个变量的值如下:
Role == Role_Authority
RemoteRole = ROLE_SimulatedProxy
而在Client中,你就会看到该Actor的值如下:
Role == ROLE_SimulatedProxy
RemoteRole == ROLE_Authority
服务器负责Actor并将其复制到客户端,客户端只需要接收更新,并在更新之间模拟Actor。但是服务器并不会频繁地进行Actor的更新,因为这会花费大量的带宽以及CPU资源。Server会根据AActor::NetUpdateFrequency这个属性来网络复制Actor。
这意味着,在Actor更新之间会有一段时间传递给客户端。这可能会导致演员在动作中显得断断续续。为了弥补这一点,客户端将在更新之间模拟Actor。
由此引申出下面两种类型的模拟:
ROLE_SimulatedProx
ROLE_AutonomousProxy
ROLE_SimulatedProx:
这是一种常规的模拟手段,通常是通过已知的最后位置进行延申,当Server对一个特定的Actor进行更新,Client将会调整其位置到新的地点,然后在更新与更新之间,Client将会根据Server下发的最近的向量继续移动Actor。
ROLE_AutonomousProxy:
通常只用于PlayerControllers拥有的Actor。这仅仅意味着这个Actor正在接收来自人类控制器的输入,所以当我们推断时,我们有更多
信息,并可以使用实际的外部输入来填充缺失的信息(而不是根据最后已知的信息进行推断速度)。
在UE4中,我们可以查询LocalRole以及RemoteRole,核心代码如下:
void UOverHeadWidget::ShowPlayerNetRole(APawn* InPawn)
{
// ENetRole LocalRole = InPawn->GetLocalRole();
ENetRole RemoteRole = InPawn->GetRemoteRole();
FString Role;
switch (RemoteRole)
{
case ENetRole::ROLE_Authority:
Role = FString("Authority"); break;
case ENetRole::ROLE_AutonomousProxy:
Role = FString("Autonomous Proxy"); break;
case ENetRole::ROLE_SimulatedProxy:
Role = FString("Simulated Proxy"); break;
case ENetRole::ROLE_None:
Role = FString("None");break;
}
FString RemoteRoleString = FString::Printf(TEXT("Remote Role: %s."), *Role);
SetDisplayText(RemoteRoleString);
}
这里我使用了一个Widget,用于保存查询后的结果,并直接显示在Character的上方。
LocalRole(Server)
LocalRole(Client)
RemoteRole(Server)
文章来源:https://www.toymoban.com/news/detail-768431.html
RemoteRole(Client)
我们就可以根据这两个属性判断Actor是存在于服务端还是存在于客户端,并与之后的RPC结合,就可以完成多人游戏中的各项同步操作。文章来源地址https://www.toymoban.com/news/detail-768431.html
到了这里,关于UE4中LocalRole和RemoteRole的区别的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!