UE5——网络——RPC

news2025/4/14 11:49:33

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

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

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

   UFUNCTION( Client )
    void ClientRPCFunction();

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

UFUNCTION( Server )
    void ServerRPCFunction();

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

UFUNCTION( NetMulticast )
    void MulticastRPCFunction();

要求和注意事项

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

1.您必须满足一些要求才能充分发挥 RPC 的作用:

2.它们必须从 Actor 上调用。

3.Actor 必须被复制。

4.如果 RPC 是从服务器调用并在客户端上执行,则只有实际拥有这个 Actor 的客户端才会执行函数。

5.如果 RPC 是从客户端调用并在服务器上执行,客户端就必须拥有调用 RPC 的 Actor。

6.多播 RPC 则是个例外:

 如果它们是从服务器调用,服务器将在本地和所有已连接的客户端上执行它们。

 如果它们是从客户端调用,则只在本地而非服务器上执行。

 现在,我们有了一个简单的多播事件限制机制:在特定 Actor 的网络更新期内,多播函数将不会复制两次以上。按长期计划,我们会对此进行改  善,同时更好的支持跨通道流量管理与限制。

例子

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

	UFUNCTION(Server, Reliable)
	void FunctionServer();
	
	UFUNCTION(Client, Reliable)
	void FunctionClient();
void ARPCProjectCharacter::FunctionServer_Implementation()
{
	GEngine->AddOnScreenDebugMessage(-1, 5.f, FColor::Red, TEXT("FunctionServer"));
	UE_LOG(LogTemp,Warning,TEXT("FunctionServer"));

	FunctionClient();
}
void ARPCProjectCharacter::FunctionClient_Implementation()
{
	GEngine->AddOnScreenDebugMessage(-1, 50.f, FColor::Red, TEXT("FunctionClient"));
	UE_LOG(LogTemp,Warning,TEXT("FunctionClient"));
}
void ARPCProjectCharacter::StartFire()
{

	GEngine->AddOnScreenDebugMessage(-1, 50.f, FColor::Red, TEXT("Click"));
	UE_LOG(LogTemp,Warning,TEXT("Click"));
	
	FunctionServer();
}

在这里插入图片描述

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

	UFUNCTION(Server, Reliable)
	void FunctionServer();
	
void ARPCProjectCharacter::FunctionServer_Implementation()
{
	GEngine->AddOnScreenDebugMessage(-1, 5.f, FColor::Red, TEXT("FunctionServer"));
	UE_LOG(LogTemp,Warning,TEXT("FunctionServer"));
}
void ARPCProjectCharacter::StartFire()
{

	GEngine->AddOnScreenDebugMessage(-1, 50.f, FColor::Red, TEXT("Click"));
	UE_LOG(LogTemp,Warning,TEXT("Click"));
	
	FunctionServer();
}

在这里插入图片描述

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

	UFUNCTION(Server, Reliable)
	void FunctionServer();
	
	UFUNCTION(Client, Reliable)
	void FunctionClient();

    UFUNCTION(NetMulticast, Reliable)
	void FunctionNetMulticast();
void ARPCProjectCharacter::FunctionServer_Implementation()
{
	GEngine->AddOnScreenDebugMessage(-1, 5.f, FColor::Red, TEXT("FunctionServer"));
	UE_LOG(LogTemp,Warning,TEXT("FunctionServer"));

	FunctionClient();
	FunctionNetMulticast();
}
void ARPCProjectCharacter::FunctionNetMulticast_Implementation()
{
	GEngine->AddOnScreenDebugMessage(-1, 50.f, FColor::Red, TEXT("FunctionNetMulticast"));
	UE_LOG(LogTemp,Warning,TEXT("FunctionNetMulticast"));
}

void ARPCProjectCharacter::FunctionClient_Implementation()
{
	GEngine->AddOnScreenDebugMessage(-1, 50.f, FColor::Red, TEXT("FunctionClient"));
	UE_LOG(LogTemp,Warning,TEXT("FunctionClient"));
}
void ARPCProjectCharacter::StartFire()
{

	GEngine->AddOnScreenDebugMessage(-1, 50.f, FColor::Red, TEXT("Click"));
	UE_LOG(LogTemp,Warning,TEXT("Click"));
	
	FunctionServer();
}

在这里插入图片描述

官方图表

在这里插入图片描述

验证


	UFUNCTION( Server, WithValidation )
	void FunctiHpServer( int32 AddHealth );
void ARPCProjectCharacter::FunctiHpServer_Implementation(int32 AddHealth)
{
	
}

bool ARPCProjectCharacter::FunctiHpServer_Validate(int32 AddHealth)
{
	if (AddHealth>0)
	{
		return true;
	}

	return false;
}

可靠性

必须将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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1159257.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

@JsonCreator 和 @JsonValue使用说明

Fastxml.jackson提供了JsonValue和JsonCreator注解用于序列化和反序列化时使用. Jackson 是一个流行的 Java 序列化和反序列化库,它可以将 Java 对象转换为 JSON 格式,并将 JSON 格式转换为 Java 对象。在 Jackson 中,@JsonCreator 和 @JsonValue 是两个重要的注解,用于自…

Kafka保证百万级数据写入和重发问题分享

Kafka作为当下流行的高并发消息中间件,大量用于数据采集,实时处理等场景, 那么它如何做到百万级写入速度呢?我们在享受它带来的高并发,高可靠等便利时,同时不得不面对可能存在的问题,项目中最常见的就是丢…

c++之vector容器

1.简介 向量(Vector)是一个封装了动态大小数组的顺序容器(Sequence Container)。跟任意其它类型容器一样,它能够存放各种类型的对象。可以简单的认为,向量是一个能够存放任意类型的动态数组。 1.1 vector和…

