【UEC++学习】UE网络 - Replication、RPC

1. UE网络架构

(1)UE的网络架构是SC(Server - Client)的模式,这种模式的优势:这种模式让所有客户端都在服务器端进行安全验证,这样可以有效的防止客户端上的作弊问题。
(2)Listen Server(等待加入的服务器):局域网上建的服务器,等待其他人的加入,即一个人是服务端,其他人则是客户端。Dedicated Server(专有服务器)。
(3)我们在客户端上操作的角色称为本地角色,同时服务器上也有一个角色称为远程角色。

GamePlay框架在SC架构上:
GameMode是只存在在服务端的,PlayerController_Server是存在在服务端的。
每启动一个游戏实例,都会生成对应的UI和GameInstance,因此每个客户端和服务端都存在自己独一无二的GameInstance、UI。

网络信息的传输方式
(1)Replication(网络复制):只能是单向的,从服务端复制到客户端
(2)RepNotify:更改属性时,执行网络通知函数
(3)RPC:方向是任意的

2. Replication

官方文档:多人游戏编程快速入门指南

2.1 Actor Replication

网络信息只能从服务端传递到客户端,而客户端想发送信息到服务端需要RPC。所有的Actor都有网络复制的能力。

类型:
(1)Actor Replication - Actor网络复制
(2)Property Replication - 属性网络复制
(3)Component Replication - Component网络复制

在C++中打开Replication

/** 在Actor类中直接设置为true */
// 开启网络复制
bReplicates = true;

在蓝图中打开Replication

在这里插入图片描述

在C++中打开Replication

/** 在Actor类中直接设置为true */
// 开启网络复制
bReplicates = true;

测试:如果不开启Replication,只在服务端上生成,客户端不生成。

我们将Number of Players调成2,并将Net Mode改为Play As Listen Server。

在这里插入图片描述

并在关卡蓝图中生成Actor,使其只在服务端中生成。

在这里插入图片描述

可以看到在服务端存在的物体,在客户端中并不存在,但是该物体在客户端有物理碰撞的检测,这是因为Character Movement Component是Replication,这样就导致客户端出现空气墙的阻挡。

在这里插入图片描述

在这里插入图片描述

2.2 Property Replication

在蓝图中打开Property Replication

在这里插入图片描述

在C++中打开Property Replication

/** 1. 在属性中定义Replicated */
UPROPERTY(Replicated)
float Time = 100.f;/** 2. 添加GetLifetimeReplicatedProps重写方法,并使用DOREPLIFETIME进行绑定 */
void ARPGTestCharacter::GetLifetimeReplicatedProps(TArray<FLifetimeProperty>& OutLifetimeProps) const
{Super::GetLifetimeReplicatedProps(OutLifetimeProps);DOREPLIFETIME(ARPGTestCharacter, Time);
}

只在服务器上设置,客户端上的属性就会通过Replication进行复制同步。

if(HasAuthority())
{// 对需要Replication的属性进行设置Time = 200;
}

2.3 RepNotify

在蓝图中打开RepNotify

在这里插入图片描述

RepNotify会自动生成一个函数,当属性发生改变时(即发生复制时),对于蓝图来说客户端和服务端都会执行一次这个函数。

在C++中打开RepNotify

/** 1. 定义为ReplicatedUsing,并添加通知的函数名 */
UPROPERTY(ReplicatedUsing = OnRep_Time)
float Time = 100.f;/** 2. 定义通知发生时的函数 */
// Rep_Notify的回调函数必须加上UFUNCTION()
UFUNCTION()
void OnRep_Time();/** 3. 添加GetLifetimeReplicatedProps重写方法,并使用DOREPLIFETIME进行绑定 */
void ARPGTestCharacter::GetLifetimeReplicatedProps(TArray<FLifetimeProperty>& OutLifetimeProps) const
{Super::GetLifetimeReplicatedProps(OutLifetimeProps);DOREPLIFETIME(ARPGTestCharacter, Time);
}

注意:如果是C++中的RepNotify,只会在客户端执行这个函数。

3. Owner

Owner是一个链条,最终会追溯到PlayerController,通过Connect连接到服务端。

在蓝图中指定Owner

在这里插入图片描述

在C++中指定Owner

/** 通过SpawnActor指定Owner */
AActor* SpawnActor( UClass* Class, FTransform const* Transform, const FActorSpawnParameters& SpawnParameters = FActorSpawnParameters());
// 在FActorSpawnParameters中指定Owner
struct ENGINE_API FActorSpawnParameters
{FActorSpawnParameters();FName Name;AActor* Template;/** 指定Owner */AActor* Owner;APawn*	Instigator;class	ULevel* OverrideLevel;
}
/** AActor中的SetOwner函数 */
virtual void SetOwner( AActor* NewOwner );
/** AActor中的GetOwner函数 */
AActor* GetOwner() const;
/** 在Controller中调用Possess和UnPossess函数,在内部调用PossessedBy,最终调用SetOwner */
void APawn::PossessedBy(AController* NewController)
{/** 在PossessedBy中调用SetOwner */SetOwner(NewController);// ......
}

