目录
概念
基本使用案例
效果
步骤
概念
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
实例可以在不同关卡中持久的存在。