当前位置: 首页 > news >正文

【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)是非常常见且必要的。游戏会话帮助管理玩家的连接、匹配、游戏状态同步等多个方面,使得多人游戏的开发和运行更加顺畅。以下是如何在开发过程中使用游戏会话的详细步骤和示例。

  1. 选择合适的在线子系统(Online Subsystem)

Unreal Engine(UE)提供了多种在线子系统(如Steam、Epic Online Services、Xbox Live等),你需要选择一个适合你的游戏需求的子系统。通常在项目设置中配置:

// 在DefaultEngine.ini中配置
[OnlineSubsystem]
DefaultPlatformService=Null  // 或者是Steam, EOS等
  1. 创建游戏会话

创建会话是由服务器或主机发起的,通常包括设置会话参数(如最大玩家数量、游戏模式、地图等)。以下是一个简单的示例:

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);}}
}
  1. 查找游戏会话

客户端需要查找可用的会话以便加入游戏。以下是查找会话的示例:

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);}}
}
  1. 加入游戏会话

客户端选择一个会话并发送加入请求。以下是加入会话的示例:

void AMyGameInstance::JoinGameSession()
{IOnlineSubsystem* OnlineSubsystem = IOnlineSubsystem::Get();if (OnlineSubsystem){IOnlineSessionPtr Sessions = OnlineSubsystem->GetSessionInterface();if (Sessions.IsValid()){FOnlineSessionSearchResult SearchResult;// 假设已经找到一个有效的会话Sessions->JoinSession(0, NAME_GameSession, SearchResult);}}
}
  1. 销毁游戏会话

当游戏结束或需要关闭会话时,服务器或主机可以销毁会话。以下是销毁会话的示例:

void AMyGameInstance::DestroyGameSession()
{IOnlineSubsystem* OnlineSubsystem = IOnlineSubsystem::Get();if (OnlineSubsystem){IOnlineSessionPtr Sessions = OnlineSubsystem->GetSessionInterface();if (Sessions.IsValid()){Sessions->DestroySession(NAME_GameSession);}}
}
  1. 处理会话事件

在实际开发中,你还需要处理各种会话事件(如会话创建成功、查找会话完成、加入会话成功等)。这些事件通常通过委托(Delegate)来处理:

void AMyGameInstance::OnCreateSessionComplete(FName SessionName, bool bWasSuccessful)
{// 处理会话创建完成的逻辑
}void AMyGameInstance::OnFindSessionsComplete(bool bWasSuccessful)
{// 处理查找会话完成的逻辑
}void AMyGameInstance::OnJoinSessionComplete(FName SessionName, EOnJoinSessionCompleteResult::Type Result)
{// 处理加入会话完成的逻辑
}
  1. 配置和调试

确保在项目设置中正确配置了在线子系统,并在开发过程中进行充分的测试和调试。你可以使用UE的日志系统来记录和调试会话管理的各个步骤。

总结:在开发多人网络游戏时,使用游戏会话是管理玩家连接、匹配、游戏状态同步等的重要手段。通过选择合适的在线子系统,创建、查找、加入和销毁会话,并处理相关事件,你可以实现一个功能完善的多人游戏系统。

2 加入游戏会话的流程

在专用服务器模式下,服务器和客户端的启动和连接过程,以及GameMode、PlayerController、Pawn的网络同步创建,是多人游戏开发中的关键部分。以下是详细的步骤和流程:

  1. 启动专用服务器

专用服务器通常在命令行或脚本中启动。以下是启动专用服务器的命令示例:

UE4Editor.exe YourProjectName -server -log

或者通过打包后的可执行文件启动:

YourProjectNameServer.exe YourMapName?listen -log
  1. 客户端加入游戏会话

客户端需要连接到专用服务器。你可以在游戏逻辑中实现连接功能,例如在主菜单中添加一个按钮来连接到服务器:

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;}}}
}
  1. GameMode、PlayerController、Pawn的网络同步创建

在专用服务器模式下,GameMode、PlayerController、Pawn的创建和同步是通过UE的网络框架自动处理的。以下是详细的流程:
GameMode

  1. 服务器端创建:当服务器启动并加载地图时,GameMode在服务器端创建。GameMode只存在于服务器端,不会在客户端创建。
  2. 管理游戏规则:GameMode负责管理游戏规则、玩家连接、关卡切换等。

