UE4网游开发中的RPC和OnRep
Posted 游戏开发手账
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了UE4网游开发中的RPC和OnRep相关的知识,希望对你有一定的参考价值。
如果你在测试的时候发现Client和Server中的子弹没有同步,
or你扔一枚炸弹却听到重叠的爆炸声......
撞了空气?
将某个函数声明为在服务器上调用,但在客户端执行
将某个函数声明为在客户端上调用,但在服务器执行
从服务器调用,在服务器和当前所有连接的n个客户端上执行(共n+1)
UFUNCTION(Client)
UFUNCTION(Server)
UFUNCTION(NetMulticast)
UFUNCTION(Server, Reliable)
UFUNCTION(Server, Reliable, WithValidation)
让抛射物在Server同样显示出来
void OnFire(); //原本的OnFire()声明
UFUNCTION(Server, Reliable, WithValidation)
void Server_OnFire(FVector Location, FRotator Rotation);
// bool Server_OnFire_Validate(FVector Location, FRotator Rotation);
void Server_OnFire_Implementation(FVector Location, FRotator Rotation);
void MultiplayerCharacter::OnFire()
{
if(ProjectileClass != NULL)
{
if(GetWorld())
{
// 声明位置,旋转,ActorSpawnParams...
// Spawn一个projectile
GetWorld()->SpawnActor<AMultiplayerProjectile>(ProjectileClass, SpawnLocation, SpawnRotation, ActorSpawnParams)
// 在OnFire()函数中调用Server_OnFire()
Server_OnFire(SpawnLocation, SpawnRotation);
}
}
}
void MultiplayerCharacter::Server_OnFire_Implementation(FVector Location, FRotator Rotation)
{
// 设置ActorSpawnParams...
// Implementation中同样Spawn一个projectile,在服务端显示
GetWorld()->SpawnActor<AMultiplayerProjectile>(ProjectileClass, Location, Rotation, ActorSpawnParams)
}
防止Server端调用Server_OnFire()
进行权威(Authority)判断,在UE4中,对Actor的拥有权限分为三种:权威、主控、模拟;比如现有客户端A,客户端B,和一个服务器,服务器拥有最高权限Authority,那么对于服务器来说,其权限为“权威A”,“权威B”,对于A和B来说,它们对自己的权限为“主控”,对另一方的权限为“模拟”,据此可进行这样的判断,保证只有Client会调用到Server_OnFire():
if(!HasAuthority())
{
Server_OnFire(SpawnLocation, SpawnRotation);
}
利用GetWorld()->IsServer():
if(!GetWorld()->IsServer())
{
Server_OnFire(SpawnLocation, SpawnRotation);
}
利用Role和RemoteRole的特点,因为只有服务器能够向已连接的客户端同步Actor,而客户端不能够向服务器同步,所以只有服务器才能看到 Role == ROLE_Authority,并且在UE4中GetLocalRole()返回的枚举类型中ROLE_Authority为最高值,利用此特点可进行判断:
if(GetLocalRole() < ROLE_Authority)
{
Server_OnFire(SpawnLocation, SpawnRotation);
}
还没提到OnRep是什么呢,它们有什么联系和区别?
咳...内个...下次一定...
以上是关于UE4网游开发中的RPC和OnRep的主要内容,如果未能解决你的问题,请参考以下文章
[工作积累] UE4 并行渲染的同步 - Sync between FParallelCommandListSet & FRHICommandListImmediate calls(代码片段