【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机制将这些对象的状态和操作同步到客户端。客户端则根据服务器的指令同步创建和更新这些对象,从而实现一致的游戏体验。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/pingmian/37727.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Linux部署Java项目至云服务器

文章目录 1.服务器环境2.发布部署过程2.1 执行SQL脚本2.2 修改代码中数据源的配置2.3 修改配置中的日志级别与日志文件路径2.4 打包Java程序2.5 上传到服务器2.6 后台运行2.7 服务器开放对应的端口2.8 访问验证 1.服务器环境 要将我们的项目部署到云服务器上我们就需要先有一个…

c#上位机与PLC通讯心跳的实现方法

上位机与PLC之间的通信是实现自动化或者实时监控的重要环节。为了确保通讯的稳定与可靠,大部分采用"心跳机制,它在通信过程中起到检测和维护连接状态的重要作用。 心跳机制 在上位机与PLC的通信中,心跳机制类似于人体的心跳,是系统保持正常运行的关键指标之一。这种机…

2024年值得信赖的在线代理IP服务商

在当今的网络世界中&#xff0c;代理IP服务成为了许多企业和个人在进行网络数据处理、多账号管理等任务时不可或缺的工具。然而&#xff0c;面对市场上众多的代理IP服务商&#xff0c;如何挑选出真正值得信赖的服务商成为了一大难题。作为专业的测评团队&#xff0c;我们近期对…

基于MIMO系统的预编码matlab性能仿真

目录 1.算法运行效果图预览 2.算法运行软件版本 3.部分核心程序 4.算法理论概述 4.1 最小均方误差&#xff08;MMSE&#xff09;准则 4.2 量化准则 5.算法完整程序工程 1.算法运行效果图预览 (完整程序运行后无水印) 2.算法运行软件版本 MATLAB2022a 3.部分核心程序 …

HarmonyOS APP应用开发项目- MCA助手(持续更新中~)

简言&#xff1a; gitee地址&#xff1a;https://gitee.com/whltaoin_admin/money-controller-app.git端云一体化开发在线文档&#xff1a;https://developer.huawei.com/consumer/cn/doc/harmonyos-guides-V5/agc-harmonyos-clouddev-view-0000001700053733-V5 注&#xff1…

【PyQt】20-QTimer(动态显示时间、定时关闭)

QTimer 前言一、QTimer介绍二、动态时间展示2.1 代码2.2 运行结果 三、定时关闭3.1 介绍他的两种用法1、使用函数或Lambda表达式2、带有定时器类型&#xff08;高级&#xff09; 3.2 代码3.3 运行结果 总结 前言 好久没学习了。 一、QTimer介绍 pyqt里面的多线程可以有两种实…

IOS Swift 从入门到精通: ios从服务器获取数据

文章目录 证书数据模型将数据添加到 Firestore进一步了解Combine创建 ViewModel证书数据模型 接下来,我们需要为证书创建一个模型。创建一个名为“Certificate.swift”的新文件,并添加以下模型: // Certificate.swiftstruct Certificate: Identifiable {var id: Stringvar…

微信内置H5支付

&#x1f9d1;‍&#x1f4bb; 写在开头 点赞 收藏 学会&#x1f923;&#x1f923;&#x1f923; 场景是用户通过微信扫app内的收款码&#xff0c;跳到一个h5页面。然后完成支付。 代码实现的整体流程&#xff1a; 使用微信扫码&#xff0c;码是app内生成的&#xff0c;码…

Day38:LeedCode 1049. 最后一块石头的重量 II 494. 目标和 474.一和零

1049. 最后一块石头的重量 II 有一堆石头&#xff0c;用整数数组 stones 表示。其中 stones[i] 表示第 i 块石头的重量。 每一回合&#xff0c;从中选出任意两块石头&#xff0c;然后将它们一起粉碎。假设石头的重量分别为 x 和 y&#xff0c;且 x < y。那么粉碎的可能结果…

大数据面试题之MapReduce(2)

目录 shuffle为什么要排序? 说一下map是怎么到reduce的? 说一下你了解的用哪几种shuffle机制? MapReduce的数据处理过程 mapjoin的原理(实现)?应用场景? reducejoin如何执行(原理) MapReduce为什么不能产生过多小文件 MapReduce分区及作用 ReduceTask数量和分区数…

