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类为父类创建
在关卡中显示
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。 |