C++:首先我们需要创建一个插件类,个人建议使用UE4插件界面创建,该好处会把一些基础类给你创建出来,我使用的是编辑器模式类插件
该插件可在窗口模式那里创建新的窗口
类创建好之后我们就可以看见UE4自身帮你创建了三个类(XXclass,XXModeclass,XXModeToolkitclass),我们写UI层逻辑主要是在XXModeToolkitclass这个类里面写,该类里面就Init()函数就是用来写SlateUI的,其中的ToolkitWidget变量是该SlateUI的最低层的UI,一般情况你不需要改变它,当然,你如果不需要SBorder类,而且其他类可以改变它
SAssignNew(ToolkitWidget, SBorder) .HAlign(HAlign_Fill) .Padding(25) .IsEnabled_Static(&Locals::IsWidgetEnabled)
其中的绑定函数IsEnabled_Static()有一个_Static()的意思是你需要绑定的函数必须前面加static,当然你不传入其他参数可以直接使用IsEnabled(this,&Locals::XXXX)该绑定函数,有可能有些人不想用静态函数,那你们可以使用IsEnabled_Raw()该函数(我后面会使用到),如果有不清楚的可以查看SLATE_EVENT()该函数的各种定义,如果有时间我也可以粗略讲解一下。
创建各个SlateUI的过程就不一一赘述,可查看代码观看(我写这个很多地方都是参考UE4源码来写的,如果不想局限于UMG可以多看看UMG对应的SlateUI写法,对写插件会有很多帮助):
SAssignNew(ToolkitWidget, SBorder) .HAlign(HAlign_Fill) .Padding(25) .IsEnabled_Static(&Locals::IsWidgetEnabled) [ SNew(SVerticalBox) + SVerticalBox::Slot() .AutoHeight() .HAlign(HAlign_Fill) .Padding(0) [ SNew(SHorizontalBox) + SHorizontalBox::Slot() [ SNew(STextBlock) .Text(LOCTEXT("LightSelectTitle", "灯光类型:")) ] + SHorizontalBox::Slot() .AutoWidth() [ SNew(SComboBox< TSharedPtr<FString> >) .OptionsSource(&Options) .InitiallySelectedItem(CurrentOptionPtr) .OnGenerateWidget(this, &FLightBatchUpDataValueEdModeToolkit::HandleGenerateWidget) .OnSelectionChanged(this, &FLightBatchUpDataValueEdModeToolkit::HandleSelectionChanged) [ SNew(STextBlock) .Text(this, &FLightBatchUpDataValueEdModeToolkit::GetSelectedSubjectName) ] ] ] + SVerticalBox::Slot() .VAlign(VAlign_Fill) .Padding(0.f,20.f) .AutoHeight() [ //CreateParametersSet() SAssignNew(ParameterWidget, SVerticalBox) ] + SVerticalBox::Slot() .HAlign(HAlign_Center) .AutoHeight() [ SNew(SButton) .Text(LOCTEXT("ButtonLabel", "应用")) .OnClicked(this, &FLightBatchUpDataValueEdModeToolkit::OnButtonClick) ] ];
.cpp
现在的地方就是我们需要创建多少个参数项,如果我们都是创建修改一个float型控件如果都直接写在上面那个SlateUI结构里面太费时间,但如果我们用for循环来创建控件,当响应的时候并不知道是创建的哪个指针响应的值,比如创建SSpinBox<float>类,返回的OnValueCommitted()和OnValueChanged()都是不包括自身指针,所以我们需要判定玩家是哪个响应,就使用刚刚我说的_Raw函数或者_Static函数:
...SNew(SSpinBox<float>) .Value(1.f) .OnValueCommitted_Raw(this,&FLightBatchUpDataValueEdModeToolkit::HandleOnValueCommitted, ID) //我写的就是多传入一个int型的ID,当然你也可以传入其他值...
当你多传入一个值是,那你绑定函数则也需要多输入一个值:
void HandleOnValueCommitted(float InValue, ETextCommit::Type CommitMethod, int ID);
这样就可以让知道我们响应的是哪一个指针。
现在我们需要知道美术会在关卡中选择哪些资源,那我们需要用到UE4提供的GetSelectedActors():
USelection* SelectedActors = GEditor->GetSelectedActors();
如果我们有其他插件也修改过灯光,比如前面我写的类LODlight的灯光控件,我怎么才能使用到那个插件库,并一起批量修改,我当时想的方法就是把他们包含到一个.uplugin中(意思就是把两个插件合成一个插件,这样方便另一个同插件库调用):
"Modules": [ { "Name": "LightBatchUpDataValue", "Type": "Editor", "LoadingPhase": "Default" }, { "Name": "CurveRouteCreate", "Type": "Runtime", "LoadingPhase": "Default", "WhitelistPlatforms": [ "Win64" ] } ]
这样我们的批量修改灯光控件就可以在自身的.cs文件里面添加该库:
PrivateDependencyModuleNames.AddRange( new string[] { ... "CurveRouteCreate" // ... add private dependencies that you statically link with here ... } );
如果想查看完整代码:https://github.com/a948022284/UE4SpecialLightEditorPlugins
原文地址:https://www.cnblogs.com/monocular/p/11555900.html