• UE5——网络——RPC


    RPC(这个是官方文档的资料)

    要将一个函数声明为 RPC,您只需将 Server、Client 或 NetMulticast 关键字添加到 UFUNCTION 声明。

    例如,若要将某个函数声明为一个要在服务器上调用、但需要在客户端上执行的 RPC,您可以这样做:

       UFUNCTION( Client )
        void ClientRPCFunction();
    
    • 1
    • 2

    要将某个函数声明为一个要在客户端上调用、但需要在服务器上执行的 RPC,您可以采取类似的方法,但需要使用 Server 关键字:

    UFUNCTION( Server )
        void ServerRPCFunction();
    
    • 1
    • 2

    此外,还有一种叫做多播(Multicast)的特殊类型的 RPC 函数。多播 RPC 可以从服务器调用,然后在服务器和当前连接的所有客户端上执行。 要声明一个多播函数,您只需使用 NetMulticast 关键字:

    UFUNCTION( NetMulticast )
        void MulticastRPCFunction();
    
    • 1
    • 2

    要求和注意事项

    多播 RPC 还可以从客户端调用,但这时就只能在本地执行。

    1.您必须满足一些要求才能充分发挥 RPC 的作用:
    
    2.它们必须从 Actor 上调用。
    
    3.Actor 必须被复制。
    
    4.如果 RPC 是从服务器调用并在客户端上执行,则只有实际拥有这个 Actor 的客户端才会执行函数。
    
    5.如果 RPC 是从客户端调用并在服务器上执行,客户端就必须拥有调用 RPC 的 Actor。
    
    6.多播 RPC 则是个例外:
    
     如果它们是从服务器调用,服务器将在本地和所有已连接的客户端上执行它们。
    
     如果它们是从客户端调用,则只在本地而非服务器上执行。
    
     现在,我们有了一个简单的多播事件限制机制:在特定 Actor 的网络更新期内,多播函数将不会复制两次以上。按长期计划,我们会对此进行改  善,同时更好的支持跨通道流量管理与限制。
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17

    例子

    Client (服务器的调用客户端执行)

    	UFUNCTION(Server, Reliable)
    	void FunctionServer();
    	
    	UFUNCTION(Client, Reliable)
    	void FunctionClient();
    
    • 1
    • 2
    • 3
    • 4
    • 5
    void ARPCProjectCharacter::FunctionServer_Implementation()
    {
    	GEngine->AddOnScreenDebugMessage(-1, 5.f, FColor::Red, TEXT("FunctionServer"));
    	UE_LOG(LogTemp,Warning,TEXT("FunctionServer"));
    
    	FunctionClient();
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    void ARPCProjectCharacter::FunctionClient_Implementation()
    {
    	GEngine->AddOnScreenDebugMessage(-1, 50.f, FColor::Red, TEXT("FunctionClient"));
    	UE_LOG(LogTemp,Warning,TEXT("FunctionClient"));
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    void ARPCProjectCharacter::StartFire()
    {
    
    	GEngine->AddOnScreenDebugMessage(-1, 50.f, FColor::Red, TEXT("Click"));
    	UE_LOG(LogTemp,Warning,TEXT("Click"));
    	
    	FunctionServer();
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    在这里插入图片描述

    Server (客户端调用服务端执行)

    	UFUNCTION(Server, Reliable)
    	void FunctionServer();
    	
    
    • 1
    • 2
    • 3
    void ARPCProjectCharacter::FunctionServer_Implementation()
    {
    	GEngine->AddOnScreenDebugMessage(-1, 5.f, FColor::Red, TEXT("FunctionServer"));
    	UE_LOG(LogTemp,Warning,TEXT("FunctionServer"));
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    void ARPCProjectCharacter::StartFire()
    {
    
    	GEngine->AddOnScreenDebugMessage(-1, 50.f, FColor::Red, TEXT("Click"));
    	UE_LOG(LogTemp,Warning,TEXT("Click"));
    	
    	FunctionServer();
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    在这里插入图片描述

    NetMulticast (客户端调用服务端执行)

    	UFUNCTION(Server, Reliable)
    	void FunctionServer();
    	
    	UFUNCTION(Client, Reliable)
    	void FunctionClient();
    
        UFUNCTION(NetMulticast, Reliable)
    	void FunctionNetMulticast();
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    void ARPCProjectCharacter::FunctionServer_Implementation()
    {
    	GEngine->AddOnScreenDebugMessage(-1, 5.f, FColor::Red, TEXT("FunctionServer"));
    	UE_LOG(LogTemp,Warning,TEXT("FunctionServer"));
    
    	FunctionClient();
    	FunctionNetMulticast();
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    void ARPCProjectCharacter::FunctionNetMulticast_Implementation()
    {
    	GEngine->AddOnScreenDebugMessage(-1, 50.f, FColor::Red, TEXT("FunctionNetMulticast"));
    	UE_LOG(LogTemp,Warning,TEXT("FunctionNetMulticast"));
    }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    void ARPCProjectCharacter::FunctionClient_Implementation()
    {
    	GEngine->AddOnScreenDebugMessage(-1, 50.f, FColor::Red, TEXT("FunctionClient"));
    	UE_LOG(LogTemp,Warning,TEXT("FunctionClient"));
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    void ARPCProjectCharacter::StartFire()
    {
    
    	GEngine->AddOnScreenDebugMessage(-1, 50.f, FColor::Red, TEXT("Click"));
    	UE_LOG(LogTemp,Warning,TEXT("Click"));
    	
    	FunctionServer();
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    在这里插入图片描述

    官方图表

    在这里插入图片描述

    验证

    
    	UFUNCTION( Server, WithValidation )
    	void FunctiHpServer( int32 AddHealth );
    
    • 1
    • 2
    • 3
    void ARPCProjectCharacter::FunctiHpServer_Implementation(int32 AddHealth)
    {
    	
    }
    
    bool ARPCProjectCharacter::FunctiHpServer_Validate(int32 AddHealth)
    {
    	if (AddHealth>0)
    	{
    		return true;
    	}
    
    	return false;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14

    可靠性

    必须将RPC指定为 可靠 或 不可靠。在蓝图中,函数和事件默认为不可靠。要将函数指定为可靠,将细节面板(Details Panel)中的 可靠(Reliable) 设置设为 true。在C++中,必须将 Reliable 或 Unreliable 说明符作为 Server、Client 或 NetMulticast 函数,添加到RPC的 UFUNCTION 宏及其状态。

    不可靠RPC无法保证必会到达预定目的地,但其发送速度和频率高于可靠的RPC。其最适用于对gameplay而言不重要或经常调用的函数。例如,由于Actor移动每帧都可能变换,因此使用不可靠RPC复制该Actor移动。

    可靠的RPC保证到达预定目的地,并在成功接收之前一直保留在队列中。其最适合用于对gameplay很关键或者不经常调用的函数。相关例子包括碰撞事件、武器发射的开始或结束,或生成Actor。

    滥用可靠函数可能导致其队列溢出,此操作将强制断开连接。若逐帧调用复制函数,应将其设为不可靠。若拥有与玩家输入绑定的可靠函数,应限制玩家调用该函数的频率。

    网络提示

    1.尽可能少用RPC或复制蓝图函数。在合适情况下改用RepNotify。
    2.组播函数会导致会话中各连接客户端的额外网络流量,需尤其少用。
    3.若能保证非复制函数仅在服务器上执行,则服务器RPC中无需包含纯服务器逻辑。
    4.将可靠RPC绑定到玩家输入时需谨慎。玩家可能会快速反复点击按钮,导致可靠RPC队列溢出。应采取措施限制玩家激活此项的频率。
    5.若游戏频繁调用RPC或复制函数,如tick时,则应将其设为不可靠。
    6.部分函数可重复使用。调用其响应游戏逻辑,然后调用其响应RepNotify,确保客户端和服务器拥有并列执行即可。
    7.检查Actor的网络角色可查看其是否为 ROLE_Authority。此方法适用于过滤函数中的执行,该函数同时在服务器和客户端上激活。
    8.使用C++中的 IsLocallyControlled 函数或蓝图中的Is Locally Controlled函数,可检查Pawn是否受本地控制。基于执行是否与拥有客户端相关来过滤函数时,此方法十分拥有。
    9.构造期间Pawn可能未被指定控制器,因此避免在构造函数脚本中使用IsLocallyControlled

  • 相关阅读:
    基于Java+SpringBoot+Thymeleaf+Mysql企业网站公司网站系统设计实现
    ESP32学习笔记 - 基于 ESP32 移植 LVGL8.3
    一个手机ip从这个城市去到另一个城市多久会变
    Starday为什么是跨境电商卖家的不二之选?
    多维分析预汇总应该怎样做才管用?
    报错__WEBPACK_IMPORTED_MODULE_1_vuex__.a.store is not a constructor
    二十二、MySQL联合查询
    SpringBoot 实现二维码扫码登录
    「华流才是顶流」?分享你心目中的YYDS
    SpringDataJPA-@Query
  • 原文地址:https://blog.csdn.net/weixin_43945471/article/details/134156860