【UE】虚幻网络同步

news2024/10/7 12:20:06

UE网络官方文档链接:https://docs.unrealengine.com/5.2/zh-CN/networking-overview-for-unreal-engine/

虚幻的网络模式

[图片]
服务器作为游戏主机,保留一个真实授权的游戏状态。换句话说,服务器是多人游戏实际发生的地方。客户端会远程控制其在服务器上各自拥有的 Pawn,发送过程调用以使其执行游戏操作。但服务器不会将视觉效果直接流送至客户端显示器。服务器会将游戏状态信息 复制 到各客户端,告知应存在的Actor、此类Actor的行为,以及不同变量应拥有的值。然后各客户端使用此信息,对服务器上正在发生的情况进行高度模拟。
服务器是游戏真正运行的地方,但我们要让客户端的场景看似发生了相同事件。因此,需要选择性地向各客户端发送信息,以在服务器上创建场景的视觉代表。

Actor复制(Actor Replication)

Actor是实现复制的主要推动者。服务器将保留一份 Actor 列表并定期更新客户端,以便客户端保留每个 Actor (那些需要被同步的Actor)的近似复本。
要想让一个Actor参与网络复制,必须将这个Actor的bReplicates设置为true,告诉引擎你需要复制这个Actor。这相当于一个总开关。
蓝图中将Replicates勾上即可
在这里插入图片描述

C++中要需要在构造函数中将bReplicates标记设置为true

MyClass::MyClass( const class FPostConstructInitializeProperties & PCIP ) : Super( PCIP )
{
    bReplicates = true;
}

当你设置一个Actor的bReplicates=true后,服务端会在UNetConnection中创建一个ActorChannel,从而将该Actor复制到对应的客户端。
Actor主要的更新方式有两种
1、Property Replication(属性复制)
2、RPC(远程过程调用)

  • 属性复制和 RPC 的主要区别在于,属性可以在发生变化时随时自动更新,而 RPC 只能在被执行时获得调用更新。

属性复制(Property Replication)

属性复制有两种方式,Replicated和RepNotify,属性同步的前提是已经开启Actor复制
在这里插入图片描述

Replicated

蓝图

直接将该变量的Replicated勾选上即可
在这里插入图片描述

C++

1、在属性的UPROPERTY中添加replicated

UPROPERTY(VisibleAnywhere, Replicated)
float health;

2、在类中重写GetLifetimeReplicatedProps函数,添加DOREPLIFETIME( 类名, 变量名 )

void ATestCppActor::GetLifetimeReplicatedProps(TArray<FLifetimeProperty>& OutLifetimeProps) const
{
    Super::GetLifetimeReplicatedProps(OutLifetimeProps);
    DOREPLIFETIME(ATestCppActor, health);
}

案例

创建一个第三人称的C++UE项目
创建一个TestCppActor类,继承自Actor,添加一个health属性
将health设置为Replicated,仅在服务端修改health的值,查看客户端和服务端的值是否都被修改

// Called when the game starts or when spawned
void ATestCppActor::BeginPlay()
{
    Super::BeginPlay();
    if(HasAuthority())
    {
       health = 500.f;
    }
}
// Called every frame
void ATestCppActor::Tick(float DeltaTime)
{
    Super::Tick(DeltaTime);
    if(HasAuthority())
    {
       UE_LOG(LogTemp, Log, TEXT("Server is %f"), health)
    }
    else
    {
       UE_LOG(LogTemp, Log, TEXT("Client is %f"), health)
    }
}

需要在关卡蓝图中生成一下这个Actor
在这里插入图片描述

结果就是客户端和服务端的该数据都被同步修改了,这就是属性复制的功能
在这里插入图片描述

RepNotify

RepNotify功能和Replicated基本相同,不同点就是RepNotify需要绑定一个属性变化后的函数,在属性发生变化后会调用绑定的函数

蓝图

选择属性复制方式为RepNotify,会自动生成OnRep_属性名 的函数,该函数会在属性发生改变后调用
在这里插入图片描述
C++
在C++中使用对应 ReplicateUsing 说明符

    /** 玩家的当前生命值。降到0就表示死亡。*/
