一、 UE4网络架构

Server-Client构架

1.一个服务器,一个或多个客户端。

客户端所有的操作如击杀等都需要传到中央服务器来运算,得到的运算结果下发到各个客户端。服务器是UE4多人游戏的重要组成部分。它做出所有重要决策,包含所有权威状态,处理客户端连接,前往新地图,处理开始比赛、结束比赛等整个游戏流程。

2.不能信任客户端,所有重要信息都需要通过服务器验证。

在该种模式,一个重要的特征就是对各个客户端不信任,需要中央服务器进行各方面验证。

3.Listen Server & Dedicated Server。

Listen Server中Listen其实表示等待的意思,如早期CS游戏在该种服务器模式下,一个玩家先加入一个主服务器,然后等待其他玩家的加入。Dedicated Server中没有玩家的入驻,所有玩家都是以客户端的方式加入进来的。Listen Server和Dedicated Server在开发流程上没有什么区别,在打包方式上有所区别。其中Dedicated Server在打包中需要源码编译,会去掉图形界面等冗余部分,提高效率。关于Dedicated Server的打包详情可以看第5期(2):UE4项目中使用“专用服务器(Dedicated Server)”(1) - 知乎 (zhihu.com)

4.我们是客户端时,是在操作本地角色还是远程角色?(replicate movement)。

比如说,在射击游戏中,客户端游戏玩家开火射击时,该操作被传到服务端进行处理如验证是否还有子弹等,由于网络有延时,为确保玩家游戏体验的流畅性,会在本地直接进行虚拟的开火动画,这就是操作本地玩家;相应地,在服务端处理完成后,远程角色才实现开火。UE4中有replicate movement选项,勾上这个就会实现本地角色和远程角色的构架。

5.网络传输的主要方式:

Replication(Rep_Notify)、RPC

6.在C++中区分服务端和客户端

If (HasAuthority){} //如果在服务端

else {} //在客户端

二、 Replication网络复制

它是网络同步的核心概念之一,笼统来说,表示信息从服务端同步到客户端(单向)。Actor及其派生类才有Replication的能力。Replication的类型有Actor Replication、Property Replication、Component Replication。

Actor Replication开启:

1.服务端生成,客户端也跟着生成(在服务端生成一个replicate对象)。

2.他是当前Actor的所有属性复制、组件复制、RPC的总开关。如果他没有开启,剩下的都默认关闭。

在蓝图中:勾选“Replicates”,在C++中输入如下代码“bReplicates = true;”来开启Actor Replication。具体的,在一蓝图中,点击“Class defaults”,然后在右边细节面板中Replication中勾上Replicates。

Property Replication开启:

在蓝图中,选中相关属性,在细节面板中Replication设置为Replicated。在C++中,1.属性前增加UPROPERTY(Replicated),2..cpp文件中,在GetLifetimeReplicatedProps函数中添加:DOREPLIFETIME(类名称,变量名)。不需要声明该函数。

其中,代码头部需要添加include “Net/UnrealNetwork.h”

RepNOTIFY:

复制通知:如果一个变量设置为Rep_Notify,当该变量发生复制时,服务端和收到该值的客户端都可以调用一个自定义的函数。注意C++的版本略有区别,仅在客户端调用函数。他的设置方法在蓝图中:设置为RepNotify即自动生成。在C++:UPROPERTY(ReplicatedUsing=xxX)

三、 Ownership所有权

Ownership指的是Connection、PlayerController、Pawn之间的连接所属关系。像诸如建筑、NPC是没有所有权的。为什么OWNERSHIP很重要:1、RPC需要确定哪个客户端将执行运行于客户端的 RPC。2、Actor复制与连接相关性。3、在涉及所有者时的Actor属性复制条件。

连接所有权会在actor复制期间使用。对于那些将 bOnlyRelevantToOwner设置为true的actor,只有拥有此actor的连接才会接收这个actor的属性更新。默认情况下,所有PlayerController都设置了此标志,正因如此,客户端才只会收到它们拥有的PlayerControler的更新。这样做是出于多种原因,其中最主要的是防止玩家作弊和提高效率。

如何设置/改变/获取OWNERSHIP呢,C+=变成中一是SpawnActor函数中SpawnParameters中有Owner,其实它就对应着蓝图在生成对象时的Owner引脚,二是在蓝图和C+=中有SetOwner函数调用,三是Possess函数 (QnPossess >PossessedBy>SetOwner), UnPossess函数。

四、Actor Role

有三种Role,分别是Authority、Simulated Proxy、Autonomous Proxy。Authority存在于服务器,顾名思义,是一种权威的Role。Simulated Proxy、Autonomous Proxy存在于客户端,其中Autonomous Proxy表示自己客户端控制的角色,可以获得玩家的输入,而其他的角色在该客户端都是模拟的,所以是Simulated Proxy。

在Actor的复制中,如果Role是ROLE_Authority, RemoteRole是ROLE_SimulatedProxy 或ROLE_AutonomousProxy,就说明这个引擎实例负责将此actor复制到远程连接。就目前而言,只有服务器能够向已连接的客户端同步Actor(客户端永远都不能向服务器同步)。始终记住这一点,只有服务器才能看到RoleROLE_Authority和RemoteRole == ROLE_SimulatedProxy或者ROLE_AutonomousProxy。

