《UE5_C++多人TPS完整教程》學習筆記33 ——《P34 關卡與大廳之間的過渡(Transition Level And Lobby)》


本文為B站系列教學視頻 《UE5_C++多人TPS完整教程》 —— 《P34 關卡與大廳之間的過渡(Transition Level And Lobby)》 的學習筆記,該系列教學視頻為計算機工程師、程序員、游戲開發者、作家(Engineer, Programmer, Game Developer, Author) Stephen Ulibarri 發布在 Udemy 上的課程 《Unreal Engine 5 C++ Multiplayer Shooter》 的中文字幕翻譯版,UP主(也是譯者)為 游戲引擎能吃么。
在這里插入圖片描述


文章目錄

  • P34 關卡與大廳之間的過渡(Transition Level And Lobby)
  • 34.1 無縫與非無縫轉移
  • 34.2 創建大廳游戲模式 C++ 類
  • 34.3 創建過渡關卡
  • 34.4 進行測試
  • 34.5 Summary


P34 關卡與大廳之間的過渡(Transition Level And Lobby)

本節課將學習虛幻引擎在關卡間進行無縫轉移(Seamless Travel)的工作原理以及為何在多人模式游戲更推薦使用無縫轉移而不是非無縫轉移(Non-seamless Travel);接著,我們將創建一個關卡過渡模式,以便我們在進行關卡轉換時自動設置為使用無縫轉移;此后我們將創建一個大廳游戲模式,在此模式下,一旦大廳中的玩家人數足夠,將開啟游戲。
在這里插入圖片描述


34.1 無縫與非無縫轉移

  1. 虛幻引擎中主要有兩種關卡轉移(Travel,翻譯成切換、漫游也可)方式:無縫轉移和非無縫轉移方式。兩者的主要區別在于,無縫轉移是一種非阻塞(Non-blocking)操作,而非無縫轉移則是一種阻塞(Blocking)操作。
    每當客戶端進行非無縫轉移時,它都會斷開與當前服務器端的連接,然后再重新連接到這個服務器端,而此過程是需要時間的,再次進行重新連接可能會出現問題。根據非無縫轉移的特點,它主要出現以下在三種場景中:客戶端首次加載地圖、客戶端首次連接到服務器端以及上一個多人游戲終止下一個多人游戲開始。
    在這里插入圖片描述

  2. 在不同關卡間進行轉移時,更推薦使用無縫轉移(It‘s preferred to use seamless travel)。它可以帶來更流暢的游戲體驗(Smoother exprience),還可以避免當前客戶端進行重新連接帶來的一系列問題,例如由于太多其他新玩家突然加入先前的服務器,導致當前客戶端的玩家被先前的服務器禁止加入,從而使得當前客戶端找不到先前的服務器。
    想要啟用無縫轉移,首先需要設置一個過渡地圖(Transition map),之所以存在過渡地圖,是因為必須始終有一個被加載的世界(用于存放地圖),所以在加載新地圖之前,我們不能釋放原有的地圖,由于新舊地圖可能會非常大,需要大量的資源(Require a tremendous amount of resources),有了過渡地圖,新舊地圖就不會同時(Simultanously)存放在存儲器內。在設置好過渡地圖后,您需要將 游戲模式中的變量 “bUseSeamlessTravel" 設置為 "true”,這樣就可以實現無縫轉移了。
    在這里插入圖片描述

  3. 在虛幻引擎的多人游戲中,與(關卡)轉移的函數包括:

    • UWorld::ServerTravel”:此函數僅供服務器端調用。當服務器端調用此函數時,服務器端將會轉移至新的關卡,同時所有連接到該服務器的客戶端都會隨著服務器端轉移至這個新的關卡,這個過程是服務器端通過控制所有客戶端的玩家控制器并對它們分別調用 “APlayerController:ClientTravel” 來實現的。
    • APlayerController:ClientTravel”:此函數既可以被服務器端調用,也可以被客戶端調用。當客戶端調用此函數時,客戶端將轉移至新的服務器,此過程需要提供服務器的新地址;當服務器端調用此函數時,服務器內的所有玩家都將轉移至該服務器指定(Specify)的新地圖中。
      在這里插入圖片描述
  4. 我們接下來的任務將是創建一個大廳游戲模式 “LobbyGameMode”,在此模式下,一旦大廳中有足夠多的玩家時,將調用函數 “UWorld::ServerTravel”,使得所有連接到服務器端的客戶端隨著服務器進入游戲地圖,開始游戲。