UPROPERTY(ReplicatedUsing=OnRep_CurrentHealth)
float CurrentHealth;

/** RepNotify,用于同步对当前生命值所做的更改。*/
UFUNCTION()
void OnRep_CurrentHealth();

ReplicateUsing表示该属性被复制,OnReq_CurrentHealth就是该属性发生变化后会调用的函数,该函数必须要有UFUNCTION()标记
注意:C++版本RepNotify仅在客户端调用函数

案例

创建一个ARepNotify类,继承自Actor,添加如下图功能
设置Health为属性同步,OnRep_Health为属性改变后的调用函数,在Server端的Tick中不停改变Health的值,在调用函数中打印改变后的值
在这里插入图片描述

同样,需要先在关卡蓝图中生成下Actor,运行结果显示仅调用了Client端的函数,符合C++版本的预期(C++版本RepNotify仅在客户端调用函数)
在这里插入图片描述

Actor权限说明

Server中有个Actor(黄色笑脸),Client A中有个Actor(蓝色笑脸),Client B中有个Actor(绿色笑脸),这些Actor在服务端和客户端的权限如下图
在这里插入图片描述

三种ROLE(本地角色)
Authority: 权威(有对Actor的控制权)
各个Actor在服务端的状态
SimulatedProxy: 模拟代理
当前客户端Actor在其他客户端的状态
AutonomousProxy: 自主代理
当前客户端Actor在当前客户端的状态
Remote_ROLE(远端角色)

远程调用(RPC)

[图片]

[图片]

蓝图

CustomEvent可以设置RPC,普通函数不可以

  • 蓝图中通过设置函数的Replicates属性
    [图片]

C++

任何UFUNCTION都可以指定为Client,Server或者NetMulticast使得一个函数变成一个RPC。

UFUNCTION( Client, Reliable )
void ClientRPCFunction();

可靠性

RPC同时可以声明为可靠的(Reliable)或者不可靠的(Unreliable),可靠RPC在带宽饱和的情况下不会被丢弃,保证按调用顺序发送到,适用于比较重要的函数调用。不可靠的RPC不能保证被发送到,更不能保证按顺序发送到。
不可靠RPC虽然无法保证必会到达预定目的地,但其发送速度和频率高于可靠的RPC。其最适用于对gameplay而言不重要或经常调用的函数。例如,由于Actor移动每帧都可能变换,因此使用不可靠RPC复制该Actor移动。
可靠的RPC保证到达预定目的地,并在成功接收之前一直保留在队列中。其最适合用于对gameplay很关键或者不经常调用的函数。相关例子包括碰撞事件、武器发射的开始或结束,或生成Actor。

案例

以下的案例都是LS模式,3个玩家
[图片]

Server

客户端调用,在服务端运行
首先创建一个BP_CubeActor,继承自Actor,添加一个SkenetalMesh,并在SkeletalMesh上添加一个任意骨架(只要能看到就行),再将Actor复制打开
[图片]

先在服务端的角色头部位置生成一个CubeActor,参考下方第二个图,因为服务端有所有角色的控制器,如果只想在服务端控制的角色生成Cube,则需要通过IsLocallyControlled判断一下
[图片]

[图片]

我们知道,在客户端生成Actor的时候,服务端和其他客户端时看不见的,因为没有同步这个信息给服务端

如果要在客户端控制的角色的头部位置生成CubeActor的话,需要使用RPC中的Server,先判断角色是不是ROLE_AutonomousProxy权限(原因同上),然后执行SpawnCube函数,SpawnCube函数需要时RunOnServer模式,这样客户端角色需要生成CubeActor的时候,会告诉服务端,服务端去帮忙生成CubeActor
[图片]

Multicast

服务端运行,发送给所有客户端
创建一个自定义事件Multicast_Test,设置为Multicast
[图片]

为了方便测试,直接搞个AnyKey,调用Multicast_Test
[图片]

运行项目后,在服务端点击右键,你会发现所有客户端和服务端都执行了该函数
[图片]

Client

客户端调用,服务端运行,发送给拥有此Actor的客户端
和Multicast一样,创建一个自定义事件Client_Test,设置为Run on owning Client
[图片]

