当前位置: 首页 > news >正文

【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存储

在这里插入图片描述

相关文章:

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

1. UE网络架构 &#xff08;1&#xff09;UE的网络架构是SC&#xff08;Server - Client&#xff09;的模式&#xff0c;这种模式的优势&#xff1a;这种模式让所有客户端都在服务器端进行安全验证&#xff0c;这样可以有效的防止客户端上的作弊问题。 &#xff08;2&#xff…...

C语言案例 按序输出三个整数-02

题目&#xff1a;输入三个整数a,b,c,按从小到大的顺序输出 步骤一&#xff1a;定义程序的目标 编写一个C程序&#xff0c;随机输入三个整数&#xff0c;按照从小到大的顺序输出。 步骤二&#xff1a;程序设计 整个程序由三个模块组成&#xff0c;第一个为scanf输入函数模块&a…...

区块链实验室(16) - FISCO BCOS实验环境

经过多次重复&#xff0c;建立一个FISCO BCOS实验环境。该环境是一个VMWare虚拟机&#xff0c;能够启动FISCO BCOS自创建的4节点区块链&#xff0c;不必下载依赖包即可编译Fisco Bcos目标文件&#xff0c;安装有VsCode1.81版本。 启动4节点的Fisco Bcos区块链 启动控制台 编译…...

Java事件监听机制

这里写目录标题 先进行专栏介绍再插一句 开始喽事件监听机制分析观察者模式观察者模式由以下几个角色组成&#xff1a;观察者模式的工作流程如下&#xff1a;观察者模式的优点包括&#xff1a;观察者模式适用于以下场景&#xff1a;总结 事件监听机制的工作流程如下&#xff1a…...

记一次ubuntu16误删libc.so.6操作的恢复过程

背景 操作系统&#xff1a;ubuntu16 glibc版本&#xff1a;2.23 修改原因&#xff1a; 经过一系列报错和手工构建之后&#xff0c;vulkansdk成功安装&#xff08;起码运行./vulkansdu成功&#xff09;&#xff0c;在进行./vulkaninfo进行验证时&#xff0c;报错&#xff1a…...

MAVLINK—C语言demoWindows版本

mavlink/examples/c/udp_example.c 在学习mavlink时准备学习一下官网的C语言example&#xff0c;发现是unix系统的&#xff0c;打算在Windows系统下尝试&#xff0c;于是将示例修改了一下。 #include <stdio.h> #include <errno.h> #include <string.h> #in…...

区块链实验室(15) - 编译FISCO BCOS的过程监测

首次编译开源项目&#xff0c;一般需要下载很多依赖包&#xff0c;尤其是从github、sourceforge等下载依赖包时&#xff0c;速度很慢&#xff0c;编译进度似乎没有一点反应&#xff0c;似乎陷入死循环&#xff0c;似乎陷入一个没有结果的等待。本文提供一种监测方法&#xff0c…...

java_IO其它架包使用

文章目录 apache-common包的使用 apache-common包的使用 IO技术开发中&#xff0c;代码量很大&#xff0c;而且代码的重复率较高&#xff0c;为此Apache软件基金会&#xff0c;开发了IO技术的工具类commonsIO&#xff0c;大大简化了IO开发。 Apahce软件基金会属于第三方&…...

一、7.协同式任务切换与抢占式任务切换

使用TSS来在任务切换时保护现场和恢复现场 内核任务&#xff1a;单纯由内核组成的任务&#xff0c;和其他用户程序组成其他任务 内核任务的创建 ;为内核任务创建任务控制块TCB mov ecx, 0x46 call sys_routine_seg_sel:allocate_memory call append_to_tcb_link ;将此TCB添加…...

JavaScript实践:用Canvas开发一个可配置的大转盘抽奖功能

&#x1f3c6;作者简介&#xff0c;黑夜开发者&#xff0c;全栈领域新星创作者✌&#xff0c;阿里云社区专家博主&#xff0c;2023年6月csdn上海赛道top4。 &#x1f3c6;数年电商行业从业经验&#xff0c;历任核心研发工程师&#xff0c;项目技术负责人。 &#x1f3c6;本文已…...

