TPS入門DAY02 服務器篇

1.創建空白插件

2.導入在線子系統以及在線steam子系統庫

`MultiplayerSessions.uplugin`

MultiplayerSessions.Build.cs

3.創建游戲實例以及初始化會話創建流程

創建會話需要的函數,委托,委托綁定的回調,在線子系統接口綁定某一個委托的控制其綁定的生命周期的句柄

// Fill out your copyright notice in the Description page of Project Settings.#pragma once#include "CoreMinimal.h"
#include "Subsystems/GameInstanceSubsystem.h"
#include "Interfaces/OnlineSessionInterface.h"  // 包含委托定義
#include "MultiplayerSessionsSubsystem.generated.h"/*** */
UCLASS()
class MULTIPLAYERSESSIONS_API UMultiplayerSessionsSubsystem : public UGameInstanceSubsystem
{GENERATED_BODY()public:UMultiplayerSessionsSubsystem();/* 會話有關的函數 */void CreateSession(int32 NumPublicConnections, FString MatchType);void FindSessions(int32 MaxSearchResults);void JoinSession(const FOnlineSessionSearchResult& SearchResult);void DestroySession();void StartSession();protected:/* 委托的回調函數 */void OnCreateSessionComplete(FName SessionName, bool bWasSuccessful);void OnFindSessionsComplete(bool bWasSuccessful);void OnJoinSessionComplete(FName SessionName, EOnJoinSessionCompleteResult::Type Result);void OnDestroySessionComplete(FName SessionName, bool bWasSuccessful);void OnStartSessionComplete(FName SessionName, bool bWasSuccessful);private:/* 進入服務器的憑證,通過該憑證來加入同一個服務器 */IOnlineSessionPtr OnlineSessionInterface;/* 在線子系統的委托 */FOnCreateSessionCompleteDelegate OnCreateSessionCompleteDelegate;FOnFindSessionsCompleteDelegate OnFindSessionsCompleteDelegate;FOnJoinSessionCompleteDelegate OnJoinSessionCompleteDelegate;FOnDestroySessionCompleteDelegate OnDestroySessionCompleteDelegate;FOnStartSessionCompleteDelegate OnStartSessionCompleteDelegate;/* 在線子系統委托對應的句柄 *//* 例:當創建會話時,在線子系統會綁定創建完會話的委托,該函數會返回創建會話完成委托的句柄,來管理委托的綁定生命周期*/FDelegateHandle OnCreateSessionCompleteDelegateHandle;FDelegateHandle OnFindSessionsCompleteDelegateHandle;FDelegateHandle OnJoinSessionCompleteDelegateHandle;FDelegateHandle OnDestroySessionCompleteDelegateHandle;FDelegateHandle OnStartSessionCompleteDelegateHandle;private:/* 綁定委托的回調 */void BindCallBack();
};

實現代碼

4.創建系統菜單

編譯報錯

