UE5——网络——RPC
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
相关文章:
UE5——网络——RPC
RPC(这个是官方文档的资料) 要将一个函数声明为 RPC,您只需将 Server、Client 或 NetMulticast 关键字添加到 UFUNCTION 声明。 例如,若要将某个函数声明为一个要在服务器上调用、但需要在客户端上执行的 RPC,您可以…...
基于ASP.NET MVC + Bootstrap的仓库管理系统
基于ASP.NET MVC Bootstrap的仓库管理系统。源码亲测可用,含有简单的说明文档。 适合单仓库,基本的仓库入库管理,出库管理,盘点,报损,移库,库位等管理,有着可视化图表。 系统采用Bo…...
Jetson NX FFmpeg硬件编解码实现
最近在用Jetson Xavier NX板子做视频处理,但是CPU进行视频编解码,效率比较地下。 于是便考虑用硬解码来对视频进行处理。 通过jtop查看,发现板子是支持 NVENC硬件编解码的。 1、下载源码 因为需要对ffmpeg进行打补丁修改,因此需…...
5.2用队列实现栈(LC225-E)
算法: 其实这道题不用像上一道题一样,用两个队列实现栈。 由于队列的数据结构特性。用一个队列就可实现栈。 难点还是在出队的时候: 比如队列[1,2,3],要模拟一个栈入栈就是直接append(其实就是C中的push࿰…...
项目上线前发现严重Bug怎么办?
今天分享一个面试问题,现在有一个面试场景: 项目计划明天发布,但是在今天你作为测试人员发现了一个严重的bug,市场相关人员又在催发布的事情,这个时候你应该怎么办? 这是测试工程师不管是在面试࿰…...
【WPF系列】- Application详解
【WPF系列】- Application详解 文章目录 【WPF系列】- Application详解一、Application简介Application 类具体有以下功能: 二、初始App.xaml二、自定义Main方法启动WPF应用程序第一种:启动应用程序的代码第二种:启动应用程序的代码第三种:启…...
常见的内置方法:__call__,__getitem__,__iter__,__next__
1.__call__方法 在创建好一个实例后,直接调用一个实例会报错。但使用__call__后,可以让这个实例可以像方法一样被调用(就是一个函数后面加个括号的函数调用形式) class Person:passp1 Person() p1() # 实例这样无法直接被调…...
python用cv2画图(line, rectangle, text等)
Python做图像图形研究的时候,通常需要画很多辅助几何形状(比如bounding box等)。基于opencv的几何图形绘制具有易用性,而且天然能和numpy数组交互。 本文总结了几种常用的cv2画几何图形的方法,当一个简易的手册使用&a…...
解决方案中word中分页符的使用
在投标方案中要善于使用“分页符”,尽可能少使用分节符号,没有分页符前,你每次修改你的标书或者文件,增加或者修改内容后。你的格式字段前后都是会发生变化,如何稳定的保证结构呢,那就是分页符的使用&#…...
ubuntu20.04下apache启用php7.4-fpm
默认的apache不解析php文件: 直接安装提示依赖有问题: libapache2-mod-php7.4 : Depends: php7.4-common ( 7.4.3-4ubuntu2.19) but 1:7.4.33-8ubuntu20.04.1deb.sury.org1 is to be installed rootfv-az1492-145:/tmp# sudo apt install libapache2-…...
在 CentOS 服务器上部署 JAR 文件到 Docker 容器
标题:在 CentOS 服务器上部署 JAR 文件到 Docker 容器的详细步骤 步骤 1: 确保 Docker 已安装 在开始之前,确保在 CentOS 服务器上已经安装了 Docker。如果没有安装,可以使用以下命令进行安装: sudo yum install docker步骤 2:…...
vector类模拟实现(c++)(学习笔记)
vector 构造函数析构函数[]push_backsize()capacity()reserve()push_back() 迭代器实现非const和const版本 pop_back()resize()insert()***重点erase()***重点再谈构造函数!拷贝构造函数****(重点)运算符重载***(重点)…...
Redis Sentinel 哨兵模式
Sentinel 哨兵模式 Redis Sentinel 官网 Redis 的 Sentinel 文档 -- Redis中国用户组(CRUG) Sentinel Redis 命令参考(红色) Sentinel 通过监控的方式获取主机的工作状态是否正常,当主机发生故障时, Senti…...
实用篇-MQ消息队列
一、初识MQ 通讯分为同步通讯和异步通讯,同步通讯就比如我们日常生活中的打电话,看直播,能够得到及时的反馈。而异步通讯则类似于聊天软件聊天,不需要建立实时的连接,并且可以进行建立多个业务一起异步执行 1. 同步通…...
springboot打包时依赖jar和项目jar分开打包;jar包瘦身
概述 最近感觉项目在部署时时jar包传输太慢了; 看了下jar包内容,除了项目代码,其余大部分都是依赖jar; 平时改动较多的只是项目代码,依赖jar改动比较少; 所以就在想能不能分开打包;这样只部署项…...
嵌入式系统的元素
注意:关于嵌入式系统的元素这一块儿内容,定义太多了。例如:吉姆莱丁 著,陈会翔 译,由清华大学出版社出版的《构建高性能嵌入式系统》中提到:嵌入式系统通常由电源、时基、数字处理、内存、软件和固件、专用…...
提升ChatGPT答案质量和准确性的方法Prompt engineering实用的prompt灵感和技巧
文章目录 1. 实用的prompt灵感和技巧小技巧常用prompt保存到输入法中普通promptprompt通用公式保存到输入法快捷指令中尝试用英语去写prompt沉浸式翻译软件3. 补充1. 实用的prompt灵感和技巧 解释***,并且给出暗喻/隐喻/类比(解释术语、专业名称,用一个词或短语指出常见的一…...
[Machine Learning] Learning with Noisy Labels
文章目录 随机分类噪声 (Random Classification Noise, RCN)类别依赖的标签噪声 (Class-Dependent Noise, CCN)二分类多分类 实例和类别依赖的标签噪声 (Instance and Label-Dependent Noise, ILN) 标签噪声是指分类任务中的标签被错误地标记。这可能是由于各种原因,…...
集简云slack(自建)无需API开发轻松连接OA、电商、营销、CRM、用户运营、推广、客服等近千款系统
slack是一个工作效率管理平台,让每个人都能够使用无代码自动化和 AI 功能,还可以无缝连接搜索和知识共享,并确保团队保持联系和参与。在世界各地,Slack 不仅受到公司的信任,同时也是人们偏好使用的平台。 官网&#x…...
Idea 对容器中的 Java 程序断点远程调试
第一种:简单粗暴型 直接在java程序中添加log.info(),根据需要打印信息然后打包覆盖,根据日志查看相关信息 第二种:远程调试 在IDEA右上角点击编辑配置设置相关参数在Dockerfile中加入 "-jar", "-agentlib:jdwp…...
eNSP-Cloud(实现本地电脑与eNSP内设备之间通信)
说明: 想象一下,你正在用eNSP搭建一个虚拟的网络世界,里面有虚拟的路由器、交换机、电脑(PC)等等。这些设备都在你的电脑里面“运行”,它们之间可以互相通信,就像一个封闭的小王国。 但是&#…...
盘古信息PCB行业解决方案:以全域场景重构,激活智造新未来
一、破局:PCB行业的时代之问 在数字经济蓬勃发展的浪潮中,PCB(印制电路板)作为 “电子产品之母”,其重要性愈发凸显。随着 5G、人工智能等新兴技术的加速渗透,PCB行业面临着前所未有的挑战与机遇。产品迭代…...
2021-03-15 iview一些问题
1.iview 在使用tree组件时,发现没有set类的方法,只有get,那么要改变tree值,只能遍历treeData,递归修改treeData的checked,发现无法更改,原因在于check模式下,子元素的勾选状态跟父节…...
智能仓储的未来:自动化、AI与数据分析如何重塑物流中心
当仓库学会“思考”,物流的终极形态正在诞生 想象这样的场景: 凌晨3点,某物流中心灯火通明却空无一人。AGV机器人集群根据实时订单动态规划路径;AI视觉系统在0.1秒内扫描包裹信息;数字孪生平台正模拟次日峰值流量压力…...
智能AI电话机器人系统的识别能力现状与发展水平
一、引言 随着人工智能技术的飞速发展,AI电话机器人系统已经从简单的自动应答工具演变为具备复杂交互能力的智能助手。这类系统结合了语音识别、自然语言处理、情感计算和机器学习等多项前沿技术,在客户服务、营销推广、信息查询等领域发挥着越来越重要…...
Python 实现 Web 静态服务器(HTTP 协议)
目录 一、在本地启动 HTTP 服务器1. Windows 下安装 node.js1)下载安装包2)配置环境变量3)安装镜像4)node.js 的常用命令 2. 安装 http-server 服务3. 使用 http-server 开启服务1)使用 http-server2)详解 …...
Linux部署私有文件管理系统MinIO
最近需要用到一个文件管理服务,但是又不想花钱,所以就想着自己搭建一个,刚好我们用的一个开源框架已经集成了MinIO,所以就选了这个 我这边对文件服务性能要求不是太高,单机版就可以 安装非常简单,几个命令就…...
Spring Security 认证流程——补充
一、认证流程概述 Spring Security 的认证流程基于 过滤器链(Filter Chain),核心组件包括 UsernamePasswordAuthenticationFilter、AuthenticationManager、UserDetailsService 等。整个流程可分为以下步骤: 用户提交登录请求拦…...
GraphQL 实战篇:Apollo Client 配置与缓存
GraphQL 实战篇:Apollo Client 配置与缓存 上一篇:GraphQL 入门篇:基础查询语法 依旧和上一篇的笔记一样,主实操,没啥过多的细节讲解,代码具体在: https://github.com/GoldenaArcher/graphql…...
云原生安全实战:API网关Envoy的鉴权与限流详解
🔥「炎码工坊」技术弹药已装填! 点击关注 → 解锁工业级干货【工具实测|项目避坑|源码燃烧指南】 一、基础概念 1. API网关 作为微服务架构的统一入口,负责路由转发、安全控制、流量管理等核心功能。 2. Envoy 由Lyft开源的高性能云原生…...
