自定义项目设置

自定义项目设置的方式有两种。

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进行绑定。

 

posted @ 2023-04-28 15:12  疯狂的凑脚丫  阅读(717)  评论(0)    收藏  举报