1>[3/4] Link [x64] UnrealEditor-MultiplayerSessions.dll (0:00.78 at +0:14)
1>  正在創建庫 H:\UEProject\5.3\MultiPlayer\MenuSystem\Plugins\MultiplayerSessions\Intermediate\Build\Win64\x64\UnrealEditor\Development\MultiplayerSessions\UnrealEditor-MultiplayerSessions.sup.lib 和對象 H:\UEProject\5.3\MultiPlayer\MenuSystem\Plugins\MultiplayerSessions\Intermediate\Build\Win64\x64\UnrealEditor\Development\MultiplayerSessions\UnrealEditor-MultiplayerSessions.sup.exp
1>Module.MultiplayerSessions.cpp.obj : error LNK2019: 無法解析的外部符號 "__declspec(dllimport) public: __cdecl UWidget::FFieldNotificationClassDescriptor::FFieldNotificationClassDescriptor(void)" (__imp_??0FFieldNotificationClassDescriptor@UWidget@@QEAA@XZ),函數 "public: virtual struct UE::FieldNotification::IClassDescriptor const & __cdecl UWidget::GetFieldNotificationDescriptor(void)const " (?GetFieldNotificationDescriptor@UWidget@@UEBAAEBUIClassDescriptor@FieldNotification@UE@@XZ) 中引用了該符號
1>Module.MultiplayerSessions.cpp.obj : error LNK2019: 無法解析的外部符號 "__declspec(dllimport) public: virtual __cdecl UWidget::FFieldNotificationClassDescriptor::~FFieldNotificationClassDescriptor(void)" (__imp_??1FFieldNotificationClassDescriptor@UWidget@@UEAA@XZ),函數 "void __cdecl `public: virtual struct UE::FieldNotification::IClassDescriptor const & __cdecl UWidget::GetFieldNotificationDescriptor(void)const '::`2'::`dynamic atexit destructor for 'Instance''(void)" (??__FInstance@?1??GetFieldNotificationDescriptor@UWidget@@UEBAAEBUIClassDescriptor@FieldNotification@UE@@XZ@YAXXZ) 中引用了該符號
1>Module.MultiplayerSessions.cpp.obj : error LNK2019: 無法解析的外部符號 "__declspec(dllimport) private: static class UClass * __cdecl UUserWidget::GetPrivateStaticClass(void)" (__imp_?GetPrivateStaticClass@UUserWidget@@CAPEAVUClass@@XZ),函數 "public: static class UClass * __cdecl UUserWidget::StaticClass(void)" (?StaticClass@UUserWidget@@SAPEAVUClass@@XZ) 中引用了該符號
1>  已定義且可能匹配的符號上的提示:

無法解析的外部符號,別看報錯了這么多,先看他比比的什么

首先UWidget這個不認識,其次UUserWidget這個類也不認識

比比半天,是庫缺失了,鏈接一下就好了,直接搜索Widget,在解決方案下

沒搜到,沒關系,可能這個關鍵字就不是頭文件命名,在搜索UserWidget

直接將UMG添加到build.cs下即可

其實就是VS下的篩選器的名字

生成成功

設置UI界面配置

#include "CoreMinimal.h"
#include "Blueprint/UserWidget.h"
#include "Menu.generated.h"/*** */
UCLASS()
class MULTIPLAYERSESSIONS_API UMenu : public UUserWidget
{GENERATED_BODY()public:UFUNCTION(BlueprintCallable)void MenuSetup(int32 _NumberOfPublicConnections, FString _TypeOfMatch, FString _LobbyPath);public:/* 最大連接數 */UPROPERTY(BlueprintReadWrite)int32 NumberOfPublicConnections;UPROPERTY(BlueprintReadWrite)FString MatchType;/* 大廳路徑 */UPROPERTY(BlueprintReadWrite)FString LobbyPath;
};
#include "Menu.h"void UMenu::MenuSetup(int32 _NumberOfPublicConnections, FString _TypeOfMatch, FString _LobbyPath)
{LobbyPath = FString::Printf(TEXT("%s?listen"), *_LobbyPath);NumberOfPublicConnections = _NumberOfPublicConnections;MatchType = _TypeOfMatch;AddToViewport();SetVisibility(ESlateVisibility::Visible);bIsFocusable = true;																// 允許接收輸入事件UWorld* World = GetWorld();if (World){APlayerController* PlayerController = World->GetFirstPlayerController();if (PlayerController){FInputModeUIOnly InputMode;InputMode.SetWidgetToFocus(TakeWidget());									// 聚焦當前控件InputMode.SetLockMouseToViewportBehavior(EMouseLockMode::DoNotLock);		// 不限制鼠標PlayerController->SetInputMode(InputMode);									// 切換為純UI輸入模式PlayerController->bShowMouseCursor = true;									// 顯示鼠標光標}}
}

創建控件藍圖

以創建的C++Menu類為父類創建