运行项目后,在 客户端/服务端 点击右键,你会发现仅有你点击右键的 客户端 执行了该函数
[图片]

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

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

相关文章

SpringBoot Redis 使用Lettuce和Jedis配置哨兵模式

Redis 从入门到精通【应用篇】之SpringBoot Redis 配置哨兵模式 Lettuce 和Jedis 文章目录 Redis 从入门到精通【应用篇】之SpringBoot Redis 配置哨兵模式 Lettuce 和Jedis前言Lettuce和Jedis区别1. 连接方式2. 线程安全性 教程如下1. Lettuce 方式配置1.1. 添加 Redis 和 Let…

Java项目里添加python解析器

java项目里配置了SDK为1.8&#xff0c;添加python文件时会无法解析。 提示让模块配置Python解析器&#xff0c;点击 配置python解析器 &#xff0c;弹出如下&#xff1a; 应用即可。

【机器学习】异常检测

异常检测 假设你是一名飞机涡扇引擎工程师&#xff0c;你在每个引擎出厂之前都需要检测两个指标——启动震动幅度和温度&#xff0c;查看其是否正常。在此之前你已经积累了相当多合格的发动机的出厂检测数据&#xff0c;如下图所示 我们把上述的正常启动的数据集总结为 D a t…

【Linux命令200例】chattr改变文件的扩展属性

&#x1f3c6;作者简介&#xff0c;黑夜开发者&#xff0c;全栈领域新星创作者✌&#xff0c;2023年6月csdn上海赛道top4。 &#x1f3c6;本文已收录于专栏&#xff1a;Linux命令大全。 &#x1f3c6;本专栏我们会通过具体的系统的命令讲解加上鲜活的实操案例对各个命令进行深入…

【人工智能】博弈、极小极大值、α-β剪枝、截断测试

文章目录 博弈极小极大值α-β剪枝截断测试博弈 极小极大值 假设两个玩家都以最大化自身利用进行博弈举例: 计算机假设在它移动后,对手会选择最小化的行动计算机在考虑自己的行动和对手的最佳行动后选择最佳行动算法实现

【python】在matlab中调用python

参考 Matlab调用Python - 知乎 (zhihu.com) 说一下我犯的错误&#xff1a; 1、电脑上有没有python都可以&#xff0c;我以为anaconda里的python不行&#xff0c;又重新下了一个python3.8 实际上导入的时候可以用 pyversion(D:\myDownloads\anaconda\envs\pytorch38\pytho…

Docker 全栈体系(五)

Docker 体系&#xff08;高级篇&#xff09; 二、DockerFile解析 1. 是什么&#xff1f; Dockerfile是用来构建Docker镜像的文本文件&#xff0c;是由一条条构建镜像所需的指令和参数构成的脚本。 1.1 概述 1.2 官网 https://docs.docker.com/engine/reference/builder/ 1…

freeBSD:ssh登录root

/etc/inetd.conf ee /etc/inetd.conf 去掉# /etc/rc.conf ee /etc/rc.conf 添加一句 sshd_enable"YES" /etc/ssh/sshd_config vi /etc/ssh/sshd_config 22行可以修改端口号&#xff0c;非必要就默认22 36行 去掉# 后面修改成 yes 61 PasswordAuthentication…

Python处理Elasticsearch

简介&#xff1a;Elasticsearch 是一个分布式、高扩展、高实时的搜索与数据分析引擎。它能很方便的使大量数据具有搜索、分析和探索的能力。充分利用Elasticsearch的水平伸缩性&#xff0c;能使数据在生产环境变得更有价值。Elasticsearch 的实现原理主要分为以下几个步骤&…

Golang数据库连接池技术原理与实现

1 为什么需要连接池&#xff1f; 如果不用连接池&#xff0c;而是每次请求都创建一个连接是比较昂贵的&#xff0c;因此需要完成3次tcp握手。同时在高并发场景下&#xff0c;由于没有连接池的最大连接数限制&#xff0c;可以创建无数个连接&#xff0c;耗尽文件描述符。连接池…

【软件测试】什么是selenium