yay无法更新问题解决

背景 更新yay后&#xff0c;yay安装软件捞出问题&#xff0c;查的github上的都不靠谱。因此需要把yay的版本固定下&#xff0c;正常的11版本是可用的 解决方案 sudo pacman -S --needed git base-devel git clone https://aur.archlinux.org/yay.git cd yay makepkg -si # 注…...

C语言 — 动态内存管理(动态内存函数)

前言 本期分为三篇介绍动态内存管理相关内容&#xff0c;关注博主了解更多 博主博客链接&#xff1a;https://blog.csdn.net/m0_74014525 本期介绍动态内存函数&#xff0c;函数如何使用、函数格式、在使用在所需要的注意点及C/C程序的内存开辟区域 系列文章 第一篇&#xff…...

Visual ChatGPT:Microsoft ChatGPT 和 VFM 相结合

推荐&#xff1a;使用 NSDT场景编辑器助你快速搭建可二次编辑的3D应用场景 什么是Visual ChatGPT&#xff1f; Visual ChatGPT 是一个包含 Visual Foundation 模型 &#xff08;VFM&#xff09; 的系统&#xff0c;可帮助 ChatGPT 更好地理解、生成和编辑视觉信息。VFM 能够指…...

基于java理发店预约系统微信小程序设计与实现

摘要 多姿多彩的世界带来了美好的生活&#xff0c;行业的发展也是形形色色的离不开技术的发展。作为时代进步的发展方面&#xff0c;信息技术至始至终都是成就行业发展的重要秘密。不论何种行业&#xff0c;大到国家、企业&#xff0c;小到团体、个人都在多方位的结合信息化技术…...

【软件测试】大厂测工都是这样学习的,你get到了吗?

有不少的软件测试工程师站在“十字路口”迷茫、无助&#xff0c;找不到自己的方向。一切的迷茫都是因为想得太多而做的太少&#xff01;每位软件测试行业从业者都能意识到目前自己面临的窘境&#xff0c;但能及时作出改变&#xff0c;顺应时代变化的人还是太少。多数人明明“泰…...

如何使用ONLYOFFICE+ffmpeg来给视频文件打马赛克

如何使用ONLYOFFICEffmpeg来给视频文件打马赛克 我这里之前写过很多关于ONLYOFFICE使用、安装的系列图文&#xff0c;也写过很多关于ffmpeg使用的图文&#xff0c;那么这次继续&#xff0c;把这两个开源软件放在一起&#xff0c;能碰撞出什么火花般的功能来。 这就是给视频文…...

003-依赖注入、属性赋值源码分析

目录 引入作用代码分析InstantiationAwareBeanPostProcessor#postProcessProperties()AutowiredAnnotationBeanPostProcessor查找注入点元数据给注入点注入属性 引入 之前我们了解到BeanDefinition到Bean&#xff0c;经历了 实例化属性赋值初始化 3个步骤现在详细分析下属性赋…...

Elasticsearch 商业启示

上月的“红帽事件”&#xff0c;说明开源软件的“客服模式”行不通&#xff0c;那么&#xff0c;开源软件如何赚钱呢&#xff1f;既不能卖软件&#xff0c;又不能卖支持服务&#xff0c;该怎么办呢&#xff1f;我现在的看法是&#xff0c;只剩下一种模式是可行的&#xff0c;开…...

C++/Qt 读写文件

之前写过两篇跟文件操作相关的博客&#xff0c;有兴趣也可以看一下&#xff1a; C语言读写文件 Qt关于文件路径的处理 先讲一些关于基础文本文件和二进制文件的读写操作&#xff0c;后续将会整理C/Qt关于ini、xml、json、xlsx相关文件的读写操作。 C 相比于C语言使用FILE文…...

linux服务器之-nethogs命令