34.2 創建大廳游戲模式 C++ 類

  1. 在虛幻引擎內容瀏覽器中新建一個 “GameMode” C++ 類,這里不選擇 “GameModeBase” C++類是因為“GameMode” C++ 類有更多的附加功能(Extra additional functionality),命名為 “LobbyGameMode”,路徑為“.../Blaster/GameMode”。
    在這里插入圖片描述
    在這里插入圖片描述

  2. 在 Visual Studio 中打開頭文件 “LobbyGameMode.h,聲明 "PostLogin() 函數的重寫。

    /*** LobbyGameMode.h ***/// Fill out your copyright notice in the Description page of Project Settings.#pragma once#include "CoreMinimal.h"
    #include "GameFramework/GameMode.h"
    #include "LobbyGameMode.generated.h"/*** */
    UCLASS()
    class BLASTER_API ALobbyGameMode : public AGameMode
    {GENERATED_BODY()/* P34 關卡與大廳之間的過渡(Transition Level And Lobby)*/
    public:virtual void PostLogin(APlayerController* Newplayer) override;	// 原生(Native)游戲模式類函數 PostLogin() 重寫,管理玩家登錄// https://dev.epicgames.com/documentation/zh-cn/unreal-engine/game-mode-and-game-state-in-unreal-engine/* P34 關卡與大廳之間的過渡(Transition Level And Lobby)*/
    };
    
  3. 在虛幻引擎的內容瀏覽器中,將 “/LearningKit_Games/Maps” 目錄下的地圖資產 “LearningKit_Games_Showcase” 復制到 “內容” 目錄下的 “Maps” 文件夾中,并重命名為 “BlasterMap”。接著,在 Visual Studio 中打開 “LobbyGameMode.cpp”,完成 “PostLogin()” 函數的重寫定義。
    在這里插入圖片描述
    在這里插入圖片描述
    在這里插入圖片描述

  1. 回到虛幻引擎,打開關卡 “Lobby” ,下一步為關卡 “Lobby” 設置游戲模式而不是用原生C++類(Raw C++ class)游戲模式。在內容瀏覽器 “內容” 目錄下的 “Blueprints” 文件夾中新建藍圖類 “BP_LobbyGameMode”,其父類為上文編譯好的 “LobbyGameMode
    在這里插入圖片描述
    在這里插入圖片描述
    在這里插入圖片描述

    /*** LobbyGameMode.cpp ***/// Fill out your copyright notice in the Description page of Project Settings./* P34 關卡與大廳之間的過渡(Transition Level And Lobby)*/
    #include "LobbyGameMode.h"	// 原來自動生成的代碼是 #include "GameMode/LobbyGameMode.h",這里需要把 "GameMode/" 去掉,否則找不到文件 "LobbyGameMode.h"
    #include "GameFramework/GameStateBase.h"	void ALobbyGameMode::PostLogin(APlayerController* Newplayer)
    {Super::PostLogin(Newplayer);	// 調用父類 GameModeBase 的 PostLogin() 函數,用于成功登錄后調用。int32 NumberOfPlayers = GameState.Get()->PlayerArray.Num();	// 獲取上線玩家人數,調用 GameState 指針需要包含頭文件 "GameFramework/GameStateBase.h"// GameState 本質是 UE5 新引入的智能指針包裝器(Smart pointer wrapper)—— T 對象指針 TObjectPtr,它包含了一組玩家狀態的矩陣(An array of player state)// 虛幻引擎為此提供了追蹤訪問(access tracking)的功能,它可以檢測哪些對象正在使用// https://dev.epicgames.com/documentation/zh-cn/unreal-engine/game-mode-and-game-state-in-unreal-engine?application_version=5.0/** // GameState is used to replicate game state relevant properties to all clients. UPROPERTY(Transient)TObjectPtr<AGameStateBase> GameState;**/// 當玩家人數達到一定數量,轉移至下一個關卡// 本節課使用硬編碼(Hard coding),即指定從關卡 Lobby 轉移到 BlasterMap,之后的課程將使用確切的變量if (NumberOfPlayers == 2) {UWorld* World = GetWorld();if (World) {bUseSeamlessTravel = true;										// 設置關卡 Lobby 轉移到 BlasterMap 的方式為無縫轉移World->ServerTravel(FString("/Game/Maps/BlasterMap?listen"));	// 作為監聽服務器打開關卡 BlasterMap}}
    }
    /* P34 關卡與大廳之間的過渡(Transition Level And Lobby)*/
    
  2. 在內容瀏覽器中雙擊 “BP_LobbyGameMode” 進入藍圖編輯器,在右側 “細節” 面板的 “”(Classes)選項卡下將 “默認 Pawn 類”(Default Pawn Class) 設置為 “BP_BlasterCharacter”,然后編譯并進行保存。
    在這里插入圖片描述

  3. 返回關卡 “Lobby” 編輯器,在右側 “世界場景設置”(World Settings)面板中,將 “游戲模式”(GameMode)選項卡下的“游戲模式重載”(GameMode Override)改為 “BP_LobbyGameMode”。
    在這里插入圖片描述

  4. 在設置好關卡 “Lobby” 的游戲模式后,此時我們不再需要場景中的 Actor “BP_BlasterCharacter”,將其刪除即可,因為任何抵達該關卡的玩家都會自動在此生成一個角色。點擊工具欄的 “播放”(?)按鈕啟動運行,可以看到角色自動生成并 “跳入” 關卡中。
    在這里插入圖片描述
    在這里插入圖片描述

  5. 也可以在勾選 “BP_LobbyGameMode” 藍圖編輯器中,在右側細節面板的 “游戲模式”(Game Mode)選項卡下勾選 “使用無縫漫游”(Use Seamlees Travel) ,這個似乎影響不大,因為我們已經在代碼中設置無縫轉移了。
    在這里插入圖片描述


