【UE 网络】专用服务器和多个客户端加入游戏会话的过程,以及GameMode、PlayerController、Pawn的创建流程
目录
- 0 引言
- 1 多人游戏会话
- 1.1 Why?为什么要有这个
- 1.2 How?怎么使用?
- 2 加入游戏会话的流程
- 总结

- 🙋♂️ 作者:海码007
- 📜 专栏:UE虚幻引擎专栏
- 💥 标题:【UE 网络】在网络多人游戏中,客户端和服务器加入游戏会话的过程
- ❣️ 寄语:书到用时方恨少,事非经过不知难!
- 🎈 最后:文章作者技术和水平有限,如果文中出现错误,希望大家能指正,同时有问题的话,欢迎大家留言讨论。
0 引言
理解服务器和客户端是如果加载到一个游戏会话,有助于网络开发。
1 多人游戏会话
1.1 Why?为什么要有这个
游戏会话(Session)的概念在多人游戏中起到了至关重要的作用。它不仅帮助玩家找到并加入游戏,还确保了游戏的状态同步、资源管理、安全性和稳定性等。通过会话管理系统,开发者可以更容易地实现复杂的多人游戏功能,提供更好的游戏体验。
1.2 How?怎么使用?
在开发多人网络游戏时,使用游戏会话(Session)是非常常见且必要的。游戏会话帮助管理玩家的连接、匹配、游戏状态同步等多个方面,使得多人游戏的开发和运行更加顺畅。以下是如何在开发过程中使用游戏会话的详细步骤和示例。
- 选择合适的在线子系统(Online Subsystem)
Unreal Engine(UE)提供了多种在线子系统(如Steam、Epic Online Services、Xbox Live等),你需要选择一个适合你的游戏需求的子系统。通常在项目设置中配置:
// 在DefaultEngine.ini中配置
[OnlineSubsystem]
DefaultPlatformService=Null // 或者是Steam, EOS等
- 创建游戏会话
创建会话是由服务器或主机发起的,通常包括设置会话参数(如最大玩家数量、游戏模式、地图等)。以下是一个简单的示例:
void AMyGameInstance::CreateGameSession()
{IOnlineSubsystem* OnlineSubsystem = IOnlineSubsystem::Get();if (OnlineSubsystem){IOnlineSessionPtr Sessions = OnlineSubsystem->GetSessionInterface();if (Sessions.IsValid()){FOnlineSessionSettings SessionSettings;SessionSettings.bIsLANMatch = true;SessionSettings.NumPublicConnections = 4;SessionSettings.bShouldAdvertise = true;SessionSettings.bUsesPresence = true;Sessions->CreateSession(0, NAME_GameSession, SessionSettings);}}
}
- 查找游戏会话
客户端需要查找可用的会话以便加入游戏。以下是查找会话的示例:
void AMyGameInstance::FindGameSessions()
{IOnlineSubsystem* OnlineSubsystem = IOnlineSubsystem::Get();if (OnlineSubsystem){IOnlineSessionPtr Sessions = OnlineSubsystem->GetSessionInterface();if (Sessions.IsValid()){TSharedRef<FOnlineSessionSearch> SessionSearch = MakeShareable(new FOnlineSessionSearch());SessionSearch->bIsLanQuery = true;SessionSearch->MaxSearchResults = 10;SessionSearch->PingBucketSize = 50;Sessions->FindSessions(0, SessionSearch);}}
}
- 加入游戏会话
客户端选择一个会话并发送加入请求。以下是加入会话的示例:
void AMyGameInstance::JoinGameSession()
{IOnlineSubsystem* OnlineSubsystem = IOnlineSubsystem::Get();if (OnlineSubsystem){IOnlineSessionPtr Sessions = OnlineSubsystem->GetSessionInterface();if (Sessions.IsValid()){FOnlineSessionSearchResult SearchResult;// 假设已经找到一个有效的会话Sessions->JoinSession(0, NAME_GameSession, SearchResult);}}
}
- 销毁游戏会话
当游戏结束或需要关闭会话时,服务器或主机可以销毁会话。以下是销毁会话的示例:
void AMyGameInstance::DestroyGameSession()
{IOnlineSubsystem* OnlineSubsystem = IOnlineSubsystem::Get();if (OnlineSubsystem){IOnlineSessionPtr Sessions = OnlineSubsystem->GetSessionInterface();if (Sessions.IsValid()){Sessions->DestroySession(NAME_GameSession);}}
}
- 处理会话事件
在实际开发中,你还需要处理各种会话事件(如会话创建成功、查找会话完成、加入会话成功等)。这些事件通常通过委托(Delegate)来处理:
void AMyGameInstance::OnCreateSessionComplete(FName SessionName, bool bWasSuccessful)
{// 处理会话创建完成的逻辑
}void AMyGameInstance::OnFindSessionsComplete(bool bWasSuccessful)
{// 处理查找会话完成的逻辑
}void AMyGameInstance::OnJoinSessionComplete(FName SessionName, EOnJoinSessionCompleteResult::Type Result)
{// 处理加入会话完成的逻辑
}
- 配置和调试
确保在项目设置中正确配置了在线子系统,并在开发过程中进行充分的测试和调试。你可以使用UE的日志系统来记录和调试会话管理的各个步骤。
总结:在开发多人网络游戏时,使用游戏会话是管理玩家连接、匹配、游戏状态同步等的重要手段。通过选择合适的在线子系统,创建、查找、加入和销毁会话,并处理相关事件,你可以实现一个功能完善的多人游戏系统。
2 加入游戏会话的流程
在专用服务器模式下,服务器和客户端的启动和连接过程,以及GameMode、PlayerController、Pawn的网络同步创建,是多人游戏开发中的关键部分。以下是详细的步骤和流程:
- 启动专用服务器
专用服务器通常在命令行或脚本中启动。以下是启动专用服务器的命令示例:
UE4Editor.exe YourProjectName -server -log
或者通过打包后的可执行文件启动:
YourProjectNameServer.exe YourMapName?listen -log
- 客户端加入游戏会话
客户端需要连接到专用服务器。你可以在游戏逻辑中实现连接功能,例如在主菜单中添加一个按钮来连接到服务器:
void UMyMainMenuWidget::OnJoinServerButtonClicked()
{UMyGameInstance* GameInstance = Cast<UMyGameInstance>(GetGameInstance());if (GameInstance){GameInstance->FindGameSessions();}
}
在找到会话后,客户端可以通过以下命令连接到服务器:
void UMyGameInstance::JoinGameSession()
{if (SessionInterface.IsValid() && SessionSearch.IsValid()){for (const FOnlineSessionSearchResult& SearchResult : SessionSearch->SearchResults){if (SearchResult.IsValid()){SessionInterface->JoinSession(0, NAME_GameSession, SearchResult);break;}}}
}
- GameMode、PlayerController、Pawn的网络同步创建
在专用服务器模式下,GameMode、PlayerController、Pawn的创建和同步是通过UE的网络框架自动处理的。以下是详细的流程:
GameMode
- 服务器端创建:当服务器启动并加载地图时,GameMode在服务器端创建。GameMode只存在于服务器端,不会在客户端创建。
- 管理游戏规则:GameMode负责管理游戏规则、玩家连接、关卡切换等。
PlayerController
- 客户端请求连接:当客户端请求连接到服务器时,服务器会为每个连接的客户端创建一个PlayerController。
- 服务器端创建:服务器在接收到客户端的连接请求后,调用
APlayerController::ClientTravel来通知客户端进行地图加载和PlayerController的创建。 - 客户端同步:客户端在接收到服务器的通知后,同步创建PlayerController。
Pawn
- 服务器端创建:当PlayerController在服务器端创建后,服务器会根据GameMode的设置为每个PlayerController生成一个Pawn。
- 客户端同步:服务器生成的Pawn会通过网络同步到客户端。客户端会创建一个与服务器端Pawn对应的代理(Replicated Proxy)。
- 控制权:PlayerController在客户端控制Pawn的移动和操作,服务器会同步这些操作给其他客户端。
总结
在专用服务器模式下,服务器和客户端的启动和连接过程,以及GameMode、PlayerController、Pawn的网络同步创建,是通过UE4的网络框架自动处理的。服务器负责创建和管理GameMode、PlayerController和Pawn,并通过属性复制和RPC机制将这些对象的状态和操作同步到客户端。客户端则根据服务器的指令同步创建和更新这些对象,从而实现一致的游戏体验。
相关文章:
【UE 网络】专用服务器和多个客户端加入游戏会话的过程,以及GameMode、PlayerController、Pawn的创建流程
目录 0 引言1 多人游戏会话1.1 Why?为什么要有这个1.2 How?怎么使用? 2 加入游戏会话的流程总结 🙋♂️ 作者:海码007📜 专栏:UE虚幻引擎专栏💥 标题:【UE 网络】在网络…...
磁盘分区工具(fdisk 和 parted)区别及操作笔记
fdisk 和 parted 都是 Linux 系统中用于磁盘分区的工具。 两者主要区别: 支持的分区表类型: fdisk 主要支持 MBR分区表,MBR分区表支持的硬盘单个分区最大容量为2TB,最多可以有4个主分区。parted 支持 MBR分区表 和 GPT分区表&…...
VisualStudio2019受支持的.NET Core
1.VS Studio2019受支持的.NET Core? 适用于 Visual Studio 的 .NET SDK 下载 (microsoft.com) Visual Studio 2019 默认并不直接支持 .NET 6 及以上版本。要使用 .NET 6 或更高版本,你需要在 Visual Studio 2019 中采取额外步骤,比如安装相应…...
Java——IO流(二)-(1/7):字符流-FileReader、FileWriter、字符输出流的注意事项(构造器及常用方法、小结)
目录 文件字符输入流-读字符数据进来 介绍 构造器及常用方法 实例演示 文件字符输出流-写字符数据出去 介绍、构造器及常用方法 实例演示 字符输出流使用时的注意事项 小结 文件字符输入流-读字符数据进来 介绍 FileReader(文件字符输入流) 作…...
Spring循环依赖问题——从源码画流程图
文章目录 关键代码相关知识为什么要使用二级缓存为什么要使用三级缓存只使用两个缓存的问题不能解决构造器循环依赖为什么多例bean不能解决循环依赖问题初始化后代理对象赋值给原始对象解决循环依赖SpringBoot开启循环依赖 循环依赖 在线流程图 关键代码 从缓存中查询getSingl…...
Android SurfaceFlinger——动画播放准备(十五)
BootAnimation 本质上是一个线程,执行 run 之后,会先执行 readyToRun,接着执行 treadLoop 方法。 一、线程启动 1、BootAnimation 源码位置:/frameworks/base/cmds/bootanimation/BootAnimation.cpp readyToRun status_t BootAnimation::readyToRun() {// 添加默认资源…...
Zynq7000系列FPGA中的DMA控制器简介(二)
AXI互连上的DMA传输 所有DMA事务都使用AXI接口在PL中的片上存储器、DDR存储器和从外设之间传递数据。PL中的从设备通过DMAC的外部请求接口与DMAC通信,以控制数据流。这意味着从设备可以请求DMA交易,以便将数据从源地址传输到目标地址。 虽然DMAC在技术…...
获取 url 地址栏 ? 后面的查询字符串,并以键值对形式放到对象里面
写在前面 在前端面试当中,关于 url 相关的问题很常见,而对于 url 请求参数的问题也很常见,大部分以笔试题常见,今天就根据这道面试题一起来看一下。 问题 获取 url 地址栏?后面的查询字符串,并以键值对形式放到对象…...
List接口, ArrayList Vector LinkedList
Collection接口的子接口 子类Vector,ArrayList,LinkedList 1.元素的添加顺序和取出顺序一致,且可重复 2.每个元素都有其对应的顺序索引 方法 在index 1 的位置插入一个对象,list.add(1,list2)获取指定index位置的元素&#…...
探讨数字化背景下VSM(价值流程图)的挑战和机遇
在信息化、数字化飞速发展的今天,各行各业都面临着前所未有的挑战与机遇。作为源自丰田生产模式的VSM(价值流程图),这一曾经引领制造业革命的工具,在数字化背景下又将如何乘风破浪,应对新的市场格局和技术变…...
Conda跨平台环境迁移
问题描述: 在一台Ubuntu电脑上完全复刻在Windows中通过conda创建的环境。 导出环境 在Windows机器上,需要导出当前conda环境的配置。这将生成一个environment.yml文件,其中包含所有已安装的包和版本信息。 打开Anaconda Prompt(…...
全面掌握 Jackson 序列化工具:原理、使用与高级配置详解
全面掌握 Jackson 序列化工具:原理、使用与高级配置详解 Jackson 是一个功能强大的 JSON 处理库,广泛应用于 Java 项目中。它提供了丰富的功能和灵活的配置选项,可以轻松地在 Java 对象和 JSON 数据之间进行转换。本文将详细介绍 Jackson 的…...
mathtype7.4永久激活码密钥及2024最新破解版注册码附安装教程
MathType 7版本号还提升了对教育行业的支持,如增加了大量预定义的教学公式和符号,使老师和学生在教学过程中能够更加便捷的应用。同时,它还加强了云备份功能,用户可将自己的公式存储在云端,随时随地访问和编辑…...
【SQL】优化慢 SQL的简单思路
优化慢 SQL 需要综合考虑多个方面,包括查询的结构、索引的使用、表结构设计等。以下是一些常见的 SQL 优化技巧和步骤: 1. 检查查询计划 使用数据库提供的工具查看查询计划(例如 MySQL 的 EXPLAIN 命令)可以帮助了解查询的执行路…...
禁止浏览器对input的自动填充和填充提示(适用于谷歌、火狐、Edge(原IE浏览器)等常见浏览器)
目录 1.要解决的问题2.一技能:原生属性,小试牛刀3.二技能:傀儡input,瞒天过海4.三技能:JavaScript出击,直接开大5.九九八十一难,永远还有最后一难 写在前面: 如有转载,务…...
鸿蒙项目实战-月木学途:1.编写首页,包括搜索栏、轮播图、宫格
效果展示 搜索栏制作 相关知识回顾 输入框组件TextInput 单行输入框类型.type(InputType.Normal)//基本输入框.type(InputType.Password)//密码.type(InputType.Email)//邮箱.type(InputType.Number)//数字.type(InputType.PhoneNumber)//电话号.type(InputType.Normal).type…...
深入浅出:npm常用命令详解和实践
npm 是 Node.js 的包管理器,用于管理 Node.js 应用的依赖关系和版本。 以下是一些常用的 npm 命令: npm init: 命令用于初始化一个新的 Node.js 项目。它会创建一个 package.json 文件,这个文件包含了项目的元数据和依赖信息。 npm initnpm…...
山东大学-科技文献阅读与翻译(期末复习)(选择题+翻译)
目录 选择题 Chapter1 1.which of the following is not categorized as scientific literature 2.Which of the followings is defined as tertiary(三级文献) literature? 3.Which type of the following international conferences is listed as Number one conference…...
二分查找:自定义 upper_bound、lower_bound
二分查找详细介绍可以看这篇文章,此篇文章介绍返回索引的 upper_bound 和 lower_bound 的 C 实现。 lower_bound 实现代码 #include <vector>int lower_bound_index(const std::vector<int>& vec, const int& target) {int left 0;int right…...
Java 搭建个人博客基本框架
为了实现一个功能完善的个人博客系统,我们将使用Spring Boot作为框架,MySQL作为数据库,并引入Spring Security来处理用户认证和授权。以下是系统的详细设计和实现步骤: ## 项目结构 - src/main/java/com/blog - controller …...
FFmpeg 低延迟同屏方案
引言 在实时互动需求激增的当下,无论是在线教育中的师生同屏演示、远程办公的屏幕共享协作,还是游戏直播的画面实时传输,低延迟同屏已成为保障用户体验的核心指标。FFmpeg 作为一款功能强大的多媒体框架,凭借其灵活的编解码、数据…...
Swift 协议扩展精进之路:解决 CoreData 托管实体子类的类型不匹配问题(下)
概述 在 Swift 开发语言中,各位秃头小码农们可以充分利用语法本身所带来的便利去劈荆斩棘。我们还可以恣意利用泛型、协议关联类型和协议扩展来进一步简化和优化我们复杂的代码需求。 不过,在涉及到多个子类派生于基类进行多态模拟的场景下,…...
1.3 VSCode安装与环境配置
进入网址Visual Studio Code - Code Editing. Redefined下载.deb文件,然后打开终端,进入下载文件夹,键入命令 sudo dpkg -i code_1.100.3-1748872405_amd64.deb 在终端键入命令code即启动vscode 需要安装插件列表 1.Chinese简化 2.ros …...
【JavaWeb】Docker项目部署
引言 之前学习了Linux操作系统的常见命令,在Linux上安装软件,以及如何在Linux上部署一个单体项目,大多数同学都会有相同的感受,那就是麻烦。 核心体现在三点: 命令太多了,记不住 软件安装包名字复杂&…...
10-Oracle 23 ai Vector Search 概述和参数
一、Oracle AI Vector Search 概述 企业和个人都在尝试各种AI,使用客户端或是内部自己搭建集成大模型的终端,加速与大型语言模型(LLM)的结合,同时使用检索增强生成(Retrieval Augmented Generation &#…...
技术栈RabbitMq的介绍和使用
目录 1. 什么是消息队列?2. 消息队列的优点3. RabbitMQ 消息队列概述4. RabbitMQ 安装5. Exchange 四种类型5.1 direct 精准匹配5.2 fanout 广播5.3 topic 正则匹配 6. RabbitMQ 队列模式6.1 简单队列模式6.2 工作队列模式6.3 发布/订阅模式6.4 路由模式6.5 主题模式…...
【Linux】自动化构建-Make/Makefile
前言 上文我们讲到了Linux中的编译器gcc/g 【Linux】编译器gcc/g及其库的详细介绍-CSDN博客 本来我们将一个对于编译来说很重要的工具:make/makfile 1.背景 在一个工程中源文件不计其数,其按类型、功能、模块分别放在若干个目录中,mak…...
SQL Server 触发器调用存储过程实现发送 HTTP 请求
文章目录 需求分析解决第 1 步:前置条件,启用 OLE 自动化方式 1:使用 SQL 实现启用 OLE 自动化方式 2:Sql Server 2005启动OLE自动化方式 3:Sql Server 2008启动OLE自动化第 2 步:创建存储过程第 3 步:创建触发器扩展 - 如何调试?第 1 步:登录 SQL Server 2008第 2 步…...
使用SSE解决获取状态不一致问题
使用SSE解决获取状态不一致问题 1. 问题描述2. SSE介绍2.1 SSE 的工作原理2.2 SSE 的事件格式规范2.3 SSE与其他技术对比2.4 SSE 的优缺点 3. 实战代码 1. 问题描述 目前做的一个功能是上传多个文件,这个上传文件是整体功能的一部分,文件在上传的过程中…...
二维FDTD算法仿真
二维FDTD算法仿真,并带完全匹配层,输入波形为高斯波、平面波 FDTD_二维/FDTD.zip , 6075 FDTD_二维/FDTD_31.m , 1029 FDTD_二维/FDTD_32.m , 2806 FDTD_二维/FDTD_33.m , 3782 FDTD_二维/FDTD_34.m , 4182 FDTD_二维/FDTD_35.m , 4793...
