自定义项目设置
自定义项目设置的方式有两种。
1.继承UObject;
2.继承UDeveloperSettings;这个用起来更方便
@UDeveloperSettings方法
在创建C++类时选择全部类型,选择继承UDeveloperSettings
UCLASS中的config字段是配置文件的分类,可以用一个自定义的字符XXX。会在saved/config文件夹生成对应的XXX.ini文件

需要进行配置的参数需要用UPROPERTY(config,EditAnywhere)标记
属性一般标记:
UPROPERTY(config, EditAnywhere, Category = "分类" ,meta = (DisplayName = "别名"))
怎么使用这里面的数据呢?
两种方式:
1 const UZHDeveloperSettings* Setting = GetDefault<UZHDeveloperSettings>();
2 因为是const的缘故,所以只能在代码中获取不能修改(可能有修改方式只是不知道)
3
4 UZHDeveloperSettings* Setting = GetMutableDefault<UZHDeveloperSettings>();
5 GetMutableDefault() 是GetDefault()的可修改版本。(这不就知道了)
动态绑定修改事件
如果想要在项目设置中修改了某个属性值后立即做出响应,怎么做呢?
UDeveloperSettings类提供了一个返回委托的函数,利用这个就能做到

下面就是一个完整的绑定方式:

写代码要注意这个委托是带有两个参数的!那绑定的函数同样要有这两个参数:

这个Object参数就是设置配置文件本身。另一个参数再研究吧
编译问题
error LNK2019: 无法解析的外部符号 "
用UDeveloperSettings 类不加模块引用不能编译

@继承UObject方法
需要继承UObject类,使用ISettingsModule接口在模块的注StartupModule()函数进行注册
以nDisplay插件的项目设置文件参考:
UCLASS(config = Engine, defaultconfig)
class DISPLAYCLUSTEREDITOR_API UDisplayClusterEditorSettings : public UObject {... ...}
1 //先准备好命名 2 const FName UDisplayClusterEditorSettings::Container = TEXT("Project"); 3 const FName UDisplayClusterEditorSettings::Category = TEXT("Plugins"); 4 const FName UDisplayClusterEditorSettings::Section = TEXT("nDisplay"); 5 6 //在StartupModule()函数中调用RegisterSettings()函数 7 void FDisplayClusterEditorModule::RegisterSettings() 8 { 9 //通过FModuleManager获取到ISettingsModule接口,并调用接口函数进行注册 10 if (ISettingsModule* SettingsModule = FModuleManager::GetModulePtr<ISettingsModule>("Settings")) 11 { 12 SettingsModule->RegisterSettings( 13 UDisplayClusterEditorSettings::Container, 14 UDisplayClusterEditorSettings::Category, 15 UDisplayClusterEditorSettings::Section, 16 LOCTEXT("RuntimeSettingsName", "nDisplay"), 17 LOCTEXT("RuntimeSettingsDescription", "Configure nDisplay"), 18 GetMutableDefault<UDisplayClusterEditorSettings>() 19 ); 20 } 21 }
//在ISettingsModule接口内还有一个UnRegisterSettings函数可以取消注册
同样的,要配置的参数也要用UPROPERTY(config,EditAnywhere)标记
怎么使用这里面的数据呢?
获取参数的方式和UDeveloperSettings是一样的方法,GetDefault()
打包问题:
1.在UE5引擎中,使用ISettingsModule时,include “ISettingsModule.h”文件会在打包时报错,
报错内容:C1083 <... ...> no such file or directory。
解决办法是在.build.cs文件中添加对ISettingsModule所在模块的引用“Settings”
进一步了解一下ISettingsModule 这个接口和Container容器、Category分类、Section部件/栏这三个词
先找到ISettingsModule.h文件
1 ISettingsModule.h文件
2
3 class ISettingsContainer;
4 class ISettingsSection;
5 class ISettingsViewer;
6 class SWidget;
SettingsModule.h文件中一开始就引用了4个类,后面的两个先不管,后面再说。
三个词的含义:
Container:容器 对应class ISettingsContainer
这个类是由引擎进行“保护”管理的,在Launcher版引擎中无法自定义添加容器。那么引擎给我们提供了几种容器呢?
两种:“Editor”“Project”
乍一看有点眼熟的感觉,这两个代表的就是UE的项目设置和编辑器偏好设置,这两个容器是在ISettingsModule的StartUpModule函数进行创建的。
Container:容器
1 //这里代码太长了 2 //SettingsModule.cpp 3 4 virtual void StartupModule() override 5 { 6 TSharedRef<FSettingsContainer> EditorSettingsContainer = FindOrAddContainer("Editor"); 7 EditorSettingsContainer->Describe(LOCTEXT("EditorPreferencesSubMenuLabel", "Editor Preferences"), LOCTEXT("EditorPreferencesSubMenuToolTip", "Configure the behavior and features of this Editor"), NAME_None); 8 EditorSettingsContainer->DescribeCategory("General", LOCTEXT("EditorGeneralCategoryName", "General"), LOCTEXT("EditorGeneralCategoryDescription", "General Editor settings description text here")); 9 EditorSettingsContainer->DescribeCategory("LevelEditor", LOCTEXT("EditorLevelEditorCategoryName", "Level Editor"), LOCTEXT("EditorLevelEditorCategoryDescription", "Level Editor settings description text here")); 10 EditorSettingsContainer->DescribeCategory("ContentEditors", LOCTEXT("EditorContentEditorsCategoryName", "Content Editors"), LOCTEXT("EditorContentEditorsCategoryDescription", "Content editors settings description text here")); 11 EditorSettingsContainer->DescribeCategory("Plugins", LOCTEXT("EditorPluginsCategoryName", "Plugins"), LOCTEXT("EditorPluginsCategoryDescription", "Plugins settings description text here")); 12 EditorSettingsContainer->DescribeCategory("Advanced", LOCTEXT("EditorAdvancedCategoryName", "Advanced"), LOCTEXT("EditorAdvancedCategoryDescription", "Advanced editor settings")); 13 ... ... 14 TSharedRef<FSettingsContainer> ProjectSettingsContainer = FindOrAddContainer("Project"); 15 ... ... 16 }
//上面代码加黑的就是了,其中红色的就是引擎给的容器,也就是Container:容器
Category分类、Section部件

动态绑定修改事件
1 TSharedPtr<ISettingsSection> SettingS; 2 SettingS = FModuleManager::LoadModuleChecked<ISettingsModule>("Settings").RegisterSettings("Project","Plugins", 3 TEXT("UE4EditorCustomize"), FText::FromString("UE4 EditorCustomize"), 4 FText::FromString("Setting For UE4EditorCustomize"), GetMutableDefault<UEditorCustomizeSetting>()); 5 SettingS->OnModified().BindRaw(this, &FUE4EditorCustomizeModule::OnSettingModified);
//这个例子的主要问题就是怎么获取到ISettingsSection的,在通过ISettingsSection进行绑定。

浙公网安备 33010602011771号