34.3 創建過渡關卡

  1. 在內容瀏覽器 “內容” 目錄下的 “Maps” 文件夾中創建一個 “Empty Level” 過渡關卡,這里選擇新建關卡類型為 “Empty Level” 是因為過渡關卡越 “小” 越好(The smaller and more simple, the better),保存關卡,命名為 “TransitionMap”。在這里插入圖片描述
    在這里插入圖片描述

  2. 在編輯器上方中打開 “編輯”(Edit) 菜單欄下的 “項目設置”(Project Settings),設置 “轉移地圖”(Transition Map)為 “TransitionMap”。
    在這里插入圖片描述

  3. 確保 “GameStartupMap”、“Lobby”、“BlasterMap” 以及 “TransitionMap” 四個關卡都已經添加到 “項目設置” 的 “打包版本中要包括的地圖列表” (List of maps to include in a packaged build)選項中。
    在這里插入圖片描述


34.4 進行測試

  1. 在打包項目進行測試,可以通過添加已在項目中的資產來豐富關卡,因為它們看起來有些無聊(Sort of boring),具體做法如下:

    • 從 “LearningKit_Games” 目錄中尋找并添加資產到 “GameStartupMap”,發揮創造力,為準備開始游戲的玩家制作一個可供預覽的游戲主界面(use a bit of creativity and show the player a little bit of a preview of what they’re going to see in the game);
    • 尋找并添加資產到 “Lobby” 中,讓加入游戲后等待游戲開始的玩家有自由跑動的小區域(A small area that people can run around in);
    • 最重要的是游戲地圖 “BlasterMap”,這是多人匹配游戲中玩家進行槍戰的地方(A multiplayer matchmaking type of game where players are shooting at each other),需要考慮放置一些障礙掩體(Obstacles)、道具和武器的拾取點(Pickups)以及其他游戲機制(Gameplay mechanics),嘗試加入地形高度的變化(Experiment with changes in elevation)以及隱藏點(Hiding spots)。
      在這里插入圖片描述
  2. 由于筆者比較懶且沒有創造力(笑),所以直接使用從 Github 下載的 原項目的地圖。
    在這里插入圖片描述
    在這里插入圖片描述

  3. 可以看到教學視頻作者在關卡 “GameStartupMap” 和 “Lobby” 中放置并縮放了(Scale and postion)幾個浮島(Floating island),并添加了一些效果(Add some effect),在關卡 “GameStartupMap” 還放置了一個骨骼網格體 Actor 類。這里需要重新設置關卡 “Lobby” 的游戲模式為“BP_LobbyGameMode”。
    在這里插入圖片描述
    在這里插入圖片描述
    在這里插入圖片描述在這里插入圖片描述

  4. 為關卡 “BlasterMap” 新建一個游戲模式藍圖類 “BP_BlasterGameMode”,并在藍圖編輯器右側 “細節” 面板的 “”(Classes)選項卡下將 “默認 Pawn 類”(Default Pawn Class) 設置為 “BP_BlasterCharacter”,然后編譯并進行保存。
    在這里插入圖片描述
    在這里插入圖片描述

  5. 打開關卡 “BlasterMap” 編輯界面,從左側 “放置 Actor” (Place Actor)面板中拖拽 “玩家出生點”(Player Start) 至場景中,設置該關卡的游戲模式為“BP_BlasterGameMode”。運行關卡進行測試,玩家角色可以出生在場景中。
    在這里插入圖片描述
    在這里插入圖片描述
    在這里插入圖片描述
    在這里插入圖片描述

  6. 打包項目發送到另一臺機器上,進行多人聯機測試。關于如何打包項目以及配置、訪問 Steam 以進行測試,可以參見筆者之前的學習筆記:

    • 《UE5_C++多人TPS完整教程》學習筆記3 ——《P4 測試多人游戲(Testing Mutiplayer)》
    • 《UE5_C++多人TPS完整教程》學習筆記7 ——《P8 為項目配置 Steam(Configuring A Project for Steam)》
    • 《UE5_C++多人TPS完整教程》學習筆記8 ——《P9 訪問 Steam(Acessing Steam)》

    在兩臺設備上分別登錄 Steam 并運行游戲,進入游戲開始界面 “GameStartupmap”。
    在這里插入圖片描述
    設備 1 點擊 “Host” 按鈕創建服務器,進入游戲大廳 “Lobby” 等待設備 2 (小窗)加入。
    在這里插入圖片描述
    設備 2 點擊 “Join” 按鈕加入服務器,成功加入設備 1 的服務器,此時兩臺設備均通過過渡關“TransitionMap” 無縫轉移至游戲關卡 “BlasterMap”。
    在這里插入圖片描述
    在這里插入圖片描述
    兩臺設備均可以操控人物進行移動,并且能互相看見對方,測試成功。
    在這里插入圖片描述
    在這里插入圖片描述

    注意:
    如果角色沒法上臺階,可以在角色藍圖 “BP_BlasterCharacter” 的 “角色移動 (CharMoveComp)” 組件里將 “可行走地面角度”(Walkable Floor Angle)的值改大(筆者用的默認數值,沒出現這個問題)。
    在這里插入圖片描述


    @凱特加莫在這里插入圖片描述


