当前位置: 首页 > 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 …...

【杂谈】-递归进化:人工智能的自我改进与监管挑战

递归进化&#xff1a;人工智能的自我改进与监管挑战 文章目录 递归进化&#xff1a;人工智能的自我改进与监管挑战1、自我改进型人工智能的崛起2、人工智能如何挑战人类监管&#xff1f;3、确保人工智能受控的策略4、人类在人工智能发展中的角色5、平衡自主性与控制力6、总结与…...

Mybatis逆向工程,动态创建实体类、条件扩展类、Mapper接口、Mapper.xml映射文件

今天呢&#xff0c;博主的学习进度也是步入了Java Mybatis 框架&#xff0c;目前正在逐步杨帆旗航。 那么接下来就给大家出一期有关 Mybatis 逆向工程的教学&#xff0c;希望能对大家有所帮助&#xff0c;也特别欢迎大家指点不足之处&#xff0c;小生很乐意接受正确的建议&…...

拉力测试cuda pytorch 把 4070显卡拉满

import torch import timedef stress_test_gpu(matrix_size16384, duration300):"""对GPU进行压力测试&#xff0c;通过持续的矩阵乘法来最大化GPU利用率参数:matrix_size: 矩阵维度大小&#xff0c;增大可提高计算复杂度duration: 测试持续时间&#xff08;秒&…...

自然语言处理——循环神经网络

自然语言处理——循环神经网络 循环神经网络应用到基于机器学习的自然语言处理任务序列到类别同步的序列到序列模式异步的序列到序列模式 参数学习和长程依赖问题基于门控的循环神经网络门控循环单元&#xff08;GRU&#xff09;长短期记忆神经网络&#xff08;LSTM&#xff09…...

【学习笔记】深入理解Java虚拟机学习笔记——第4章 虚拟机性能监控,故障处理工具

第2章 虚拟机性能监控&#xff0c;故障处理工具 4.1 概述 略 4.2 基础故障处理工具 4.2.1 jps:虚拟机进程状况工具 命令&#xff1a;jps [options] [hostid] 功能&#xff1a;本地虚拟机进程显示进程ID&#xff08;与ps相同&#xff09;&#xff0c;可同时显示主类&#x…...

视觉slam十四讲实践部分记录——ch2、ch3

ch2 一、使用g++编译.cpp为可执行文件并运行(P30) g++ helloSLAM.cpp ./a.out运行 二、使用cmake编译 mkdir build cd build cmake .. makeCMakeCache.txt 文件仍然指向旧的目录。这表明在源代码目录中可能还存在旧的 CMakeCache.txt 文件,或者在构建过程中仍然引用了旧的路…...

AGain DB和倍数增益的关系

我在设置一款索尼CMOS芯片时&#xff0c;Again增益0db变化为6DB&#xff0c;画面的变化只有2倍DN的增益&#xff0c;比如10变为20。 这与dB和线性增益的关系以及传感器处理流程有关。以下是具体原因分析&#xff1a; 1. dB与线性增益的换算关系 6dB对应的理论线性增益应为&…...

基于SpringBoot在线拍卖系统的设计和实现

摘 要 随着社会的发展&#xff0c;社会的各行各业都在利用信息化时代的优势。计算机的优势和普及使得各种信息系统的开发成为必需。 在线拍卖系统&#xff0c;主要的模块包括管理员&#xff1b;首页、个人中心、用户管理、商品类型管理、拍卖商品管理、历史竞拍管理、竞拍订单…...

宇树科技,改名了!

提到国内具身智能和机器人领域的代表企业&#xff0c;那宇树科技&#xff08;Unitree&#xff09;必须名列其榜。 最近&#xff0c;宇树科技的一项新变动消息在业界引发了不少关注和讨论&#xff0c;即&#xff1a; 宇树向其合作伙伴发布了一封公司名称变更函称&#xff0c;因…...

Python Einops库:深度学习中的张量操作革命

Einops&#xff08;爱因斯坦操作库&#xff09;就像给张量操作戴上了一副"语义眼镜"——让你用人类能理解的方式告诉计算机如何操作多维数组。这个基于爱因斯坦求和约定的库&#xff0c;用类似自然语言的表达式替代了晦涩的API调用&#xff0c;彻底改变了深度学习工程…...