在關卡中顯示

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

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

相關文章

產品經理課程

原型工具 一、土耳其機器人 這個說法來源于 1770 年出現的一個騙局,一個叫沃爾夫岡馮肯佩倫(Wolfgang von Kempelen)的人為了取悅奧地利女皇瑪麗婭特蕾莎(Maria Theresia),“制造”了一個會下國際象棋的機…

nginx中的limit_req 和 limit_conn

在 Nginx 中,limit_req 和 limit_conn 是兩個用于限制客戶端請求的指令,它們分別用于限制請求速率和并發連接數。 limit_req limit_req 用于限制請求速率,防止客戶端發送過多請求影響服務器性能。它通過 limit_req_zone 指令定義一個共享內存…

基于winform的串口調試助手

目錄 一、串口助手界面設計 1.1 串口配置 1.2 接收配置 1.3 發送配置 1.4 接收窗口和發送窗口 1.5 狀態顯示窗口 1.6 串口通訊控件 二、程序編寫 2.1 端口號自動識別并顯示在端口號下拉框 功能說明: 2.2 波特率下拉框顯示 2.3 數據位下拉框顯示 2.4 校…

Docker基礎2

如需轉載,標記出處 本次我們將下載一個 Docker 鏡像,從鏡像中啟動容器 上一章,安裝 Docker 時,獲得兩個主要組件: Docker 客戶端 Docker 守護進程(有時稱為“服務器”或“引擎”) 守護進程實…

Rocketmq2

一、生產者端防丟失 1. 發送方式選擇 同步發送:使用 send() 方法,等待 Broker 確認響應(SendResult),確保消息已成功發送。異步發送:使用 sendAsync() 方法并設置回調函數,處理發送成功 / 失敗…

RabbitMQ詳解,RabbitMQ是什么?架構是怎樣的?

目錄 一,RabbitMQ是什么? 二,RabbitMQ架構 2.1 首先我們來看下RabbitMQ里面的心概念Queue是什么? 2.2 交換器Exchange 2.3 RabbitMQ是什么? 2.4 重點看下優先級隊列是什么? 三,RabbitMQ集群 3.1 普通集群模式 3.2 鏡像隊列集群 一,RabbitMQ是什么? 假設我們程序…

【一步步開發AI運動APP】六、運動計時計數能調用

之前我們為您分享了【一步步開發AI運動小程序】開發系列博文,通過該系列博文,很多開發者開發出了很多精美的AI健身、線上運動賽事、AI學生體測、美體、康復鍛煉等應用場景的AI運動小程序;為了幫助開發者繼續深耕AI運動領域市場,今…

MySQL——DQL的多表查詢

一、交叉連接 標準語法:select * from 表1 cross join 表2 where 表1.公共列 表2.公共列; 簡單語法:select * from 表1 , 表2 where 表1.公共列 表2.公共列; 公共列:兩張表具有相同含義的列,不是列名一樣。 …

【Linux內核】如何更加優雅閱讀Linux內核源碼(vscode)

1. 前言 因為已經習慣在Ubuntu下進行嵌入式工作開發,但Linux源碼在Source Insight下進行閱讀,一直很苦惱Linux/Windows來回切換的開發方式,當前發現可以通過 vscode clangd(擴展組件) 方式進行更好的內核源碼閱讀。 2. 環境 操作系統&…

21.OpenCV獲取圖像輪廓信息

OpenCV獲取圖像輪廓信息 在計算機視覺領域,識別和分析圖像中的對象形狀是一項基本任務。OpenCV 庫提供了一個強大的工具——輪廓檢測(Contour Detection),它能夠幫助我們精確地定位對象的邊界。這篇博文將帶你入門 OpenCV 的輪廓…

LETTERS(DFS)