1.seleniumJava环境搭建 前置条件: Java最低版本要求为8,浏览器使用chrome浏览器 1.1下载chrome浏览器 https://www.google.cn/chrome/ 1.2查看浏览器版本 点击关于Google chrome. 记住版本的前三个数. 1.3下载浏览器驱动 http://chromedriver.chromium.org/downloads 下载…

JS案例:在浏览器实现自定义菜单

目录 前言 设计思路 BaseElem Menu CustomElement BaseDrag Drag Resize 最终效果 总结 相关代码 前言 分享一下之前公司实现自定义菜单的思路&#xff0c;禁用浏览器右键菜单&#xff0c;使用自定义的菜单将其代替&#xff0c;主要功能有&#xff1a;鼠标右键调出菜…

二、基本数据类型和表达式

2.1数据类型 数据类型占用字节数取值范围bool1true 或 falsechar1-128 到 127 或 0 到 255 &#xff08;取决于是否带符号&#xff09;unsigned char10 到 255short2-32,768 到 32,767unsigned short20 到 65,535int4-2,147,483,648 到 2,147,483,647unsigned int40 到 4,294,…

ES6基础知识二:ES6中数组新增了哪些扩展?

一、扩展运算符的应用 ES6通过扩展元素符…&#xff0c;好比 rest 参数的逆运算&#xff0c;将一个数组转为用逗号分隔的参数序列 console.log(...[1, 2, 3]) // 1 2 3console.log(1, ...[2, 3, 4], 5) // 1 2 3 4 5[...document.querySelectorAll(div)] // [<div>, &l…

12 扩展Spring MVC

12.1 实现页面跳转功能 页面跳转功能&#xff1a;访问localhost:8081/jiang会自动跳转到另一个页面。 首先&#xff0c;在config包下创建一个名为MyMvcConfig的配置类&#xff1a; 类上加入Configuration注解&#xff0c;类实现WebMvcConfiger接口&#xff0c;实现里面的视图跳…

Python入门【列表元素访问和计数 、切片操作、列表的遍历、复制列表所有的元素到新列表对象、多维列表、元组tuple】(五)

&#x1f44f;作者简介&#xff1a;大家好&#xff0c;我是爱敲代码的小王&#xff0c;CSDN博客博主,Python小白 &#x1f4d5;系列专栏&#xff1a;python入门到实战、Python爬虫开发、Python办公自动化、Python数据分析、Python前后端开发 &#x1f4e7;如果文章知识点有错误…

OSI 和 TCP/IP 网络分层模型详解(基础)

OSI模型: 即开放式通信系统互联参考模型&#xff08;Open System Interconnection Reference Model&#xff09;&#xff0c;是国际标准化组织&#xff08;ISO&#xff09;提出的一个试图使各种计算机在世界范围内互连为网络的标准框架&#xff0c;简称OSI。 OSI 七层模型 OS…

两个数组的dp问题(1)--动态规划

一)最长公共子序列: 1143. 最长公共子序列 - 力扣&#xff08;LeetCode&#xff09; 一)定义一个状态表示:根据经验题目要求 1)选取第一个字符串[0&#xff0c;i]区间以及第二个字符串[0&#xff0c;j]区间作为研究对象&#xff0c;先选取两段区间研究问题&#xff0c;先求出[0…

即时零售业务调研2022

调研时间22年7月 核心观点&#xff1a; 即时零售业务正处于爆发期疫情催化&#xff0c;线下商家和零售平台处于双向奔赴的蜜月期未来规模会是万亿市场&#xff0c;市场不容小觑&#xff0c;广告业务重要 业务对比优势 平台模式护城河是&#xff1a;线上流量线下配送网络&am…

芯洲科技-降压DCDC开关电源参考选型目录

芯洲科技&#xff0c;是国内领先的中高压DC-DC&#xff08;直流转直流&#xff09;功率转换芯片供应商。北京冠宇铭通 一级代理。 国产化替代&#xff0c;对标TI&#xff0c;有很多料号可直接PIN TO PIN&#xff0c;比如TPS562200(SOT23-6)\TPS563200(SOT23-6)/TPS54540/LMR140…