一、 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. java 邮件 接收与发送

    ... package com.e6soft; import java.io.BufferedReader; import java.io.FileOutputStream; import java. ...

  2. Java 处理表格,真的很爽!

    一个简单又快速的表格处理库 大家好,我是鱼皮. 处理 Excel 表格是开发中经常遇到的需求,比如表格合并.筛选表格中的某些行列.修改单元格数据等. 今天给大家分享一个 Java 处理表格的工具库,不 ...

  3. [bzoj1068]压缩

    用f[i][j][0/1]表示区间[i,j],i之前有没有M的最少需要多少个字符,然后分两种情况:1.可以分为两个,转移到dp[l][mid][0]+1:2.枚举断点,但当前面有M时,后面的这个不能重 ...

  4. Python实战:截图识别文字,过万使用量版本!(附源码!!)

    前人栽树后人乘凉,以不造轮子为由 使用百度的图片识字功能,实现了一个上万次使用量的脚本. 系统:win10 Python版本:python3.8.6 pycharm版本:pycharm 2021.1. ...

  5. HTML四种定位-粘滞定位

    粘滞定位 1 <!DOCTYPE html> 2 <html lang="en"> 3 <head> 4 <meta charset=&q ...

  6. Go语言核心36讲(Go语言实战与应用十八)--学习笔记

    40 | io包中的接口和工具 (上) 我们在前几篇文章中,主要讨论了strings.Builder.strings.Reader和bytes.Buffer这三个数据类型. 知识回顾 还记得吗?当时我 ...

  7. Run For Beer CF575G

    Run for beer CF 575G 如果直接bfs分层贪心可以做,但是很毒瘤,具体可以参考Gavinzheng的提交 考虑魔改dijkstra 首先,每次拿权值最小的来松弛肯定没有问题,只是怎么 ...

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

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

  9. DTOJ 4027:挖煤

    挖煤 [问题描述]众所周知, 小C是挖煤好手.今天他带着他的魔法镐子去挖煤 ,他的镐子一开始有$w$点魔力.他的挖煤 路线 上会依次 经过$n$个地点, 地点, 每个 地点是煤矿或者补给站,设小C当前 ...

  10. [R] read.table/read.delim读入数据行数变少?

    以为对read.table/read.delim很熟了,谁知又掉坑里了. 我有个3万多行的数据集,包括样品表达量和注释信息.大概长这样: 本来3万多行,可是读进来的时候变成了1万多行,而且read.d ...