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) ] ];
现在的地方就是我们需要创建多少个参数项,如果我们都是创建修改一个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
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- 这样设置IDEA,让你爽到飞起!
- 这些年,我写过的BUG(一)
- Selenium处理下拉列表
- 掌握好这几个css属性,少写100行js代码
- 计算机基础知识总结与操作系统 PDF 下载
- Kafka工作流程及文件存储机制
- JS破解初探,折腾到头秃的美拍视频采集下载
- 去哪儿景点信息爬取并使用Django框架网页展示
- Kubernetes v1.15.3 升级到 v1.18.5 心得
- 结巴分词seo应用,Python jieba库基本用法及案例参考
- nali一个可以查询IP归属和CDN的命令
- 图片采集,python多线程采集头像图片源码附exe程序及资源包
- Python json数据爬取处理,红点官网大奖设计作品爬取
- 斗图狂魔必备沙雕表情包,python多线程爬取斗图啦表情图片
- 5个基本Linux命令行工具的现代化替代品