文章目录 NetHogs 工具安装安装依赖包安装epel源安装Nethogs 使用 NetHogs 工具 NetHogs是一个小型的net top工具&#xff0c;不像大多数工具那样拖慢每个协议或者是每个子网的速度而是依照进程进行带宽分组。 安装 安装依赖包 yum install libpcap libpcap-devel epel-rel…...

【大模型RAG】拍照搜题技术架构速览:三层管道、两级检索、兜底大模型

摘要 拍照搜题系统采用“三层管道&#xff08;多模态 OCR → 语义检索 → 答案渲染&#xff09;、两级检索&#xff08;倒排 BM25 向量 HNSW&#xff09;并以大语言模型兜底”的整体框架&#xff1a; 多模态 OCR 层 将题目图片经过超分、去噪、倾斜校正后&#xff0c;分别用…...

R语言AI模型部署方案:精准离线运行详解

R语言AI模型部署方案:精准离线运行详解 一、项目概述 本文将构建一个完整的R语言AI部署解决方案,实现鸢尾花分类模型的训练、保存、离线部署和预测功能。核心特点: 100%离线运行能力自包含环境依赖生产级错误处理跨平台兼容性模型版本管理# 文件结构说明 Iris_AI_Deployme…...

DockerHub与私有镜像仓库在容器化中的应用与管理

哈喽&#xff0c;大家好&#xff0c;我是左手python&#xff01; Docker Hub的应用与管理 Docker Hub的基本概念与使用方法 Docker Hub是Docker官方提供的一个公共镜像仓库&#xff0c;用户可以在其中找到各种操作系统、软件和应用的镜像。开发者可以通过Docker Hub轻松获取所…...

mongodb源码分析session执行handleRequest命令find过程

mongo/transport/service_state_machine.cpp已经分析startSession创建ASIOSession过程&#xff0c;并且验证connection是否超过限制ASIOSession和connection是循环接受客户端命令&#xff0c;把数据流转换成Message&#xff0c;状态转变流程是&#xff1a;State::Created 》 St…...

【磁盘】每天掌握一个Linux命令 - iostat

目录 【磁盘】每天掌握一个Linux命令 - iostat工具概述安装方式核心功能基础用法进阶操作实战案例面试题场景生产场景 注意事项 【磁盘】每天掌握一个Linux命令 - iostat 工具概述 iostat&#xff08;I/O Statistics&#xff09;是Linux系统下用于监视系统输入输出设备和CPU使…...

基础测试工具使用经验

背景 vtune&#xff0c;perf, nsight system等基础测试工具&#xff0c;都是用过的&#xff0c;但是没有记录&#xff0c;都逐渐忘了。所以写这篇博客总结记录一下&#xff0c;只要以后发现新的用法&#xff0c;就记得来编辑补充一下 perf 比较基础的用法&#xff1a; 先改这…...

C++ 基础特性深度解析

目录 引言 一、命名空间&#xff08;namespace&#xff09; C 中的命名空间​ 与 C 语言的对比​ 二、缺省参数​ C 中的缺省参数​ 与 C 语言的对比​ 三、引用&#xff08;reference&#xff09;​ C 中的引用​ 与 C 语言的对比​ 四、inline&#xff08;内联函数…...

【git】把本地更改提交远程新分支feature_g

创建并切换新分支 git checkout -b feature_g 添加并提交更改 git add . git commit -m “实现图片上传功能” 推送到远程 git push -u origin feature_g...

短视频矩阵系统文案创作功能开发实践,定制化开发

在短视频行业迅猛发展的当下&#xff0c;企业和个人创作者为了扩大影响力、提升传播效果&#xff0c;纷纷采用短视频矩阵运营策略&#xff0c;同时管理多个平台、多个账号的内容发布。然而&#xff0c;频繁的文案创作需求让运营者疲于应对&#xff0c;如何高效产出高质量文案成…...

elementUI点击浏览table所选行数据查看文档

项目场景&#xff1a; table按照要求特定的数据变成按钮可以点击 解决方案&#xff1a; <el-table-columnprop"mlname"label"名称"align"center"width"180"><template slot-scope"scope"><el-buttonv-if&qu…...