目录

1.客户端-服务器模型

2.网络模式

3.Replicate

4.远程过程调用(RPC)


多人联机需要在大量客户端同步大量数据,怎样传输用户之间的数据十分重要,虚幻引擎中,在客户端与服务器间同步数据和调用程序的过程被称为 复制(Replication) 

参考了虚幻官方文档-网络概述:https://docs.unrealengine.com/5.0/zh-CN/networking-overview-for-unreal-engine/

1.客户端-服务器模型

在网络多人游戏中,虚幻引擎使用 客户端-服务器 模型。网络中的一台计算机作为 服务器 主持多人游戏会话,而所有其他玩家的计算机作为 客户端 连接到该服务器。然后,服务器与连接的客户端分享游戏状态信息,并提供一种客户端之间通信的方法。

服务器作为游戏主机,保留一个真实 授权 的游戏状态。换句话说,服务器是多人游戏实际发生的地方。客户端会远程控制其在服务器上各自拥有的 Pawn,发送过程调用以使其执行游戏操作。但服务器不会将视觉效果直接流送至客户端显示器。服务器会将游戏状态信息 复制 到各客户端,告知应存在的Actor、此类Actor的行为,以及不同变量应拥有的值。然后各客户端使用此信息,对服务器上正在发生的情况进行高度模拟。

作为服务器的计算机处理所有游戏信息与逻辑,然后分发给所有客户端进行渲染,例如:A,B,C通过网络联机,A想要操控屏幕上的角色捡起一把大宝剑,于是A操作了相应键盘和鼠标,这时,按键信息将传递给服务器,服务器再将信息传递给A,B,C,这样A,B,C都能看见A控制的角色拿起一把大宝剑。

2.网络模式

独立(standalone):游戏作为服务器运行,不接受远程客户端连接

客户端(client):游戏作为客户端运行,不运行服务器逻辑

监听服务器(listener-server):游戏玩家之一的计算机充当主持多人会话的服务器

专属服务器(dedicated-server):一台专用计算机充当服务器

拥有游戏副本的用户均可启动聆听服务器并在同一计算机上运行,因此聆听服务器对于用户而言较易自发设置。支持聆听服务器的游戏通常拥有游戏UI,用于启动服务器或搜索要加入的服务器。但由于主持聆听服务器的玩家会直接在服务器上游戏,因此比其他必须使用网络连接方可游戏的玩家更具优势,于是便导致了公平和作弊问题。

同时,要作为服务器运行,还需支持如图形和音效等玩家相关系统,从而引发额外处理负载。此类因素导致聆听服务器不适用于激烈的竞技或网络负载极高的游戏,但对于小型玩家群体间进行临时合作和竞技多人游戏而言,却十分好用。

3.Replicate

创建、销毁和移动等常见功能会自动复制,但其他部分不会默认自动复制,需要手动定义

通过UPROPERTY宏可以定义变量为复制变量,将自动复制此变量

 // 在类声明中定义变量UPROPERTY( replicated )AActor * MyActor;

接着还需定义GetLifetimeReplicatedProps函数

// 重写父类虚函数
virtual void GetLifetimeReplicatedProps(TArray<FLifetimeProperty>& OutLifetimeProps)const override
void MyClass::GetLifetimeReplicatedProps( TArray< FLifetimeProperty > & OutLifetimeProps ) const
{DOREPLIFETIME(AActor, MyActor );
}

别忘了将bReplicate设置为true(在构造函数和蓝图中设置)

bReplicates = true;

4.远程过程调用(RPC)

使用示例:

ExampleClass.h

// 服务器RPC MyFunction的声明。
UFUNCTION(Server, Reliable)
void MyFunction(int myInt);

ExampleClass.cpp

// 服务器RPC MyFunction的实现。
// 注意函数实现要在名字后面加_Implementation
void AExampleClass::MyFunction_Implementation(int myInt)
{// 此函数在RPC传播后被调用// 游戏代码在此。
}

RPC在服务器和客户端的调用效果不同,具体如下

至于UFUNCTION()中还要加一个Reliable,我也不知道为啥qwq,虚幻官方这样说

可靠性

必须将RPC指定为 可靠 或 不可靠。在蓝图中,函数和事件默认为不可靠。要将函数指定为可靠,将细节面板(Details Panel)中的 可靠(Reliable) 设置设为 true。在C++中,必须将 Reliable 或 Unreliable 说明符作为 ServerClient 或 NetMulticast 函数,添加到RPC的 UFUNCTION 宏及其状态。

不可靠RPC无法保证必会到达预定目的地,但其发送速度和频率高于可靠的RPC。其最适用于对gameplay而言不重要或经常调用的函数。例如,由于Actor移动每帧都可能变换,因此使用不可靠RPC复制该Actor移动。

可靠的RPC保证到达预定目的地,并在成功接收之前一直保留在队列中。其最适合用于对gameplay很关键或者不经常调用的函数。相关例子包括碰撞事件、武器发射的开始或结束,或生成Actor。