4. Actor Role

官方文档:Actor 的 Role 和 RemoteRole 属性

Authority:只存在于服务端,所有实例在服务端都有一个Authority。
Autonomous Proxy:相当于在客户端上的玩家,有自主权,但还是要通过服务器的Authority验证。
Simulated Proxy:每个客户端上,都存在其他客户端和一个服务器的实例,这个实例就是Simulated,因为不可能每帧都去进行同步,因此会有个间隔去进行同步,而Simulated模拟的就是这个插值。

5. RPC

官方文档:RPC

因为RPC是不可靠的,因此其不需要返回值,在蓝图中也只有Event才能设置RPC。

在蓝图中打开RPC

在这里插入图片描述

在C++中打开RPC

/**
* 声明RPC模式会定义XXX_Implementation()函数
* 声明WithValidation会定义XXX_Validate()函数,用于数据判断,若为false则直接断开RPC
*/// 多播执行
UFUNCTION(NetMulticast, Reliable)
void MulticastExe();// Server执行,WithValidation 
UFUNCTION(Server, Reliable, WithValidation)
void ServerExe();// Server执行 
UFUNCTION(Client, Unreliable)
void ClientExe();

在官网中的表格可以找到Actor ownership和对应的Event设置的模式会产生对应的效果,实际情况我们可以通过设置进行调用:

在这里插入图片描述

6. 理论应用

6.1 如何区分Actor Role

主要通过Is Locally Controlled()Get Local Role()来进行判断。

在这里插入图片描述

6.2 在服务端获取客户端的Authority

因为GameMode只存在于服务端,则通过GameMode存储

在这里插入图片描述

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

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

相关文章

Python(五十六)列表元素的排序操作

❤️ 专栏简介&#xff1a;本专栏记录了我个人从零开始学习Python编程的过程。在这个专栏中&#xff0c;我将分享我在学习Python的过程中的学习笔记、学习路线以及各个知识点。 ☀️ 专栏适用人群 &#xff1a;本专栏适用于希望学习Python编程的初学者和有一定编程基础的人。无…

数据结构初阶--栈和队列

目录 一.栈 1.栈的定义 2.顺序栈的功能实现 2.1.顺序栈的定义 2.2.顺序栈的初始化 2.3.顺序栈的判空 2.4.顺序栈的入栈 2.5.顺序栈的出栈 2.6.顺序栈的取栈顶元素 2.7.顺序栈的求栈的大小 2.8.顺序栈的销毁 2.9.完整程序 Stack.h Stack.c test.c 二.队列 1.队…

使用 Docker Compose 部署 Redis Cluster 集群,轻松搭建高可用分布式缓存

Redis Cluster&#xff08;Redis 集群&#xff09;是 Redis 分布式解决方案的一部分&#xff0c;它旨在提供高可用性、高性能和横向扩展的功能。Redis Cluster 能够将多个 Redis 节点组合成一个分布式集群&#xff0c;实现数据分片和负载均衡&#xff0c;从而确保在大规模应用场…

session反序列化+SoapClientSSRF+CRLF

文章目录 session反序列化SoapClientSSRFCRLF前言bestphps revengecall_user_func()方法的特性SSRFCRLF组合拳session反序列化 解题步骤总结 session反序列化SoapClientSSRFCRLF 前言 从一道题分析通过session反序列化出发SoapClientSSRF利用CRLF解题 bestphp’s revenge 首…

基于方向编码的模板匹配算法matlab仿真

目录 1.算法运行效果图预览 2.算法运行软件版本 3.部分核心程序 4.算法理论概述 5.算法完整程序工程 1.算法运行效果图预览 2.算法运行软件版本 MATLAB2022a 3.部分核心程序 ........................................................................... %选择移动个…

自适应巡航控制系统研究(Matlab代码实现)

目录 &#x1f4a5;1 概述 &#x1f4da;2 运行结果 &#x1f389;3 参考文献 &#x1f468;‍&#x1f4bb;4 Matlab代码 &#x1f4a5;1 概述 据统计, 我国交通事故造成的伤亡人数每年超过10万人, 其中驾驶员人为原因 (疲劳、酒驾、误操作等) 所致事故逐渐升高.汽车交通…

pycharm——制作k线图