34.5 Summary

本節課實現了關卡之間的無縫轉移,我們首先分析了虛幻引擎中無縫轉移與非無縫轉移的工作原理與適用場景,明確了無縫轉移在多人游戲中的優勢;接著在 Visual Studio 中創建了 “LobbyGameMode” C++ 類并重寫 “PostLogin” 函數,實現了玩家數量達標時自動觸發服務器端無縫轉移至游戲地圖的邏輯;然后通過新建過渡關卡 “TransitionMap” 并在項目設置中配置轉移地圖,確保新舊關卡切換時的資源管理優化;最后通過創建藍圖游戲模式、配置關卡參數以及多機測試,成功測試了玩家從游戲大廳 “Lobby” 到游戲關卡 “BlasterMap” 的無縫轉移功能。
在這里插入圖片描述


本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/bicheng/72341.shtml
繁體地址,請注明出處:http://hk.pswp.cn/bicheng/72341.shtml
英文地址,請注明出處:http://en.pswp.cn/bicheng/72341.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Nginx 配置與常用命令速查手冊

Nginx 配置文件結構 Linux 中 Nginx 的配置文件&#xff1a; 通常位于 /etc/nginx/nginx.conf 或 /usr/local/nginx/conf/nginx.conf。 Nginx 采用模塊化設計&#xff0c;主要分為以下部分&#xff1a; 1. 全局塊 配置與服務器整體相關的參數&#xff0c;如工作進程數、日…

