UE4网络模块解析(一)
一、 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网络模块解析(一)的更多相关文章
- UE4 的json读写方式
转自:http://blog.csdn.net/cartzhang/article/details/41009343 JSON 的解析有很多开源库.UE4的JSON使用在代码的Public->S ...
- UE4的JSON读写方式<二>
声明:所有权利保留. 转载必须说明出处:http://blog.csdn.net/cartzhang/article/details/43794409 Json的Writer博客地址: http:// ...
- Android App 架构演变
文:https://www.jianshu.com/p/ce26e7960926 最近App项目(MVC架构)越做越大,协同开发效率较低,维护困难,所以产生了调整架构的想法,在 简书.csdn.知乎上 ...
- Poco库网络模块例子解析1-------字典查询
Poco的网络模块在Poco::Net名字空间下定义 下面是字典例子解析 #include "Poco/Net/StreamSocket.h" //流式套接字 #include ...
- Android xUtils3源代码解析之网络模块
本文已授权微信公众号<非著名程序猿>原创首发,转载请务必注明出处. xUtils3源代码解析系列 一. Android xUtils3源代码解析之网络模块 二. Android xUtil ...
- [UE4]解析json数据
正常的json对象是可以使用单引号的,但是在UE4中的json解析,不能如下使用单引号: {‘name’:'张三'} 而是要使用双引号写成: {"name":"张三&qu ...
- UE4命令行参数解析
转自:https://blog.csdn.net/u012999985/article/details/53544389 一 .命令行参数简述命令行参数是一连串的关键字字符串,当运行可执行文件时可以通 ...
- UE4 WCF RestFul 服务器 读取JSON 数据并解析 简单实例
Note:不知道为什么通过Txt读取的JsonString,如果TXT 不是ANSI编码的话,会报JsonArrayStringToUStruct Unable to parse. bool UWg ...
- Poco C++库网络模块例子解析2-------HttpServer
//下面程序取自 Poco 库的Net模块例子----HTTPServer 下面开始解析代码 #include "Poco/Net/HTTPServer.h" //继承自TCPSe ...
随机推荐
- 『学了就忘』Linux软件包管理 — 43、RPM包的校验和证书
目录 1.RPM包的校验 (1)RPM包校验基本命令 (2)校验某个系统文件是否被修改举例 (3)验证内容中8个信息的具体内容 (4)文件类型有哪些 2.RPM包的证书 (1)数字证书 (2)数字证书 ...
- 小程序嵌套H5的方式和技巧(一)
文章内多次使用了关键字"壳",首先先解释一下什么是壳 壳: 小程序由原生的web-view组件形成的页面,页面只包含技术逻辑(如打开H5页面),不包含具体业务接口请求和业务逻辑处理 ...
- lilypond 进阶—— 用scheme画图
lilypond的许多底层设定是通过scheme语言写的,特别是要写函数的时候. 所以了解一下scheme的作用很重要. 不幸的是,不像lilypond本身的代码,scheme代码的结果是不会直接预览 ...
- 『学了就忘』Linux权限管理 — 54、sudo授权
目录 1.什么是sudo授权 2. sudo授权说明 3.sudo命令的使用 示例1 示例2 示例3 1.什么是sudo授权 在Linux系统中,/sbin/和/usr/sbin/两个目录中的命令只有 ...
- AGC050B Three Coins
做的时候有思考到是否能转化成移动点问题,但是没有清晰的把他解释出来. NOIP的时候也一样,T3也有考虑到是否能转为差分,但是也没有清晰的写出来. 自己做题的时候应尽量保证草稿纸和思绪的清晰,而不是在 ...
- 【虚树学习笔记([SDOI2011]消耗战)】
题意 [SDOI2011]消耗战 想法 首先我们可以很自然的想到怎么在整棵树上进行求解\(DP\) 很简单 每个点有两个选择 要么对其子树的关键点递归求解 要么自己断开 当然断开的\(cost\)为其 ...
- FJD1T1
在考场上因为一些原因,系统编译不了. 于是在最后\(1h\)把\(T3\)得重打一遍,所以这题的暴力没有写完. 不过也确实很蠢,没想到做法. 考虑搜索原串中的字母的对应取值,然后计算出结果的柿子. 考 ...
- Codeforces 453E - Little Pony and Lord Tirek(二维线段树+ODT)
Codeforces 题目传送门 & 洛谷题目传送门 一道难度 *3100 的 DS,而且被我自己搞出来了! 不过我终究还是技不如人,因为这是一个 \(n\log^2n\) + 大常数的辣鸡做 ...
- 错误笔记: Could not get lock /var/lib/dpkg/lock - open (11: Resource temporarily unavailable) E: Unable to lock the administration di
亲测可用 --jack alexander@alexander-virtual-machine:~$ sudo apt-get install -y httpdE: Could not get loc ...
- ansible-playbook 编译安装nginx
mkdir /etc/ansible/roles/nginx/{files,templates,tasks,handlers,vars,default,meta} -pv └── nginx ├── ...