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.mzph.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): 原理&…