目录
创建插件:
功能制作:
基础构造:
代码:
准备:
代码:
之前4个内容,我简单的讲解了一个项目中如何加入多人会话。
现在我们做一个插件,这样就不需要每一次创建项目的时候就要重新制作一次了。
创建插件:
第一步,打开插件,然后添加
在这里你可以写插件的名字和作者,以及你对插件的描述。
在这里我们选择空白的进行创建。
然后我们打开这个插件中的.uplugin文件:
我们可以看见这个插件的模块名字,以及其执行的类型:Runtime
然后我们需要添加这个插件使用的时候,要使用什么类型的插件,所以:
和上面模块的语法一样,不过要记得加“,”,这表示该插件要依赖OnlineSubsystem和OnlineSubsystemSteam的插件,其中的Enabled是表示需要这个OnlineSubsystem和OnlineSubsystemSteam是需要打开的。
然后我们看到.Build.cs文件
这里我们可以将模块放在公共依赖项(Public)或者私有依赖项(Private),如果添加到私有依赖项,说明这些模块只在我的私有源文件可用。
所以我打算是放在公共依赖项(Public)里面:
搭建完插件的基础框架之后,我们要在这个插件里面做出功能。
功能制作:
那么想要可以一个贯彻游戏的加入平台系统,我们需要的是一个游戏实例类生命周期的类。
所以这里我将会用到UGameInstanceSubsystem:
如果不理解可以看我之前写过的:
UE4/5C++Subsystem的底层源码分析解析学习【一,UE5.0.3,UGameInstanceSubsystem,UWorldSubsystem,ULocalPlayerSubsystem】_多方通行8的博客-CSDN博客
UE4/5C++Subsystem的底层源码分析解析学习【二、UE5.0.3,UEngineubsystem,UEditorSubsystem,UDynamicSubsystem】_多方通行8的博客-CSDN博客
这里要选择好自己的插件:
创建之后,可以看见这个:
为了以防万一可以把Binaries,Saved,Intermediate一样删除,然后在这里把插件内部的的Binaries和Intermediate一起删除,然后到项目重新生成。
基础构造:
先做一个简单的构造函数和用于装在线会话数据类型的智能指针
代码:
头文件:
#pragma once
#include "CoreMinimal.h"
#include "Subsystems/GameInstanceSubsystem.h"
#include "Interfaces/OnlineSessionInterface.h"
#include "MultiPlayerSessionGISubsystem.generated.h"
/**
*
*/
UCLASS()
class MULTIPLAYERSESSIONPLUGIN_API UMultiPlayerSessionGISubsystem : public UGameInstanceSubsystem
{
GENERATED_BODY()
public:
UMultiPlayerSessionGISubsystem();
protected:
private:
//会话接口
IOnlineSessionPtr mySessionInterface;
};
Cpp文件:
#include "MultiPlayerSessionGISubsystem.h"
#include "OnlineSubsystem.h"
UMultiPlayerSessionGISubsystem::UMultiPlayerSessionGISubsystem()
{
//获取子系统
IOnlineSubsystem* Subsystem = IOnlineSubsystem::Get();
if (Subsystem)
{
//从子系统中获取了会话系统,并放到我们的会话接口指针里面
mySessionInterface = Subsystem->GetSessionInterface();
}
}
准备:
代码:
// 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 "MultiPlayerSessionGISubsystem.generated.h"
/**
*
*/
UCLASS()
class MULTIPLAYERSESSIONPLUGIN_API UMultiPlayerSessionGISubsystem : public UGameInstanceSubsystem
{
GENERATED_BODY()
public:
UMultiPlayerSessionGISubsystem();
//
//会话 --公开的链接函数
//这里将输入玩家数量和会话的类型(用于匹配不同的会话)
void CreateSession(int32 playerConnectNum, FString MatchType);
//输入的是寻找会话的最大数量
void FindSession(int32 findSessionMaxNum);
//加入会话
void JoinSession(const FOnlineSessionSearchResult& SessionResult);
//删除
void DeleteSession();
//开始
void StartSession();
protected:
//回调函数,将会绑定到委托(根据委托输入对应输入对象)
void onCreateSessionComplete(FName SessionName, bool bWasSuccessful);
void onFindSessionComplete(bool bWasSuccessful);
void onJoinSessionComplete(FName SessionName, EOnJoinSessionCompleteResult::Type Result);
void onDestorySessionComplete(FName SessionName, bool bWasSuccessful);
void onStartSessionComplete(FName SessionName, bool bWasSuccessful);
private:
//会话接口
IOnlineSessionPtr mySessionInterface;
//需要添加的委托,到时候要一一对应制作回调函数
FOnCreateSessionCompleteDelegate CreateSessionCompleteDelegate;
FDelegateHandle CreateSessionCompleteDelegateHandle;//委托句柄
FOnFindSessionsCompleteDelegate FindSessionsCompleteDelegate;
FDelegateHandle FindSessionsCompleteDelegateHandle;//委托句柄
FOnJoinSessionCompleteDelegate JoinSessionCompleteDelegate;
FDelegateHandle JoinSessionCompleteDelegateHandle;//委托句柄
FOnDestroySessionCompleteDelegate DestroySessionCompleteDelegate;
FDelegateHandle DestroySessionCompleteDelegateHandle;//委托句柄
FOnStartSessionCompleteDelegate StartSessionCompleteDelegate;
FDelegateHandle StartSessionCompleteDelegateHandle;//委托句柄
};
在将上面这些一一实现之后,我们就可以开始在构造函数中绑定回调函数了:
基本上都是一模一样的