Vscode 便用快捷鍵設置教程

文章目錄 簡介&#xff1a;1. go to define (跳轉到函數定義的位置)2. go to declaration (跳轉到函數聲明的位置)3. move line &#xff08;上下移動本行代碼&#xff09;3.1上下復制本行代碼 4. 前進和后退&#xff08;就是前進到光標上一次停留的位置&#xff0c;和后退到那…

Vim 常用快捷鍵大全:跳轉、編輯、查找替換全解析

摘要&#xff1a; Vim 是一款非常強大的文本編輯器&#xff0c;許多程序員和系統管理員都離不開它。 本文詳細介紹了 Vim 編輯器中的常用快捷鍵和命令&#xff0c;從基本模式、光標移動、編輯操作到查找替換&#xff0c;再到文件保存等常用操作&#xff0c;幫助你快速上手并提…

【實戰篇】【深度解析DeepSeek:從機器學習到深度學習的全場景落地指南】

一、機器學習模型:DeepSeek的降維打擊 1.1 監督學習與無監督學習的"左右互搏" 監督學習就像學霸刷題——給標注數據(參考答案)訓練模型。DeepSeek在信貸風控場景中,用邏輯回歸模型分析百萬級用戶數據,通過特征工程挖掘出"凌晨3點頻繁申請貸款"這類魔…

Vue核心知識:Vue動態權限到按鈕完整方案

為了進一步實現上面提到的動態路由功能&#xff0c;并且加入對每個路由的權限控制&#xff08;即增、刪、改、查按鈕的權限控制&#xff09;&#xff0c;我們需要對數據庫、后端接口、前端的設計做一些改進和擴展。下面我將詳細描述如何在現有方案的基礎上加入對路由的增、刪、…

swift 開發效率提升工具

安裝github copliot for xcode github/CopilotForXcode brew install --cask github-copilot-for-xcode安裝swiftformat for xcode brew install swiftformatXcode Swift File代碼格式化-SwiftFormat

Trae智能協作AI編程工具IDE:如何在MacBook Pro下載、安裝和配置使用Trae?

Trae智能協作AI編程工具IDE&#xff1a;如何在MacBook Pro下載、安裝和配置使用Trae&#xff1f; 一、為什么選擇Trae智能協作IDE&#xff1f; 在AI編程新時代&#xff0c;Trae通過以下突破性功能重新定義開發體驗&#xff1a; 雙向智能增強&#xff1a;AI不僅提供代碼補全&a…

【推薦項目】023-游泳俱樂部管理系統

023 游泳俱樂部管理系統 游泳俱樂部管理系統概述 前端技術框架&#xff1a; 我們優雅地采用了Vue.js作為游泳俱樂部管理系統的前端基礎框架。Vue.js以其輕盈、高效和易于上手的特點&#xff0c;為我們的用戶界面帶來了極致的流暢性和響應速度。通過Vue.js&#xff0c;我們為…

C語言:51單片機 基礎知識

一、單片機概述 單片機的組成及其特點 單片機是指在一塊芯片上集成了CPU、ROM、RAM、定時器/計數器和多種I/O接口電路等&#xff0c;具有一定規模的微型計算機。 特點&#xff1a; 1、單片機的存儲器以ROM、RAM嚴格分工。 2、采用面向控制的指令系統。 3、單片機的I/O口引腳通…

【計算機網絡入門】初學計算機網絡(八)

目錄 1. S-W協議的信道利用率 2. GBN、SR協議的信道利用率 3.術語補充 3.1 滑動窗口協議 3.2 ARQ協議、連續ARQ協議 4. 信道劃分介質訪問控制 4.1 時分復用&#xff08;TDM&#xff09; 4.2 統計時分復用&#xff08;STDM&#xff09; 4.3 頻分復用&#xff08;FDM&a…

HarmonyOS學習第7天: 文本組件點亮界面的文字魔法棒