HyperAI超神经 x 中国信通院 | 可信开源大模型案例汇编(第一期)案例征集计划正式启动自定义目录标题)

为进一步促进大模型的开源和合作,引导开源大模型产业健康规范发展,中国信息通信研究院现开启「可信开源大模型案例汇编(第一期)」的案例征集计划。 HyperAI超神经将以合作伙伴的身份,协助调研国产开源大模型的技术细节…

敏捷开发用户故事

产品Backlog中的需求通常使用用户故事来表达。 用户故事是从用户(需求方)的视角描述对用户有价值的需求 Who 这个需求为谁服务 What 具体要做什么 Why 目的是什么 一个典型的用户故事会以如下形式表达: 用户故事格式示例: 作…

基于SC-LeGO-LOAM的建图和ndt_localizer的定位

link 基于SC-LeGO-LOAM的建图和ndt_localizer的定位 链接: link. SC-LeGO-LOAM 链接: link. ndt_localizer 将建图和定位两部分分开,利用SC-LeGO-LOAM进行建图,相比于LeGO-LOAM,其采用了Scan Context方法,对点云地图进行闭环检测和…

5G智能安全帽_实时对讲/视频通话/高精度定位_智能安全帽功能介绍

5G智能安全帽是一种具有工业级高清晰度摄像头和5G/WIFI网络功能的产品。在传统安全帽的基础上,智能安全帽集成了摄像头、语音和通信主板等模块。它具备高清视频采集、语音通讯、对讲、本地视频存储等功能,通过这种佩戴式设备,不仅可以实现数据…

app逆向之charles配置

声明:本文仅限学习交流使用,禁止用于非法用途、商业活动等。否则后果自负。如有侵权,请告知删除,谢谢!本教程也没有专门针对某个网站而编写,单纯的技术研究 目录 charles配置手机配置 charles配置 最近有点…

瑞数专题五

今日文案:焦虑,想象力过度发酵的产物。 网址:https://www.iyiou.com/ 专题五主要是分享瑞数6代。6代很少见,所以找理想哥要的,感谢感谢。 关于瑞数作者之前已经分享过4篇文章,全都收录在瑞数专栏中了&am…

arcpy.message实现探索

arcpy 位置D:\Program Files\GeoScene\Pro\Resources\ArcPy\arcpy\__init__.py ”““AddMessage(消息) 创建可以使用任何GetMessages函数访问的地理处理信息消息(Severity0)。 message(字符串):要添加的消息。”“ arcpy.geoprocessing D:\Program Files\GeoScene\Pro\Re…

求购供应发布农业副业产品市场行情小程序开发

农业副业产品求购供应发布市场行情小程序H5开源版开发 后台同步:一键获取全国近200家农产品批发市场的商品价格,包括蔬菜、水果、水产、粮油和农副产品等。 实时更新和同步市场价格动态,保障信息的准确性和时效性。 前端VIP权益功能&…

WPF RelativeSource属性-目标对象类型易错

上一篇转载了RelativeSource的三种用法,其中第二种用法较常见,这里记录一下项目中曾经发生错误的地方,以防自己哪天忘记了,又犯了同样错误—WPF RelativeSource属性-CSDN博客 先回顾一下: 控件关联其父级容器的属性—…

利用Graviton2和S3免费套餐搭建私人网盘

网盘是一种在线存储服务,提供文件存储,访问,备份,贡献等功能,是我们日常中不可或缺的一种服务。很多互联网公司都为个人和企业提供免费的网盘服务。但这些免费服务都有一些限制,比如限制下载速度&#xff0…

C语言 Number 1 基本数据类型

数据类型的定义 c语言的数据分类基本类型整型浮点型float和double的精度和范围范围精度 枚举类型空类型派生类型派生的一般表达形式 注 c语言的数据分类 首先是针对C语言的数据类型做个整理 大致分为四个大类型 基本类型枚举类型空类型派生类型 那么根据以上四个大类型 我们…

万物摩尔定律:人工智能技术的快速迭代将使人类万劫不复?

第一次工业革命:蒸汽机时代; 第二次工业革命:电气化时代; 第三次工业革命:信息化时代; 第四次工业革命:智能化革命。这一场革命正在上演,是人工智能(AI)带…

预处理详解(一)

1 预定义符号 __FILE__ //进行编译的源文件 __LINE__ //文件当前的行号 __DATE__ //文件被编译的日期 __TIME__ //文件被编译的时间 __STDC__ //如果编译器遵循ANSI C,其值为1,否则未定义 这些预定义符号都是…

试题二(15分)和试题三(15分) (软件设计师笔记)

🏠个人主页:尘觉主页 🧑个人简介:大家好,我是尘觉,希望我的文章可以帮助到大家,您的满意是我的动力😉 在csdn获奖荣誉: 🏆csdn城市之星2名 ⁣⁣⁣⁣ ⁣⁣⁣⁣ ⁣⁣⁣…

Web安全系列——XSS攻击

文章首发公众号: 海天二路搬砖工 一、什么是XSS攻击 XSS (Cross-site scripting)攻击,即跨站脚本攻击。 攻击者通过在受害者的浏览器中注入恶意代码,攻击受害者的登录凭证、盗取敏感信息或控制受害者的会话等。 XS…

泛微e-office download.php任意文件

0x01 应用介绍 泛微e-office系统是标准、易用、快速部署上线的专业协同OA软件,国内协同OA办公领域领导品牌,致力于为企业用户提供专业OA办公系统、移动OA应用等协同OA整体解决方案 0x02 影响版本及语法特征 泛微e-offcie9 fofa:app”泛微-EOffice” && b…