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

原文地址:https://www.cnblogs.com/monocular/p/11555900.html

时间: 2024-10-07 11:10:45

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

shell脚本:批量修改文件名(删除文件名中字符)

shell脚本:批量修改文件名(文件名中添加字符) 上一篇写过批量修改文件名(文件名中添加字符),工作中还存在这样的需求,批量修改文件名,删除文件名中的某些字符: 举例如下:批量改名,删除文件名中多余字符 目录下文件名为如下,要求去掉_finished. stu_102999_1_finished.jpg stu_102999_2_finished.jpg stu_102999_3_finished.jpg stu_102999_4_finished.jpg stu_102999_5_finis

C#代码生成工具:文本模板初体验 使用T4批量修改实体框架(Entity Framework)的类名

转自:http://www.cnblogs.com/huangcong/archive/2011/07/20/1931107.html 在之前的文本模板(T4)初体验中我们已经知道了T4的用处,下面就看看如何用它来实现批量修改实体框架(Entity Framework)中的类名.我们都知道ADO.NET 实体数据模型中有一种方式是以数据库模型来生成数据模型的,这是个很简便的实体数据模型生成的方式,但是因为微软提供的自定义接口不足,我们无法实现对生成的数据模型实体类批量进行修改(至少我上网找了很久

DeDeCMS后台批量修改替换sql语句大全

有时候后台文章内容.标题或者锚文本出错,需要修改批量修改,那么就需要用dedecms的sql语句进行批量修改了. 利用dedecms后台SQL命令行工具批量修改内容,路径和超链接等信息.语句 DEDECMS SQL命令批量替换1.更改文章中的内容update dede_addonarticle set body=replace(body,'原来的字符','替换后的字符')例子解释:update dede_addonarticle set body=replace(body,'软件下载','插件下

Python批量修改文件格式

工作中遇到要把多个apk格式文件改成zip包格式,这是一个繁琐的步骤.利用Python脚本并自定义右键运行.py文件给工作带来很大的方便,下面做一个简单的介绍: 前置条件: 要修改的apk包名称:XXXX_CN.apk: 修改后的zip包名称:CN.zip: 操作前把批量修改的apk文件放到同一个文件夹,且把下面写好的.py脚本文件也放到里面去. Python代码: import os                          #导入os系统命令格式 format='zip'      

WordPress批量修改文章内容、URL链接、文章摘要

通过SQL语句来批量修改wordpress博客内容,文章中所有语句都使用默认的wp_表前缀,如果您的数据表前缀不是wp_则需要在语句中作相应更改. 方法/步骤 批量修改文章内容 如果您想替换之前写过的所有文章中的某些内容,如更换博客的名称.更换博客的网址.更换文章配图的链接等,您可以使用以下SQL语句: UPDATE wp_postsSET post_content = REPLACE( post_content,'旧的博客名', '新的博客名' ); 该语句的功能是将所有文章中的“旧的博客名”

Android项目编码的批量修改(GBK转UTF-8)(转载)

由于项目早期Android项目选择GBK编码,一直也没时间改.为了统一编码,打算把整个项目转变成UTF-8.传统一个一个文件修改编码,太慢太笨拙,尝试了批量改的效果不太好,项目报错.最后,找到 eclipse 有一个插件,可以修改,分享一下整个过程.  1.下载com.lifesting.tool.encoding_1.0.0.jar(http://download.csdn.net/detail/achunb604/6235849).  2.将插件com.lifesting.tool.enco

zencart批量评论插件Easy Populate CSV add reviews使用教程

此插件在Easy Populate CSV 1.2.5.7b产品批量插件基础上开发,有1.3x与1.5x两个版本. 批量评论插件安装好之后,先从后台Tool-> Easy Populate ,制作reviews评论批量表. 下载Reviews列表,点击如下图所示链接即可下载,下载后的批量表第一行如果是空白行,请删除第一行空白. 若所有产品都没有评论,下载后的评论批量表如下图所示,是没有评论内容的,只有产品型号与产品名称有内容. 各列数据代表的意思如下: v_products_model(产品型号

Dedecms sql命令批量修改内容

今天要修改一个网站的栏目命名方法,因为网站的文章数目太多了,为了方便管理和优化把栏目尽量的扁平化简单化,就要修改dedecms生成页面的命名方法,100多个栏目一个一个改要改多久啊,就从网上找了一个sql批量修改命名的方法,随便也把其他dedecms sql命名方法也发上来: select namerule from dede_arctype select namerule2 from dede_arctype update dede_arctype set namerule='{typedir

利用shell脚本批量修改表

最近公司里因为开发新功能,程序员需要快速在某一个库里的所有表添加字段,于是就用shell脚本简单快速实现批量修改表添加字段 #!/bin/bash export mysql_bin=/usr/local/mysql/bin export database=database export tables=`$mysql_bin/mysql -Bse "use ${database};show tables;"` for i in ${tables}         do