Java的NIO体系

目录 NIO1、操作系统级别下的IO模型有哪些&#xff1f;2、Java语言下的IO模型有哪些&#xff1f;3、Java的NIO应用场景&#xff1f;相比于IO的优势在哪&#xff1f;4、Java的IO、NIO、AIO 操作文件读写5、NIO的核心类 :Buffer&#xff08;缓冲区&#xff09;、Channel&#xff…

2024.06.29 刷题日记

739. 每日温度 给定一个整数数组 temperatures &#xff0c;表示每天的温度&#xff0c;返回一个数组 answer &#xff0c;其中 answer[i] 是指对于第 i 天&#xff0c;下一个更高温度出现在几天后。如果气温在这之后都不会升高&#xff0c;请在该位置用 0 来代替。 示例 1: …

Linux下C/C++获得当前时间(秒/毫秒)

秒或者毫秒是根据当前时间到1970年1月1日计算&#xff0c;主要用于两个时间戳计算间隔时间 #include <iostream> using namespace std;#include <sys/time.h>int main() {struct timeval time_;gettimeofday(&time_, NULL);cout << time_.tv_sec <&…

【proteus 51单片机入门】8*8led点阵

文章目录 前言如何点亮led点阵仿真图代码点亮led核心代码解析 爱心代码 滚动总结 前言 在嵌入式系统的开发中&#xff0c;LED点阵显示器是一种常见的显示设备&#xff0c;它可以用来显示各种图形和文字&#xff0c;为用户提供直观的信息反馈。本文将介绍如何使用Proteus软件和…

使用 MongoDB 剖析开放银行:技术挑战和解决方案

开放银行&#xff08;或开放金融&#xff09;在银行业掀起了一股颠覆性浪潮&#xff0c;它迫使金融机构&#xff08;银行、保险公司、金融科技公司、企业甚至政府机构&#xff09;迎接一个透明、协作和创新的新时代。这种模式转变要求银行与第三方提供商&#xff08;TPP&#x…

如何在 SQL 中删除一条记录?

如何在 SQL 中删除一条记录&#xff1f; 在 SQL 中&#xff0c;您可以使用DELETE查询和WHERE子句删除表中的一条记录。在本文中&#xff0c;我将向您介绍如何使用DELETE查询和WHERE子句删除记录。我还将向您展示如何一次从表中删除多条记录 如何在 SQL 中使用 DELETE 这是使…

【计算机图形学】期末考试知识点汇总(上)

文章目录 视频教程第一章 计算机图形学概述计算机图形学的定义计算机图形学的应用计算机图形学 vs 图像处理 vs模式识别图形显示器的发展及工作原理理解三维渲染管线 第二章 基本图元的扫描转换扫描转换直线的扫描转换DDA算法Bresenham算法中点画线算法圆的扫描转换中点画圆算法…

react项目实现语音识别功能

需要调用后端接口将录音文件传给后端&#xff0c;由后端将录音内容转换成文字返回给前端&#xff0c;当然也有一些插件可以实现语音转文字功能&#xff0c;可以自行查找使用插件实现方法 有注释版本&#xff0c;下面还有 一个无注释版本。 import React, { useState, useEffe…

面试-J.U.C包的梳理

1.J.U.C包的梳理 Java.Util.Concurrent包简称JUC (1)JUC整体架构图 (2)分析 Executor&#xff1a;线程执行器&#xff0c;任务执行和调度的框架。Tools下存在executor相关的executors类&#xff0c;用于创建executorservice&#xff0c;scheduleexecutorservice&#xff0c;…

互斥锁(Mutex)和条件变量(Condition Variable)的作用

互斥锁&#xff08;Mutex&#xff09;的作用 互斥锁&#xff08;Mutex&#xff0c;全称Mutual Exclusion Lock&#xff09;是一种用于多线程编程中的同步原语&#xff0c;其主要作用是确保在任何给定时间只有一个线程可以访问共享资源&#xff0c;以避免多个线程同时对共享资源…