一、 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. Django 小实例S1 简易学生选课管理系统 2 新建项目(project)并进行设置

    Django 小实例S1 简易学生选课管理系统 第2节--新建项目(project)并进行设置 点击查看教程总目录 作者自我介绍:b站小UP主,时常直播编程+红警三,python1对1辅导老师. 0 ...

  2. webpack--初试webpack( 核心、体验、资源打包)

    前言 webpack是当前前端项目中最常用的资源构建工具,从本文开始,来总结记录一下关于webpack的学习. 正文 1.webpack简介 webpack官网(https://webpack.doc ...

  3. [cf1209E]Rotate Columns

    题意也可以理解为这样一个过程: 对于每一列,将其旋转后选出若干行上的数,要求与之前的行都不同 用$g_{i,S}$表示第$i$列选出的行数集合为$S$的最大和,$f_{i,S}$表示前$i$列$S$中 ...

  4. 掌握Java的内存模型,你就是解决并发问题最靓的仔

    摘要:如果编写的并发程序出现问题时,很难通过调试来解决相应的问题,此时,需要一行行的检查代码,这个时候,如果充分理解并掌握了Java的内存模型,你就能够很快分析并定位出问题所在. 本文分享自华为云社区 ...

  5. ROS机器人开发实践1->SSH远程登录要点记录

    1.有线网卡 设置 找到有线网络,点击设置,修改其中的IPv4的地址和子网掩码. 1 //地址 2 192.168.xxx.xxx 3 //子网掩码 4 255.255.255.0 点击应用 2.配置 ...

  6. CF1592F2 Alice and Recoloring 2

    目前在看贪心/构造/DP 杂题选做,发现一道非常不错的结论题,具有启发意义. 先说明如下结论 结论一:如何怎么样都不会使用二和三操作 证明: 二三操作显然可以通过两次一操作达到,而其操作费用大于两次一 ...

  7. Atcoder Grand Contest 001 F - Wide Swap(拓扑排序)

    Atcoder 题面传送门 & 洛谷题面传送门 咦?鸽子 tzc 来补题解了?奇迹奇迹( 首先考虑什么样的排列可以得到.我们考虑 \(p\) 的逆排列 \(q\),那么每次操作的过程从逆排列的 ...

  8. Atcoder Grand Contest 001E - BBQ Hard(组合意义转化,思维题)

    Atcoder 题面传送门 & 洛谷题面传送门 Yet another 思维题-- 注意到此题 \(n\) 数据范围很大,但是 \(a_i,b_i\) 数据范围很小,这能给我们什么启发呢? 观 ...

  9. matplotlib 画饼图

    有个瑕疵,某一块儿比例过小时,文字会重叠. 1 def pizza(data,labs,title): 2 import matplotlib 3 import matplotlib.pyplot a ...

  10. linux下面升级 Python版本并修改yum属性信息

    最近需要在linux下使用python,故需要升级一下python版本,上网查询了一下相关资料,更新了一下linux下面的python环境,记录如下: linux下面升级 Python版本并修改yum ...