K 线图 Candlestick Candlestick - Kline_itemstyle from pyecharts import options as opts from pyecharts.charts import Klinedata [[2320.26, 2320.26, 2287.3, 2362.94],[2300, 2291.3, 2288.26, 2308.38],[2295.35, 2346.5, 2295.35, 2345.92],[2347.22, 2358.98, 23…

安装skywalking并集成到微服务项目

文章目录 一、前言二、介绍1. 架构 三、安装skywalking服务端四、启动skywalking服务端五、微服务项目开发注册中心网关服务商品服务订单服务支付服务测试 六、下载java客户端七、微服务集成skywalking客户端1. idea启动2. 命令行启动3. 集成效果 八、skywalking客户端配置1. 配…

Python高阶技巧 正则表达式

正则表达式&#xff0c;又称规则表达式&#xff08;Regular Expression&#xff09;&#xff0c;是使用单个字符串来描述、匹配某个句法规则的字符串&#xff0c;常被用来检索、替换那些符合某个模式&#xff08;规则&#xff09;的文本。 简单来说&#xff0c;正则表达式就是使…

小程序学习(六):全局配置

1.全局配置文件及常用的配置项 全局配置-window 2.小程序窗口的组成部分 3.了解window节点常用的配置项 4.设置导航栏的标题 设置步骤:app.json->window->navigationBarTitleText 5.设置导航栏的背景色 背景颜色不支持red这种文字 6.设置导航栏的标题颜色 注意:navigat…

SpringBoot笔记:SpringBoot集成Dataway

文章目录 1、什么是 Dataway?2、主打场景3、技术架构4、整合SpringBoot4.1、maven 依赖4.2、初始化脚本4.3、整合 SpringBoot 5、Dataway 接口管理6、Mybatis 语法支持7、小结 1、什么是 Dataway? 官网地址&#xff1a;https://www.hasor.net/docs/guides/quickstart Da…

k8s kubeadm命令升级集群 从1.17升级到1.18

k8s kubeadm命令升级集群 从1.17升级到1.18 大纲 注意事项master节点执行升级命令master节点和node节点执行命令 注意事项 目标当前线上k8s集群版本是k8s1.17 想把k8s升级到1.18。注意k8s不能跨版本升级例如k8s1.17不能直接升级到k8s1.19&#xff0c;需要先升级到1.18才后向…

faac内存开销较大,为方便嵌入式设备使用进行优化(valgrind使用)

faac内存开销较大&#xff0c;为方便嵌入式设备使用进行优化&#xff0c;在github上提了issues但是没人理我&#xff0c;所以就搞一份代码自己玩吧。 基于faac_1_30版本&#xff0c;原工程https://github.com/knik0/faac faac内存优化: faac内存开销较大&#xff0c;为方便嵌入…

意外:WPS编程新工具,不用编程,excel用户:可以不用VBA啦

来来来&#xff0c;拓宽一下视野&#xff01; 别总以为excel和WPS只能用VBA编程&#xff0c;也别总是想着ACCESS这些老生常谈的工具。其实对于电子表格高级用户来讲&#xff0c;不会VBA&#xff0c;不用ACCESS&#xff0c;也一样可以解决复杂问题或者高级应用。 尤其是WPS用户…

【腾讯云 Cloud Studio 实战训练营】CloudStudio体验真正的现代化开发方式,双手插兜不知道什么叫对手!

CloudStudio体验真正的现代化开发方式&#xff0c;双手插兜不知道什么叫对手&#xff01; 文章目录 CloudStudio体验真正的现代化开发方式&#xff0c;双手插兜不知道什么叫对手&#xff01;前言出现的背景一、CloudStudio 是什么&#xff1f;二、CloudStudio 的特点三、CloudS…

PostgreSql 锁

一、概述 在 PostgreSQL 事务中提到&#xff0c;多个用户访问相同数据时可能出现脏读&#xff0c;不可重复度&#xff0c;幻读&#xff0c;更新丢失的问题&#xff0c;为解决这些问题&#xff0c;定义了不同的隔离级别&#xff0c;而隔离级别的具体实现&#xff0c;依靠的就是数…

钉钉群消息推送

1. 添加钉钉群机器人 PC端登录&#xff08;当前版本手机端无法进行推送关键词设置&#xff09;&#xff0c;群设置--> 机器人 --> webhook进行安全设置复制webhook对应的url 2. 群消息推送 钉钉群消息支持纯文本和markdown类型 2.1 调用示例源码 import com.alibaba.…

助你丝滑过度到 Vue3 组合式Api的优势新的组件 ②⑧

作者 : SYFStrive 博客首页 : HomePage &#x1f4dc;&#xff1a; VUE3~TS &#x1f4cc;&#xff1a;个人社区&#xff08;欢迎大佬们加入&#xff09; &#x1f449;&#xff1a;社区链接&#x1f517; &#x1f4cc;&#xff1a;觉得文章不错可以点点关注 &#x1f449;…

2023.08.01 驱动开发day8

驱动层 #include <linux/init.h> #include <linux/module.h> #include <linux/of.h> #include <linux/of_irq.h> #include <linux/interrupt.h> #include <linux/fs.h> #include <linux/gpio.h> #include <linux/of_gpio.h>#…

如何在免费版 pycharm 中使用 github copilot (chatGPT)?

起因 在 vscode 中使用了 github copilot 以后&#xff0c;感觉这个人工智能还不错。 但 vscode 对于 python 项目调试并不是特别方便&#xff0c;所以想在 Pycharm 中也能使用同一个 github 账号&#xff0c;用上 copilot 的功能。 不需要等待&#xff0c;安装即用&#xff…