UE4灯光批量修改插件(如:把关卡中选中的灯光的光照强度同时乘以1.5倍)(C++篇)

Posted monocular

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了UE4灯光批量修改插件(如:把关卡中选中的灯光的光照强度同时乘以1.5倍)(C++篇)相关的知识,希望对你有一定的参考价值。

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

以上是关于UE4灯光批量修改插件(如:把关卡中选中的灯光的光照强度同时乘以1.5倍)(C++篇)的主要内容,如果未能解决你的问题,请参考以下文章

ue4怎样给骨骼网格体设置灯光通道

Unity中的灯光和渲染

Unity中的灯光和渲染

带有着色器的 2D 照明 - 受窗口大小影响的光半径

ue4太阳光下阴影有断点

Three.js 之灯光