一、引言 在 HarmonyOS 那豐富多彩的系統界面中&#xff0c;從簡潔直觀的應用圖標&#xff0c;到交互流暢的操作菜單&#xff0c;再到生動形象的圖文展示&#xff0c;每一處細節都經過精心雕琢&#xff0c;為用戶帶來了獨特而美妙的視覺與交互體驗。而在這琳瑯滿目的界面元素中…

從零開始:H20服務器上DeepSeek R1 671B大模型部署與壓力測試全攻略

前言 最近&#xff0c;我有幸在工作中接觸到了DeepSeek R1 671B模型&#xff0c;這是目前中文開源領域參數量最大的高質量模型之一。DeepSeek團隊在2024年推出的這款模型&#xff0c;以其驚人的6710億參數量和出色的推理性能&#xff0c;引起了業界廣泛關注。 作為一名AI基礎…

Unity中動態切換光照貼圖LightProbe的方法

關鍵代碼&#xff1a;LightmapSettings.lightmaps lightmapDatas; LightmapData中操作三張圖&#xff1a;lightmapColor,lightmapDir,以及一張ShadowMap 這里只操作前兩張&#xff1a; using UnityEngine; using UnityEngine.EventSystems; using UnityEngine.UI;public cl…

實例分割 | yolov11訓練自己的數據集

前言 因工作要求使用的都是yolov5系列的模型&#xff0c;今天學習一下最先進的yolov11&#xff0c;記錄一下環境配置及訓練過程。 1.項目下載及環境安裝 源碼位置&#xff1a;yolov11 可以看到&#xff0c;這里要求python版本大于等于3.8&#xff0c;我這里安裝python3.10.…

大模型推理時的尺度擴展定律

大模型推理時的尺度擴展定律 FesianXu at 20250212 at Wechat Search Team 前言 大模型的尺度擴展定律告訴我們&#xff1a;『LLM的性能會隨著模型的參數量、模型的訓練量、模型的訓練數據量的增加而增加』。訓練存在尺度擴展定律&#xff0c;測試也存在尺度擴展定律&#xff…

如何使用useEffect模擬組件的生命周期?

什么是 useEffect&#xff1f; useEffect 是 React 提供的一個 Hook&#xff0c;用于處理副作用&#xff08;side effects&#xff09;。它允許你在函數組件中執行一些操作&#xff0c;這些操作通常會影響組件的渲染&#xff0c;比如數據獲取、訂閱、DOM 操作等。通過 useEffe…

Linux網絡基礎(協議 TCP/IP 網絡傳輸基本流程 IP VS Mac Socket編程UDP)

文章目錄 一.前言二.協議協議分層分層的好處 OSI七層模型TCP/IP五層(或四層)模型為什么要有TCP/IP協議TCP/IP協議與操作系統的關系(宏觀上是如何實現的)什么是協議 三.網絡傳輸基本流程局域網(以太網為例)通信原理MAC地址令牌環網 封裝與解包分用 四.IP地址IP VS Mac地址 五.So…

網絡安全-使用DeepSeek來獲取sqlmap的攻擊payload

文章目錄 概述DeepSeek使用創建示例數據庫創建API測試sqlmap部分日志參考 概述 今天來使用DeepSeek做安全測試&#xff0c;看看在有思路的情況下實現的快不快。 DeepSeek使用 我有一個思路&#xff0c;想要測試sqlmap工具如何dump數據庫的&#xff1a; 連接mysql數據庫&#…

AI繪畫軟件Stable Diffusion詳解教程(2):Windows系統本地化部署操作方法(專業版)

一、事前準備 1、一臺配置不錯的電腦&#xff0c;英偉達顯卡&#xff0c;20系列起步&#xff0c;建議顯存6G起步&#xff0c;安裝win10或以上版本&#xff0c;我的顯卡是40系列&#xff0c;16G顯存&#xff0c;所以跑大部分的模型都比較快&#xff1b; 2、科學上網&#xff0…

Linux NAT和代理服務器

目錄 0.前言 1.NAT 網絡地址轉換 1.1 NAT 技術背景 1.2 NAT的定義與分類 1.3 NAT的工作原理 1.4 NAT的缺陷 2.代理服務器 2.1 概述 2.2 正向代理 2.3 反向代理 2.4 NAT 與代理服務器的區別和聯系 3.小結 &#xff08;圖像由AI生成&#xff09; 0.前言 在前面的文章中&#x…