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


    请添加图片描述

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

  • 相关阅读:
    A. Print a Pedestal (Codeforces logo?)
    pandas 将一行拆分为多行,将多行合并为一行
    linux之shell记录
    (40)STM32——OV2640摄像头实验
    java判断是否是鸿蒙系统
    数据挖掘面试经总结【私人版,仅供参考】
    目标检测YOLO系列从入门到精通技术详解100篇-【目标检测】SLAM(补充篇)
    内网渗透-linux权限维持
    【前端方案】-表格排序列LRU缓存方案
    前端程序——猜数字游戏
  • 原文地址:https://blog.csdn.net/hhw_hhw/article/details/140067284