PlayerController

  1. 客户端请求连接:当客户端请求连接到服务器时,服务器会为每个连接的客户端创建一个PlayerController。
  2. 服务器端创建:服务器在接收到客户端的连接请求后,调用APlayerController::ClientTravel来通知客户端进行地图加载和PlayerController的创建。
  3. 客户端同步:客户端在接收到服务器的通知后,同步创建PlayerController。

Pawn

  1. 服务器端创建:当PlayerController在服务器端创建后,服务器会根据GameMode的设置为每个PlayerController生成一个Pawn。
  2. 客户端同步:服务器生成的Pawn会通过网络同步到客户端。客户端会创建一个与服务器端Pawn对应的代理(Replicated Proxy)。
  3. 控制权:PlayerController在客户端控制Pawn的移动和操作,服务器会同步这些操作给其他客户端。

总结

在专用服务器模式下,服务器和客户端的启动和连接过程,以及GameMode、PlayerController、Pawn的网络同步创建,是通过UE4的网络框架自动处理的。服务器负责创建和管理GameMode、PlayerController和Pawn,并通过属性复制和RPC机制将这些对象的状态和操作同步到客户端。客户端则根据服务器的指令同步创建和更新这些对象,从而实现一致的游戏体验。

相关文章:

【UE 网络】专用服务器和多个客户端加入游戏会话的过程,以及GameMode、PlayerController、Pawn的创建流程

目录 0 引言1 多人游戏会话1.1 Why&#xff1f;为什么要有这个1.2 How&#xff1f;怎么使用&#xff1f; 2 加入游戏会话的流程总结 &#x1f64b;‍♂️ 作者&#xff1a;海码007&#x1f4dc; 专栏&#xff1a;UE虚幻引擎专栏&#x1f4a5; 标题&#xff1a;【UE 网络】在网络…...

磁盘分区工具(fdisk 和 parted)区别及操作笔记

fdisk 和 parted 都是 Linux 系统中用于磁盘分区的工具。 两者主要区别&#xff1a; 支持的分区表类型&#xff1a; fdisk 主要支持 MBR分区表&#xff0c;MBR分区表支持的硬盘单个分区最大容量为2TB&#xff0c;最多可以有4个主分区。parted 支持 MBR分区表 和 GPT分区表&…...

VisualStudio2019受支持的.NET Core

1.VS Studio2019受支持的.NET Core&#xff1f; 适用于 Visual Studio 的 .NET SDK 下载 (microsoft.com) Visual Studio 2019 默认并不直接支持 .NET 6 及以上版本。要使用 .NET 6 或更高版本&#xff0c;你需要在 Visual Studio 2019 中采取额外步骤&#xff0c;比如安装相应…...

Java——IO流(二)-(1/7):字符流-FileReader、FileWriter、字符输出流的注意事项(构造器及常用方法、小结)

目录 文件字符输入流-读字符数据进来 介绍 构造器及常用方法 实例演示 文件字符输出流-写字符数据出去 介绍、构造器及常用方法 实例演示 字符输出流使用时的注意事项 小结 文件字符输入流-读字符数据进来 介绍 FileReader&#xff08;文件字符输入流&#xff09; 作…...

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通信&#xff0c;以控制数据流。这意味着从设备可以请求DMA交易&#xff0c;以便将数据从源地址传输到目标地址。 虽然DMAC在技术…...

获取 url 地址栏 ? 后面的查询字符串,并以键值对形式放到对象里面

写在前面 在前端面试当中&#xff0c;关于 url 相关的问题很常见&#xff0c;而对于 url 请求参数的问题也很常见&#xff0c;大部分以笔试题常见&#xff0c;今天就根据这道面试题一起来看一下。 问题 获取 url 地址栏?后面的查询字符串&#xff0c;并以键值对形式放到对象…...

List接口, ArrayList Vector LinkedList

