前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >UE4 中通过单例类实现全局数据管理

UE4 中通过单例类实现全局数据管理

原创
作者头像
孤舟掠影
发布2022-11-16 17:09:03
1.4K0
发布2022-11-16 17:09:03
举报
文章被收录于专栏:永动机永动机

前言

单例模式(Singleton Pattern)是最简单的设计模式之一。这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式。这种模式涉及到一个单一的类,该类负责创建自己的对象,同时确保只有单个对象被创建。这个类提供了一种访问其唯一的对象的方式,可以直接访问,不需要实例化该类的对象。

一、前期准备

Unreal Engine 4.25.4

Visual Studio 2019

新建空白关卡和对应的用户控件。如何新建关卡可以参考以下视频

新关卡一片黑?初学者必知的UE4新建关卡时的一些设置【虚幻引擎】

控件 UI 的摆放如下图所示,一个蓝色按钮和一个红色按钮,下面对应是蓝色方和红色方的比分。

UE4中实现单例类-控件_UI.png
UE4中实现单例类-控件_UI.png

然后修改关卡蓝图,将 UMG 添加到视口。

UE4中实现单例类-关卡蓝图.png
UE4中实现单例类-关卡蓝图.png

最后启动运行关卡,预期能看到以下画面。

UE4中实现单例类-启动关卡.png
UE4中实现单例类-启动关卡.png

二、C++ 代码

新建 C++ 类,注意需要打开 显示所有类,继承自 Object 父类,并将生成的类命名为 Singleton,如下图所示。

UE4中实现单例类-单例_选择父类.png
UE4中实现单例类-单例_选择父类.png
UE4中实现单例类-单例_控件类命名.png
UE4中实现单例类-单例_控件类命名.png

编辑源码如下,需要注意的是由于反射机制, ue4 中的构造函数没办法转为私有。

代码语言:c++
复制
// Singleton.h
#pragma once

#include "CoreMinimal.h"
#include "UObject/NoExportTypes.h"
#include "HAL/ThreadingBase.h"
#include "Singleton.generated.h"

/**
 *
 */
UCLASS(BlueprintType, Blueprintable)
class SINGLETONOBJECT_API USingleton : public UObject
{
    GENERATED_BODY()

public:
    UFUNCTION(BlueprintCallable) // 蓝图可调用
        static USingleton* GetSingletonObjectIns();

    UFUNCTION(BlueprintCallable)
        void InitializeObject(); // 初始化

    UFUNCTION(BlueprintCallable)
        void AddBlueScore();

    UFUNCTION(BlueprintCallable)
        int GetBlueScore();

    UFUNCTION(BlueprintCallable)
        void AddRedScore();

    UFUNCTION(BlueprintCallable)
        int GetRedScore();

private:
    static FCriticalSection Mutex;          // 锁
    static USingleton* SingletonInstance;

    int BlueScore;
    int RedScore;

};

// Singleton.cpp
#include "Singleton.h"

USingleton* USingleton::GetSingletonObjectIns()
{
    FScopeLock ScopeLock(&Mutex);
    if (SingletonInstance == nullptr)
    {
        SingletonInstance = NewObject<USingleton>();
        SingletonInstance->InitializeObject();
    }
    return SingletonInstance;
}

void USingleton::InitializeObject()
{
    this->BlueScore = 0;
    this->RedScore = 0;
}

void USingleton::AddBlueScore()
{
    ++this->BlueScore;
}

int USingleton::GetBlueScore()
{
    return this->BlueScore;
}

void USingleton::AddRedScore()
{
    ++this->RedScore;
}

int USingleton::GetRedScore()
{
    return this->RedScore;
}

实现单例类后,我们还需要继承实现 GameInstance,这是必要的一步,因为 GameInstance 的生命周期贯穿游戏始终,否则单例类变量会在关卡切换是被系统销毁回收。以下演示了如何新建一个 GameInstance,并且将单例类作为其的私有属性成员。

UE4中实现单例类-GameInstance_选择父类.png
UE4中实现单例类-GameInstance_选择父类.png
UE4中实现单例类-GameInstance_控件类命名.png
UE4中实现单例类-GameInstance_控件类命名.png
代码语言:c++
复制
// MyGameInstance.h
#pragma once

#include "CoreMinimal.h"
#include "Engine/GameInstance.h"
#include "Singleton.h"
#include "MyGameInstance.generated.h"

/**
 *
 */
UCLASS()
class SINGLETONOBJECT_API UMyGameInstance : public UGameInstance
{
    GENERATED_BODY()

public:
    UMyGameInstance();

    UFUNCTION()
        void StartGameInstance();

private:
    USingleton* GlobalGameData;
};

// MyGameInstance.cpp
#include "MyGameInstance.h"

FCriticalSection USingleton::Mutex;
USingleton* USingleton::SingletonInstance = nullptr;

UMyGameInstance::UMyGameInstance()
{
    GlobalGameData = USingleton::GetSingletonObjectIns();
}

void UMyGameInstance::StartGameInstance()
{
    Super::StartGameInstance();
}

三、蓝图引用单例类

编写完成单例类后,具体该如何调用呢?

有两种方式,一种是 C++ 代码调用,另一种是蓝图调用。

C++ 调用很简单,一行代码即可。

代码语言:c++
复制
USingleton* SIngletonRef = USingleton::GetSingletonObjectIns();

接下来展示如何通过外部蓝图调用,在空间蓝图中编写逻辑如下。

UE4中实现单例类-蓝色按钮逻辑修改.png
UE4中实现单例类-蓝色按钮逻辑修改.png
UE4中实现单例类-红色按钮逻辑修改.png
UE4中实现单例类-红色按钮逻辑修改.png

编写完成后,保存并编译,接下来启动关卡,预期效果如下图所示。每点击一次蓝色按钮,蓝色比分加一;每点击一次红色按钮,红色比分加一。

UE4中实现单例类-红蓝比分.png
UE4中实现单例类-红蓝比分.png

Reference

  1. Global Data Access, Data Storage Class Accessible From Any CPP or BP Class During Runtime - Old UE4 Wiki
  2. UE4[C++]在虚幻引擎实现单例模式 - 知乎
  3. [UE4]线程锁FScopeLock用法_玄冬Wong的博客-CSDN博客

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 前言
  • 一、前期准备
  • 二、C++ 代码
  • 三、蓝图引用单例类
  • Reference
相关产品与服务
图片处理
图片处理(Image Processing,IP)是由腾讯云数据万象提供的丰富的图片处理服务,广泛应用于腾讯内部各产品。支持对腾讯云对象存储 COS 或第三方源的图片进行处理,提供基础处理能力(图片裁剪、转格式、缩放、打水印等)、图片瘦身能力(Guetzli 压缩、AVIF 转码压缩)、盲水印版权保护能力,同时支持先进的图像 AI 功能(图像增强、图像标签、图像评分、图像修复、商品抠图等),满足多种业务场景下的图片处理需求。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档