【UE5 C++课程系列笔记】16——DeveloperSettings(开发者设置)的基本使用——创建配置文件
概念
DeveloperSettings
是一种用于存储项目级别的开发相关设置和配置信息的机制。它允许开发者在虚幻引擎项目中定义一些全局的、可调整的参数,这些参数通常与项目的开发过程、调试或者特定功能的配置相关,并且可以方便地在编辑器环境下进行可视化编辑,无需直接修改代码就能改变这些设置,极大地提高了开发的灵活性和便利性,尤其适用于在开发阶段快速调整各种参数以进行测试、调试以及优化工作。
例如,开发者可以通过 DeveloperSettings
来设置游戏中的调试显示选项(如显示碰撞体、显示导航网格等)、性能分析相关的采样频率、特定功能模块的开关(比如是否开启某个实验性的游戏玩法功能等)等各种内容,不同的项目可以根据自身需求定制不同的 DeveloperSettings
类来管理对应的设置信息。
基本使用(创建配置文件)
1. 新建一个空白C++类,这里命名为“SampleSettings”
2. 打开“xxx.Build.cs”文件
添加“DeveloperSettings”模块
3. 在“SampleSettings.h”中引入“DeveloperSettings.h”
继续在“SampleSettings.h”中添加如下代码:
让SampleSettings
继承UDeveloperSettings。UCLASS宏包括的两个参数的意思分别为:
Config = SampleSettings
参数含义:这个参数指定了该类所对应的配置分类名称为 SampleSettings
。在UE中,不同的配置分类可以用于区分不同用途、不同模块的配置信息,例如常见的有 Engine
(用于引擎相关配置)、Game
(针对游戏层面的配置)等,这里定义的 SampleSettings
就创建了一个自定义的配置分类,后续该类中定义的所有设置变量相关的配置信息都会存储在这个分类下的配置文件中(不同平台对应的配置文件位置和格式会有所不同)。
defaultconfig
参数含义:表示这个类将会被用于存储默认配置信息,即当项目首次创建或者在没有其他特定配置覆盖的情况下,该类所定义的设置变量会采用默认的值(不过目前类里还没定义具体变量,后续添加变量后就可以为其设置默认值了)。同时,这个设置也使得该类能够在项目配置的整体体系中扮演提供默认配置的角色,方便在不同的开发环境或者项目部署场景下进行统一的默认设置管理。
添加构造函数:
实现 USampleSettings
类的构造函数如下。这里它接收一个 FObjectInitializer
类型的参数 ObjectInitializer
,该参数在UE中常用于传递对象初始化相关的各种设置信息,比如可以通过它来控制对象创建时是否自动创建某些默认的组件、是否应用特定的属性初始化值等。在构造函数中,通过 :Super(ObjectInitializer)
的语法调用了UDeveloperSettings
父类的构造函数,并将 ObjectInitializer
参数传递过去,这是 C++ 中派生类构造函数初始化列表的写法。
重写“UDeveloperSettings”父类的“GetContainerName”、“GetCategoryName”和“GetSectionName”方法。其中,函数“GetContainerName”用于返回 USampleSettings
类在配置体系中所属的容器名称;“GetCategoryName”用于指定 USampleSettings
类在配置分类方面的名称;“GetSectionName”用于指定 USampleSettings
类在具体配置章节方面的名称。
这里设置容器名称为“Project”,分类名称为“Test”,章节名称为“SampleSetting”
4. 编译后在项目设置中可以看到如下界面
5. 声明一个名为 GetXunFeiCoreSettings
的静态函数,该函数的返回值类型是指向 USampleSettings
类对象的指针
6. 定义一个名为“FSampleDescriber”结构体,用于描述项目信息
定义如下三个变量,分别用于表示项目版本号、项目描述和项目名称
7. 编译后,可以看到项目设置“Test-》SampleSettings”中有如下选项。
修改“ProjectSimpleName”的值
此时可以看到在项目路径下的“Config”文件夹中生成了一个名为“DefaultSampleSettings.ini”的文件
打开后内容如下:
“SampleSetting”完整代码:
“SampleSetting.h”
// Fill out your copyright notice in the Description page of Project Settings.
#pragma once
#include "CoreMinimal.h"
#include "Engine/DeveloperSettings.h"
#include "SampleSettings.generated.h"
USTRUCT(BlueprintType)
struct FSampleDescriber
{
GENERATED_USTRUCT_BODY()
public:
UPROPERTY(VisibleAnywhere, BlueprintReadOnly, Category = "ProjectInfo")
FString AuthorName = TEXT("None");
UPROPERTY(VisibleAnywhere, BlueprintReadOnly, Category = "ProjectInfo")
bool bExperiment = false;
};
UCLASS(Config = SampleSettings, defaultconfig)
class STUDY_API USampleSettings : public UDeveloperSettings
{
GENERATED_BODY()
public:
USampleSettings(const FObjectInitializer& ObjectInitializer = FObjectInitializer::Get());
public:
virtual FName GetContainerName() const;
virtual FName GetCategoryName() const;
virtual FName GetSectionName() const;
public:
static USampleSettings* GetXunFeiCoreSettings();
public:
UPROPERTY(VisibleAnywhere, BlueprintReadOnly)
FString ProjectVersion = TEXT("1.0.0");
UPROPERTY(VisibleAnywhere, BlueprintReadOnly)
FSampleDescriber SampleDescribe;
UPROPERTY(Config, EditAnywhere, BlueprintReadWrite)
FString ProjectSimpleName = TEXT("Sample");
};
// Fill out your copyright notice in the Description page of Project Settings.
#include "Config/SampleSettings.h"
USampleSettings::USampleSettings(const FObjectInitializer& ObjectInitializer):Super(ObjectInitializer)
{
}
FName USampleSettings::GetContainerName() const
{
return TEXT("Project");
}
FName USampleSettings::GetCategoryName() const
{
return TEXT("Test");
}
FName USampleSettings::GetSectionName() const
{
return FName("SampleSetting");
}
USampleSettings* USampleSettings::GetXunFeiCoreSettings()
{
USampleSettings* Settings = GetMutableDefault<USampleSettings>();
return Settings;
}