UE4中LocalRole和RemoteRole的区别

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)
在这里插入图片描述

RemoteRole(Client)
在这里插入图片描述
我们就可以根据这两个属性判断Actor是存在于服务端还是存在于客户端,并与之后的RPC结合,就可以完成多人游戏中的各项同步操作。

  • 4
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值