UE5 C++原创教系列程随缘更新中 ---

UE5 C++教程(三、多人游戏网络基础)相关推荐

  1. Docker教程(三) Docker网络访问和数据管理

    Docker教程(三) Docker网络访问和数据管理 本文链接:https://blog.csdn.net/yuan_xw/article/details/77504077 Docker教程(三) ...

  2. Linux命令入门教程(三):文件基础篇

    3.1 文件基础介绍 Linux系统的一个重要思想:一切皆文件. 在Linux中,一个普通文件如.txt文本是一个文件,一个压缩包是一个文件,一个设备也是一个文件. Linux中文件的后缀名并不重要, ...

  3. Nmap扫描教程之网络基础服务DHCP服务类

    Nmap扫描教程之网络基础服务DHCP服务类 Nmap网络基础服务 网络基础服务是网络正常工作的基石,常见的网络基础服务包括DHCP服务和DNS服务.其中,DHCP服务用来为计算机动态分配IP地址:D ...

  4. 区块链教程(三):Solidity编程基础

    注:本教程为技术教程,不谈论且不涉及炒作任何数字货币 区块连教程(一):前置知识-linux补充 区块链教程(二):基础概念介绍 区块链教程(三):Solidity编程基础 区块链教程(四):搭建私链 ...

  5. Android基础入门教程——7.6.1 Socket学习网络基础准备

    Android基础入门教程--7.6.1 Socket学习网络基础准备 标签(空格分隔): Android基础入门教程 本节引言: 为了照顾没学过Java Socket的初学者,或者说捋一捋Andro ...

  6. 视频教程-SEM实战教程(三)-网络营销

    SEM实战教程(三) 毕业于中国人民大学,从事网络营销推广多年,网络营销讲师,有丰富的SEM.微博微信营销培训经验,多年的网络营销实战派研究者,操作过医疗集团.出国留学.教育培训等推广项目,现专注SE ...

  7. 计算机网络第三章知识网络,计算机基础教案第三章计算机网络基础知识教案

    计算机 基础 教案 一.网络基础知识 1.计算机网络的概念 计算机网络是指将分布在不同地理位置的具有独立功能的多台计算机用通信设备连接起来,并配以相应的网络软件,以实现信息传递和资源共享. 计算机网络 ...

  8. 负载均衡原理与实践详解 第三篇 服务器负载均衡的基本概念-网络基础

    负载均衡原理与实践详解 第三篇 服务器负载均衡的基本概念-网络基础 系列文章: 负载均衡详解第一篇:负载均衡的需求 负载均衡详解第二篇:服务器负载均衡的基本概念-网络基础 负载均衡详解第三篇:服务器负 ...

  9. 软考 程序员教程-第三章 数据库基础知识

    软考 程序员教程-第三章 数据库基础知识 第三章 数据库基础知识 3.1 基本概念 数据库系统(DataBase System,DBS)由数据库(DataBase,DB).硬件.软件和人员4大部分组成 ...

  10. 在线安装计算机应用软件,计算机应用与网络基础教程 常用软件安装new.ppt

    计算机应用与网络基础教程 常用软件安装new.ppt [内容提示] 两者的区别是,"选项1"是将压缩文件直接解压,里面包含的所有文件都分布在当前目录,导致文件散乱,不便于管理,如中 ...

最新文章

  1. C++ 中NULL 和 nullptr 的区别
  2. Django REST framework API 指南(2):响应
  3. android 闪烁发光动画,androidview动画发光效果在imageview上
  4. c语言理解参数,c语言中对可变参数列表的简单理解
  5. PHP操作使用Redis
  6. java面试题十二 String返回类型
  7. 字符串常量池StringTable 你真的了解么
  8. Linux Shell脚本专栏_Linux系统发送告警邮件脚本_02
  9. Spring实战-雇员薪资管理系统
  10. hbase权威指南学习笔记
  11. JavaWeb学习(较全较简)
  12. 疫情让鲸类暂时远离了人工噪声,但在这之前,它们已被打扰了一百多年
  13. PHP用GD库实现简单的验证码
  14. Gazebo models / Gazebo Error [Node.cc:90] No namespace found
  15. edge浏览器internet选项的设置方法
  16. mars java创业_Mars-java
  17. 你知道bat是什么意思吗?
  18. 函数间断点类型及其判别方法
  19. 用python爬取交大图书馆图书信息
  20. ML - Regression

热门文章

  1. rpg人物制作软件_RPG制作大师下载_RPG制作大师官方下载-太平洋下载中心
  2. 「HenCoder Plus」Android 高级培养计划 FAQ
  3. Datalogic DS2100
  4. MySQL存储过程和函数的区别
  5. python实现图片拼接长图_用Python实现长截图拼接
  6. 客户端js 读取 json 数据
  7. MATLAB QPSK调制代码
  8. 信号与系统—傅里叶级数
  9. BT601 BT656 BT709 BT1120 解析
  10. python黑马程序员课后答案_黑马程序员Python教程[Python标准库(一)