当前位置: 首页 > news >正文

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类为父类创建

在关卡中显示

相关文章:

  • 剑指Offer(数据结构与算法面试题精讲)C++版——day6
  • lerobot[评估策略,训练策略]
  • C++ 标准库 vector(三十七)
  • (51单片机)独立按键控制流水灯LED流向(独立按键教程)(LED使用教程)
  • day40——种花问题(LeetCode-605)
  • chromadb 安装和使用
  • Lecture 44: NVIDIA Profiling (未完)
  • 10种电阻综合对比——《器件手册--电阻》
  • CNN-SE-Attention-ITCN多特征输入回归预测(Matlab完整源码和数据)
  • DeepSeek推动办公智能向“人机共智”阶段跃迁
  • centos7 yum install docker 安装错误
  • java面试篇 并发编程篇
  • 低代码开发:重塑软件开发的未来
  • MCP server的stdio和SSE分别是什么?
  • 网络初识 - Java
  • C# Winform 入门(11)之制作酷炫灯光效果
  • DeepSeek 教我 C++ (8) :C++ 静态类型不安全的情况
  • 内网渗透(杂项集合) --- 中的多协议与漏洞利用技术(杂项知识点 重点) 持续更新
  • Three.js 系列专题 3:光照与阴影
  • Spring Data JPA中的List底层:深入解析ArrayList的奥秘!!!
  • 网站建设哪个最好/网站seo推广营销
  • wordpress网站导航模板/网站设计制作一条龙
  • 浙江省城乡和住房建设厅网站首页/网站分析
  • 电脑版网站建设/小程序商城
  • 网站的三级页面怎么做/seo视频教学网站
  • 如何做产品网站推广/湛江seo推广外包