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 ...
随机推荐
- 菜鸡的Java笔记 第十二 - java 构造方法与匿名对象
1.点 构造方法的作用以及定义要求 匿名对象的使用 构造方法: 只要出现()的都表示方法 构造方法就是类构造对象时调用的方法,主要用来实例化对象.> ...
- Python介绍和安装
python介绍和安装 目录 python介绍和安装 1. Python简介 2. 解释器 2.1 Python解释器的种类 2.2 Python解释器版本 3. Windows下安装Python 3 ...
- 多线程合集(二)---异步的那些事,async和await原理抛析
引言 在c#中,异步的async和await原理,以及运行机制,可以说是老生常谈,经常在各个群里看到有在讨论这个的,而且网上看到的也只是对异步状态机的一些讲解,甚至很多人说异步状态机的时候,他们说的是 ...
- 百胜中国使用Rainbond实现云原生落地的实践
百胜中国使用Rainbond实现云原生落地的实践 关于百胜中国 自从1987年第一家餐厅开业以来,截至2021年第二季度,百胜中国在中国大陆的足迹遍布所有省市自治区,在1500多座城镇经营着11023 ...
- ROS机器人开发实践1->SSH远程登录要点记录
1.有线网卡 设置 找到有线网络,点击设置,修改其中的IPv4的地址和子网掩码. 1 //地址 2 192.168.xxx.xxx 3 //子网掩码 4 255.255.255.0 点击应用 2.配置 ...
- 十行HTML实现增强现实--思途青岛
你想通过网络实现增强现实吗?现在你只需要 10 行 HTML 代码!真的!让我带你看一看代码,非常简单.我们最近发布了AR.js.你不需要安装任何应用,用你的手机通过网络就能体验到强大的增强现实.但让 ...
- [NOIP2017 提高组] 逛公园
考虑先做一个\(dp\),考虑正反建图,然后按0边拓扑,然后按1到这里的最小距离排序,然后扩展这个\(f_{i,j}\),即多了\(j\)的代价的方案数.
- ZROI 2019 暑期游记
ZROI 游记 在自闭中度过了17天 挖了无数坑,填了一点坑 所以还是有好多坑啊zblzbl 挖坑总集: 时间分治 差分约束 Prufer序列 容斥 树上数据结构 例题C (和后面的例题) 点分 最大 ...
- Kruskal 重构树小记
其实也不是多难的知识点吧--学了一个中午+半个下午就把它学会了(做过那道 jxd 作业 CF571D 的应该比较好理解) Kruskal 重构树大概就是在正常 Kruskal 的时候,对于两个需要连边 ...
- CF1202E You Are Given Some Strings...
题目传送门. 题意简述:给出 \(t\) 与 \(s_{1,2,\cdots,n}\).求对于所有 \(i,j\in[1,n]\),\(s_i+s_j\) 在 \(t\) 中出现次数之和. 如果只有 ...