Collection接口的子接口 子类Vector&#xff0c;ArrayList&#xff0c;LinkedList 1.元素的添加顺序和取出顺序一致&#xff0c;且可重复 2.每个元素都有其对应的顺序索引 方法 在index 1 的位置插入一个对象&#xff0c;list.add(1,list2)获取指定index位置的元素&#…...

探讨数字化背景下VSM(价值流程图)的挑战和机遇

在信息化、数字化飞速发展的今天&#xff0c;各行各业都面临着前所未有的挑战与机遇。作为源自丰田生产模式的VSM&#xff08;价值流程图&#xff09;&#xff0c;这一曾经引领制造业革命的工具&#xff0c;在数字化背景下又将如何乘风破浪&#xff0c;应对新的市场格局和技术变…...

Conda跨平台环境迁移

问题描述&#xff1a; 在一台Ubuntu电脑上完全复刻在Windows中通过conda创建的环境。 导出环境 在Windows机器上&#xff0c;需要导出当前conda环境的配置。这将生成一个environment.yml文件&#xff0c;其中包含所有已安装的包和版本信息。 打开Anaconda Prompt&#xff08;…...

全面掌握 Jackson 序列化工具:原理、使用与高级配置详解

全面掌握 Jackson 序列化工具&#xff1a;原理、使用与高级配置详解 Jackson 是一个功能强大的 JSON 处理库&#xff0c;广泛应用于 Java 项目中。它提供了丰富的功能和灵活的配置选项&#xff0c;可以轻松地在 Java 对象和 JSON 数据之间进行转换。本文将详细介绍 Jackson 的…...

mathtype7.4永久激活码密钥及2024最新破解版注册码附安装教程

MathType 7版本号还提升了对教育行业的支持&#xff0c;如增加了大量预定义的教学公式和符号&#xff0c;使老师和学生在教学过程中能够更加便捷的应用。同时&#xff0c;它还加强了云备份功能&#xff0c;用户可将自己的公式存储在云端&#xff0c;随时随地访问和编辑&#xf…...

【SQL】优化慢 SQL的简单思路

优化慢 SQL 需要综合考虑多个方面&#xff0c;包括查询的结构、索引的使用、表结构设计等。以下是一些常见的 SQL 优化技巧和步骤&#xff1a; 1. 检查查询计划 使用数据库提供的工具查看查询计划&#xff08;例如 MySQL 的 EXPLAIN 命令&#xff09;可以帮助了解查询的执行路…...

禁止浏览器对input的自动填充和填充提示(适用于谷歌、火狐、Edge(原IE浏览器)等常见浏览器)

目录 1.要解决的问题2.一技能&#xff1a;原生属性&#xff0c;小试牛刀3.二技能&#xff1a;傀儡input&#xff0c;瞒天过海4.三技能&#xff1a;JavaScript出击&#xff0c;直接开大5.九九八十一难&#xff0c;永远还有最后一难 写在前面&#xff1a; 如有转载&#xff0c;务…...

鸿蒙项目实战-月木学途: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 的包管理器&#xff0c;用于管理 Node.js 应用的依赖关系和版本。 以下是一些常用的 npm 命令&#xff1a; npm init: 命令用于初始化一个新的 Node.js 项目。它会创建一个 package.json 文件&#xff0c;这个文件包含了项目的元数据和依赖信息。 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

二分查找详细介绍可以看这篇文章&#xff0c;此篇文章介绍返回索引的 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 搭建个人博客基本框架

为了实现一个功能完善的个人博客系统&#xff0c;我们将使用Spring Boot作为框架&#xff0c;MySQL作为数据库&#xff0c;并引入Spring Security来处理用户认证和授权。以下是系统的详细设计和实现步骤&#xff1a; ## 项目结构 - src/main/java/com/blog - controller …...

StructBERT中文相似度模型企业应用指南:对接CRM、知识库、智能客服系统的完整集成方案

StructBERT中文相似度模型企业应用指南&#xff1a;对接CRM、知识库、智能客服系统的完整集成方案 1. 企业级文本相似度应用概述 在当今企业数字化运营中&#xff0c;文本相似度计算技术正成为提升业务效率的关键工具。StructBERT中文相似度模型基于百度先进的大模型技术&…...

