UE4/5多人游戏详解(五、创建多人游戏插件)
目录
创建插件:
功能制作:
基础构造:
代码:
准备:
代码:
之前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;//委托句柄};
在将上面这些一一实现之后,我们就可以开始在构造函数中绑定回调函数了:
基本上都是一模一样的