UE4/5多人游戏详解(五、创建多人游戏插件)

目录

创建插件:

功能制作:

基础构造:

代码:

准备:

代码:


之前4个内容,我简单的讲解了一个项目中如何加入多人会话。

现在我们做一个插件,这样就不需要每一次创建项目的时候就要重新制作一次了。

创建插件:

第一步,打开插件,然后添加

在这里你可以写插件的名字和作者,以及你对插件的描述。

在这里我们选择空白的进行创建。

 然后我们打开这个插件中的.uplugin文件:

 

我们可以看见这个插件的模块名字,以及其执行的类型:Runtime

然后我们需要添加这个插件使用的时候,要使用什么类型的插件,所以:

和上面模块的语法一样,不过要记得加“,”,这表示该插件要依赖OnlineSubsystemOnlineSubsystemSteam的插件,其中的Enabled是表示需要这个OnlineSubsystemOnlineSubsystemSteam是需要打开的。

然后我们看到.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;//委托句柄

};

 在将上面这些一一实现之后,我们就可以开始在构造函数中绑定回调函数了:

基本上都是一模一样的 

猜你喜欢

转载自blog.csdn.net/q244645787/article/details/130211405