UE4网络模块解析(一)的更多相关文章

  1. UE4 的json读写方式

    转自:http://blog.csdn.net/cartzhang/article/details/41009343 JSON 的解析有很多开源库.UE4的JSON使用在代码的Public->S ...

  2. UE4的JSON读写方式<二>

    声明:所有权利保留. 转载必须说明出处:http://blog.csdn.net/cartzhang/article/details/43794409 Json的Writer博客地址: http:// ...

  3. Android App 架构演变

    文:https://www.jianshu.com/p/ce26e7960926 最近App项目(MVC架构)越做越大,协同开发效率较低,维护困难,所以产生了调整架构的想法,在 简书.csdn.知乎上 ...

  4. Poco库网络模块例子解析1-------字典查询

    Poco的网络模块在Poco::Net名字空间下定义   下面是字典例子解析 #include "Poco/Net/StreamSocket.h" //流式套接字 #include ...

  5. Android xUtils3源代码解析之网络模块

    本文已授权微信公众号<非著名程序猿>原创首发,转载请务必注明出处. xUtils3源代码解析系列 一. Android xUtils3源代码解析之网络模块 二. Android xUtil ...

  6. [UE4]解析json数据

    正常的json对象是可以使用单引号的,但是在UE4中的json解析,不能如下使用单引号: {‘name’:'张三'} 而是要使用双引号写成: {"name":"张三&qu ...

  7. UE4命令行参数解析

    转自:https://blog.csdn.net/u012999985/article/details/53544389 一 .命令行参数简述命令行参数是一连串的关键字字符串,当运行可执行文件时可以通 ...

  8. UE4 WCF RestFul 服务器 读取JSON 数据并解析 简单实例

    Note:不知道为什么通过Txt读取的JsonString,如果TXT 不是ANSI编码的话,会报JsonArrayStringToUStruct  Unable to parse. bool UWg ...

  9. Poco C++库网络模块例子解析2-------HttpServer

    //下面程序取自 Poco 库的Net模块例子----HTTPServer 下面开始解析代码 #include "Poco/Net/HTTPServer.h" //继承自TCPSe ...

随机推荐

  1. 开源一个由.netcore/.net framework4.6开发的saas微商城+独立部署版本微小程序商城

    一.项目介绍 开源一款基于.NET4.6开发的一款完整的微信商城SAAS平台,前端支持小程序.h5,由前端商城,商户管理后台,平台管理后台三大块组成,sass功能完善,支持商户拖拽式零代码创建并提交上 ...

  2. 【ASP.NET Core】体验一下 Mini Web API

    在上一篇水文中,老周给大伙伴们简单演示了通过 Socket 编程的方式控制 MPD (在树莓派上).按照计划,老周还想给大伙伴们演示一下使用 Web API 来封装对 MPD 控制.思路很 Easy, ...

  3. Centos8 Docker部署ElasticSearch集群

    ELK部署 部署ElasticSearch集群 1.拉取镜像及批量生成配置文件 # 拉取镜像 [root@VM-24-9-centos ~]# docker pull elasticsearch:7. ...

  4. [loj2504]小H爱染色

    以下考虑直接对所有$F(A)$求和,并给出两种做法-- 做法1: 枚举答案$A$,对应方案数为${n-A\choose m}^{2}-{n-A-1\choose m}^{2}$,即答案为$\sum_{ ...

  5. 第05章 MySQL排序与分页

    第05章 MySQL排序与分页 1. 排序数据 1.1 排序规则 使用 ORDER BY 子句排序 ASC(ascend): 升序 DESC(descend):降序 ORDER BY 子句在SELEC ...

  6. 国内首家!腾讯云正式成为 FinOps 基金会顶级会员

    11月24日,腾讯云正式宣布加入FinOps基金会,作为国内首家FinOps基金会顶级会员,腾讯云将联合FinOps基金会,全面推进对FinOps标准和最佳实践的贡献,为企业提供云财务管理的最佳解决方 ...

  7. final关键字、抽象类、抽象类和接口的区别

    1.final关键字 1.1.final修饰的类无法继承. 1.2.final修饰的方法无法覆盖. 1.3.final修饰的变量只能赋一次值. 1.4.final修饰的引用一旦指向某个对象,则不能再重 ...

  8. P7708「Wdsr-2.7」八云蓝自动机 Ⅰ

    *X. P7708「Wdsr-2.7」八云蓝自动机 Ⅰ. 摘自 分治与根号数据结构学习笔记 第三部分 莫队 例题 X.. 一道莫队好题.私以为本题最有价值的地方在于对单点修改的转化以及对交换两个数的处 ...

  9. 解决install_github安装R包时无法打开(cannot open)URL?

    最近安装github上的R包,经常显示Error in utils::download.file(url, path, method = method, quiet = quiet, : 无法打开UR ...

  10. ubuntu终端颜色快速配置

    ubuntu终端颜色快速配置 根据以下step步骤设置即可 step1:备份:cp ~/.bashrc ~/.bashrc.backup step2:打开文件:vim ~/.bashrc step3: ...