【UE5 C++课程系列笔记】13——GameInstanceSubsystem的简单使用

发布于:2025-02-11 ⋅ 阅读:(113) ⋅ 点赞:(0)

目录

概念

基本使用案例

效果

步骤


概念

  UGameInstanceSubsystem 类继承自 USubsystem,它与 GameInstance 紧密关联,旨在为游戏提供一种模块化、可方便扩展和管理的功能单元机制。在整个游戏运行期间,一个 GameInstance 可以包含多个 UGameInstanceSubsystem 实例,每个实例负责处理特定方面的逻辑,并且可以在不同的游戏场景、关卡之间持久化地存在(只要 GameInstance 本身没被销毁),便于实现跨场景共享数据和功能的需求。

基本使用案例

        通过一个小案例来证明UGameInstanceSubsystem 实例可以在不同关卡中持久的存在,同时介绍UGameInstanceSubsystem 的简单使用。

效果

        实现效果如下图所示,通过UGameInstanceSubsystem 类来跨关卡共享全局变量。可以看到在第1个关卡中数值从100加到130,当切换到第2个关卡后,继续在140的基础上加到160。

步骤

1. 新建一个普通的C++类和一个Actor类,这里分别命名为“SimpleSubsystem”和“WorkActor”

2.  在“SimpleSubsystem.h”中添加如下代码。主要定义一个名为 USimpleSubsystem 的类,它继承自 UGameInstanceSubsystem,在该类中定义了一个名为“CurrentHealth”的变量和两个函数AddHealth、GetHealth。然后重写了父类的ShouldCreateSubsystem、Initialize、Deinitialize的方法。

// Fill out your copyright notice in the Description page of Project Settings.

#pragma once

#include "CoreMinimal.h"
#include "Subsystems/GameInstanceSubsystem.h"

#include "SimpleSubsystem.generated.h"

UCLASS()
class STUDY_API USimpleSubsystem : public UGameInstanceSubsystem
{
	GENERATED_BODY()

public:
	virtual bool ShouldCreateSubsystem(UObject* Outer) const override;

	virtual void Initialize(FSubsystemCollectionBase& Collection) override;  //在子系统初始化阶段会被调用的重要函数,用于进行各种初始化操作

	virtual void Deinitialize() override;  //在GameInstance销毁或者子系统要被卸载时被调用

public:
	UFUNCTION(BlueprintCallable)
	void AddHealth(int32 InHealthToAdd);
	UFUNCTION(BlueprintCallable)
	int32 GetHealth();

private:
	int32 CurrentHealth = 100;
};

3. 在在“SimpleSubsystem.cpp”中主要实现了函数AddHealth、GetHealth

4. 在UEEditor中创建派生自“WorkActor”的蓝图类“BP_WorkActor”

打开“BP_WorkActor”,在事件图表中通过调用“SimpleSubsystem”的函数AddHealth,使得“SimpleSubsystem”的变量CurrentHealth的值增加

5. 新建两个关卡如下

 在关卡“Map_Test”的关卡蓝图中每帧调用“SimpleSubsystem”的函数GetHealth,来打印输出变量CurrentHealth的值。通过1键切换关卡到“Map_Test1”

在关卡“Map_Test1”的关卡蓝图中同样每帧调用“SimpleSubsystem”的函数GetHealth

6. 为了区分两个关卡,分别在关卡“Map_Test”和“Map_Test1”中加入方块和球体

 然后向两个关卡中都加入“BP_WorkActor”。

最终运行效果如文章开头所示。证明了UGameInstanceSubsystem 实例可以在不同关卡中持久的存在。


网站公告

今日签到

点亮在社区的每一天
去签到