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

目录

  • [0 引言](#0 引言)
  • [1 多人游戏会话](#1 多人游戏会话)
    • [1.1 Why?为什么要有这个](#1.1 Why?为什么要有这个)
    • [1.2 How?怎么使用?](#1.2 How?怎么使用?)
  • [2 加入游戏会话的流程](#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等),你需要选择一个适合你的游戏需求的子系统。通常在项目设置中配置:

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

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

cpp 复制代码
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. 查找游戏会话

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

cpp 复制代码
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. 加入游戏会话

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

cpp 复制代码
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. 销毁游戏会话

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

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

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

cpp 复制代码
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. 启动专用服务器

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

sh 复制代码
UE4Editor.exe YourProjectName -server -log

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

sh 复制代码
YourProjectNameServer.exe YourMapName?listen -log
  1. 客户端加入游戏会话

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

cpp 复制代码
void UMyMainMenuWidget::OnJoinServerButtonClicked()
{
    UMyGameInstance* GameInstance = Cast<UMyGameInstance>(GetGameInstance());
    if (GameInstance)
    {
        GameInstance->FindGameSessions();
    }
}

在找到会话后,客户端可以通过以下命令连接到服务器:

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

相关推荐
weixin_437398219 分钟前
Linux扩展——shell编程
linux·运维·服务器·bash
小林熬夜学编程18 分钟前
【Linux网络编程】第十四弹---构建功能丰富的HTTP服务器:从状态码处理到服务函数扩展
linux·运维·服务器·c语言·网络·c++·http
Hacker_Fuchen20 分钟前
天融信网络架构安全实践
网络·安全·架构
上海运维Q先生23 分钟前
面试题整理15----K8s常见的网络插件有哪些
运维·网络·kubernetes
ProtonBase33 分钟前
如何从 0 到 1 ,打造全新一代分布式数据架构
java·网络·数据库·数据仓库·分布式·云原生·架构
冷心笑看丽美人40 分钟前
探秘 DNS 服务器:揭开域名解析的神秘面纱
linux·运维·服务器·dns
wenxiaocsdn1 小时前
某科技局国产服务器PVE虚拟化技术文档
运维·服务器
远游客07139 小时前
centos stream 8下载安装遇到的坑
linux·服务器·centos
fantasy_arch10 小时前
CPU性能优化-磁盘空间和解析时间
网络·性能优化
LIKEYYLL11 小时前
GNU Octave:特性、使用案例、工具箱、环境与界面
服务器·gnu