【題目描述】 給出一個rowcolrowcol的大寫字母矩陣,一開始的位置為左上角,你可以向上下左右四個方向移動,并且不能移向曾經經過的字母。問最多可以經過幾個字母。 【輸入】 第一行,輸入字母矩陣行數RR和列數SS,1≤R,S≤…

Day2-2:前端項目uniapp壁紙實戰

再在wallpaper新建一個目錄components 在components下新建組件common-title 記得點擊創建同名目錄 在index加 <view class"select"><common-title></common-title></view> 圖片換了下&#xff0c;原來的有點丑&#xff0c;圖片可按自己喜歡…

其他 vector 操作詳解(四十)

介紹 除去向 vector 添加元素&#xff08;如 push_back&#xff09;之外&#xff0c;vector 還提供了許多其他操作&#xff0c;這些操作大多與 string 的操作類似。通過掌握這些操作&#xff0c;我們可以方便地查詢、修改和比較 vector 中的元素&#xff0c;從而構建靈活、高效…

【Leetcode 每日一題】368. 最大整除子集

問題背景 給你一個由 無重復 正整數組成的集合 n u m s nums nums&#xff0c;請你找出并返回其中最大的整除子集 a n s w e r answer answer&#xff0c;子集中每一元素對 ( a n s w e r [ i ] , a n s w e r [ j ] ) (answer[i], answer[j]) (answer[i],answer[j]) 都應當…

python基礎-13-處理excel電子表格

文章目錄 【README】【13】處理Excel電子表格【13.1】Excel文檔【13.2】安裝openpyxl模塊【13.3】讀取Excel文檔【13.3.1】使用openpyxl模塊打開excel文檔【13.3.2】從工作簿取得工作表【13.3.3】從工作表sheet獲取單元格cell【13.3.5】從表中獲取行和列【13.3.6】工作簿、工作…

ABS函數c++

簡介&#xff1a; abs 函數用于計算一個數的絕對值&#xff0c;在 C 中它繼承自 C 語言的標準庫&#xff0c;其歷史可以追溯到早期的 C 語言發展歷程&#xff0c;以下是詳細介紹&#xff1a; 早期編程語言的需求 在計算機編程的早期階段&#xff0c;處理數學運算就是一項基本…

閉環SOTA!北航DiffAD:基于擴散模型實現端到端自動駕駛「多任務閉環統一」

端到端自動駕駛目前是有望實現完全自動駕駛的一條有前景的途徑。然而&#xff0c;現有的端到端自動駕駛系統通常采用主干網絡與多任務頭結合的方式&#xff0c;但是它們存在任務協調和系統復雜度高的問題。為此&#xff0c;本文提出了DiffAD&#xff0c;它統一了各種駕駛目標并…

整車CAN網絡和CANoe

車載網絡中主要包含有Can網絡,Lin網絡,FlexRay,Most,以太網。 500kbps:500波特率,表示的數據傳輸的速度。表示的是最大的網速傳輸速度。也就是每秒 500kb BodyCan車身Can InfoCan娛樂信息Can 車身CAN主要連接的是ESB電動安全帶 ADB自適應遠光燈等 PTCan動力Can 底盤Can

實戰設計模式之迭代器模式

概述 與上一篇介紹的解釋器模式一樣&#xff0c;迭代器模式也是一種行為設計模式。它提供了一種方法來順序訪問一個聚合對象中的各個元素&#xff0c;而無需暴露該對象的內部表示。簡而言之&#xff0c;迭代器模式允許我們遍歷集合數據結構中的元素&#xff0c;而不必了解這些集…

JVM 垃圾回收器是如何判斷一個對象是否要回收?

JVM 垃圾回收器&#xff08;Garbage Collector&#xff09;需要判斷哪些對象是“垃圾”&#xff0c;即不再被程序使用的對象&#xff0c;以便回收它們占用的內存。JVM 主要使用以下兩種方法來判斷對象是否是垃圾&#xff1a; 1. 引用計數算法 (Reference Counting): 原理&…