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

news2024/10/7 10:20:57

目录

创建插件:

功能制作:

基础构造:

代码:

准备:

代码:


之前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;//委托句柄

};

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

基本上都是一模一样的 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/443298.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

CT前瞻(二):Vant4实战之Card卡片与Cell单元格

文章目录 📋前言🎯关于 Card卡片 和 Cell单元格 组件🧩Cell单元格🧩Card卡片 🎯实战代码📝最后 📋前言 最近在项目开发和学习的过程中,涉及到了Vant UI(简称Vant&#x…

气传导耳机和骨传导耳机的区别是啥?气传导耳机有哪些优缺点?

本文主要讲解一下气传导耳机和骨传导耳机的区别、气传导耳机的优缺点,并推荐一些目前主流的气传导耳机款式,大家可以根据自身需求,选择自己感兴趣的部分观看。 气传导耳机和骨传导耳机不同点: 气传导耳机和骨传导耳机最大且最根…

HTML+CSS+JS 学习笔记(二)———CSS

🌱博客主页:大寄一场. 🌱系列专栏:前端 🌱往期回顾:HTMLCSSJS 学习笔记(一)———HTML(上) HTMLCSSJS 学习笔记(一)———HTML(中) HTMLCSSJS 学习笔记&#…

数字信号预处理——平滑和去噪

数字信号预处理 对信号进行去噪、平滑和去趋势处理,为进一步分析做好准备。从数据中去除噪声、离群值和乱真内容。增强信号以对其可视化并发现模式。更改信号的采样率,或者使不规则采样信号或带缺失数据信号的采样率趋于恒定。为仿真和算法测试生成脉冲…

看完这篇文章你就彻底懂啦{保姆级讲解}-----(LeetCode刷题59螺旋矩阵II) 2023.4.20

目录 前言算法题(LeetCode刷题59螺旋矩阵II)—(保姆级别讲解)分析题目:算法思想(重要)螺旋矩阵II代码: 结束语 前言 本文章一部分内容参考于《代码随想录》----如有侵权请联系作者删…

英码科技深元ai工作站在化工园区应用,保障安全生产

当今,随着工业化进程的不断推进,化工产业作为重要的基础产业之一,为社会经济发展做出了巨大贡献。然而,随着化工园区规模的不断扩大,化工园区内的安全问题和环境问题也日益突出。因此,如何通过科技手段提升…

网络安全文章汇总导航(持续更新)

网络安全文章汇总导航(持续更新) 1. 介绍1.1. 初衷1.2. 更新时段1.3.最近更新时间及内容 2. 文章列表2.1. 基础篇2.2. 工具篇2.3. 靶场安装篇2.4. 权限提升篇2.5. 漏洞复现篇2.6. 加固与排查篇2.7. APP渗透篇2.8. 其它基础篇 1. 介绍 本章主要将博客中的…

ROS学习第十二节——话题通信控制小乌龟

1.基操一下 首先打开小乌龟程序和键盘控制程序 rosrun turtlesim turtlesim_node rosrun turtlesim turtle_teleop_key 查看话题列表 rostopic list 打开计算图查看具体是那个话题在起作用 rqt_graph 从上图可以看到两个节点之间的话题是 /turtle1/cmd_vel 使用以下命令获…

从零学习SDK(7)如何打包SDK

打包SDK的目的是为了方便将SDK提供给其他开发者或用户使用,以及保证SDK的兼容性和安全性。打包SDK可以有以下几个好处: 减少依赖:打包SDK可以将SDK所需的库、资源、文档等打包成一个文件或者一个目录,这样就不需要用户再去安装或…

直播app源码,流媒体自建好还是用第三方好

随着移动互联网的发展,直播应用已经成为人们日常生活中的一部分。但是,很多人在开发自己的直播app时,面临一个问题:自建直播流媒体服务器还是使用第三方直播平台?在本文中,我们将分析这两种选择的优缺点&am…

TLS简单介绍

第一篇是我同事讲的,第二篇在网上参考的。 两篇一起看,基本能搞懂TLS。 1、 概述 TLS(Transport Layer Security,安全传输层),TLS是建立在传输层TCP协议之上的协议,服务于应用层,它的前身是SS…

C# switch case语句入门and业务必知点

具体的语法形式如下。 switch(表达式) { case 值 1: 语句块 1; break; case 值 2: 语句块 2; break; ... default: 语句块 n; break; } 在这里,switch 语句中表达式的结果必须是整型、字符串…

2023年第一季度京东平台手机品牌销量排行榜

4月19日,调研机构Canalys发布了2023年第一季度的全球智能手机市场报告。根据数据显示,今年Q1全球智能手机市场份额TOP 5分别是三星(22%)、苹果(21%)、小米(含Redmi,11%)、…

git仓库

新的连接:将github账号或者gitee账号与可视化工具连接 操作仓库的大体过程: 连接之后将中央仓库里的东西,clone(克隆)到自己仓库中, 自己改完代码就push(更新)进中央仓库 连接之后…

JavaSE学习进阶day06_03 Collections类和Map集合

第三章 Collections类 3.1 Collections常用功能 java.utils.Collections是集合工具类&#xff0c;用来对集合进行操作。 常用方法如下&#xff1a; public static void shuffle(List<?> list):打乱集合顺序。 public static <T> void sort(List<T> list)…

Jenkins 在Windows下安装配置

下载 下载支持JDK1.8最后的版本&#xff0c;这个版本以上的都是JDK11&#xff0c;12的 https://mirrors.tuna.tsinghua.edu.cn/jenkins/war-stable/2.346.1/jenkins.war运行 进入目录&#xff0c;运行war java -jar jenkins.war如果你的JDK版本不支持的话就会报错了&#x…

蓝桥杯2023年第十四届省赛真题python A组 (个人的做题记录,没有全对,可以通过部分测试点)

试题 A: 特殊日期 本题总分&#xff1a;5 分 【问题描述】 记一个日期为 yy 年 mm 月 dd 日&#xff0c;统计从 2000 年 1 月 1 日到 2000000 年 1 月 1 日&#xff0c;有多少个日期满足年份 yy 是月份 mm 的倍数&#xff0c;同时也是 dd 的倍数。 【答案提交】 这是一道结果…

SSM整合-Spring整合SringMVC、Mybatis,ssm测试

SSM 整合简介 一、SSM整合介绍 ​ SSM&#xff08;Spring SpringMVC Mybatis) 整合&#xff0c;就是三个框架协同开发。 二、框架分工 Spring 整合 Mybatis&#xff0c;就是将 Mybatis 核心配置分拣当中数据源的配置、事务管理、工厂的配置、Mapper接口的实现类等 交给Sp…

ROS学习第十八节——launch文件(详细介绍)

1.概述 关于 launch 文件的使用已经不陌生了&#xff0c;之前就曾经介绍到: 一个程序中可能需要启动多个节点&#xff0c;比如:ROS 内置的小乌龟案例&#xff0c;如果要控制乌龟运动&#xff0c;要启动多个窗口&#xff0c;分别启动 roscore、乌龟界面节点、键盘控制节点。如果…

月薪10k和40k的程序员差距有多大?

程序员的薪资一直是大家关注的焦点&#xff0c;相较于其他行业&#xff0c;程序员的高薪也是有目共睹的&#xff0c;而不同等级的程序员处理问题的方式与他们的薪资直接挂钩。 接下来就一起看一下月薪10k、20k、30k、40k的程序员面对问题都是怎么处理的吧&#xff01; 场景一 …