OpenClaw 的模型预训练中,是否使用了对比学习与自回归的混合目标?

关于OpenClaw模型预训练中是否使用了对比学习与自回归的混合目标&#xff0c;这个问题其实触及了当前大语言模型训练方法中一个比较核心的演进方向。从公开的技术报告和论文细节来看&#xff0c;OpenClaw的设计思路确实体现了将不同训练目标融合的趋势&#xff0c;但具体到“对…...

零宽度字符隐写术全解析:从Unicode原理到实战检测工具推荐

零宽度字符隐写术全解析&#xff1a;从Unicode原理到实战检测工具推荐 在数字信息安全的隐秘角落&#xff0c;有一种几乎不可见的通信方式正在被安全研究人员和渗透测试工程师频繁使用——零宽度字符隐写术。这种技术允许我们将秘密信息嵌入普通文本中&#xff0c;肉眼无法察觉…...

Python农业物联网开发正在淘汰Django!FastAPI+Redis Stream+TimescaleDB构建毫秒级响应灌溉调度中枢(压测QPS达42,800)

第一章&#xff1a;Python农业物联网开发Python凭借其简洁语法、丰富生态和强大的硬件交互能力&#xff0c;已成为农业物联网&#xff08;Agri-IoT&#xff09;系统开发的主流语言。从土壤温湿度传感器数据采集到云端可视化决策支持&#xff0c;Python贯穿设备端、网关层与应用…...

如何高效定制Steam界面:实用美化插件开发指南

如何高效定制Steam界面&#xff1a;实用美化插件开发指南 【免费下载链接】millennium-steam-patcher Apply themes/customize Steam after the 2023-04-27 Chromium UI update https://discord.gg/MXMWEQKgJF 项目地址: https://gitcode.com/gh_mirrors/mi/millennium-steam…...

5个超实用技巧:用Awesome Adb实现手机调试效率倍增

5个超实用技巧&#xff1a;用Awesome Adb实现手机调试效率倍增 【免费下载链接】awesome-adb ADB Usage Complete / ADB 用法大全 项目地址: https://gitcode.com/gh_mirrors/aw/awesome-adb 副标题&#xff1a;告别繁琐操作&#xff0c;让Android设备管理效率提升10倍 …...

【2026唯一认证流式部署标准】:FastAPI 2.0 + Uvicorn 24.8 + ASGI 4.0协同流控协议详解(含OpenTelemetry追踪模板)

第一章&#xff1a;FastAPI 2.0 异步 AI 流式响应的范式演进与2026标准定位FastAPI 2.0 将原生支持全链路异步流式响应&#xff08;StreamingResponse&#xff09;与 Server-Sent Events&#xff08;SSE&#xff09;语义融合&#xff0c;标志着 AI 应用后端从“请求-响应”单次…...

保姆级教程:手把手教你用ONNX Runtime部署YOLOv8-OBB旋转框检测模型(附完整代码)

从零实现YOLOv8-OBB旋转框检测&#xff1a;ONNX Runtime部署全流程实战 旋转目标检测在遥感图像、文档分析等场景中具有独特优势。YOLOv8-OBB作为Ultralytics推出的旋转框检测版本&#xff0c;其部署过程与传统水平框检测存在显著差异。本文将彻底拆解从模型导出到推理优化的完…...

DeepWiki-Open技术解析:构建完全离线的AI文档生成创新方案

DeepWiki-Open技术解析&#xff1a;构建完全离线的AI文档生成创新方案 【免费下载链接】deepwiki-open Open Source DeepWiki: AI-Powered Wiki Generator for GitHub Repositories 项目地址: https://gitcode.com/gh_mirrors/de/deepwiki-open 在企业级软件开发中&…...

Hunyuan-MT-7B效果展示:学术论文摘要英→中翻译在专业术语一致性表现

Hunyuan-MT-7B效果展示&#xff1a;学术论文摘要英→中翻译在专业术语一致性表现 1. 引言&#xff1a;专业翻译的技术挑战 学术论文翻译一直是机器翻译领域的难点&#xff0c;特别是专业术语的一致性保持。传统翻译工具在处理学术文献时&#xff0c;经常出现术语翻译不统一、…...