最近研究了下虚幻的图表编辑器写法,制作了个基础模板给大家用来制作自己的编辑器~

资源类型节点编辑器(提供了基础的节点编辑功能、并保存时转化为UObject的子类的运行时数据结构):

Eragon-Brisingr/XD_GraphEditor_Template​github.com

蓝图类型节点编辑器(包含资源类型节点编辑器,并且可以在节点上绑定事件和委托,定制自己的特殊蓝图逻辑,例如任务系统)

Eragon-Brisingr/XD_GraphEditor_Template​github.com

下面是我git上的readme,我偷懒就直接搬过来了(PS:使用改模板前需要前置知识:虚幻基础C++、Slate编码、虚幻反射系统。

如何使用模板

使用

创建图表

使用

使用该模板

将所有带_Template的类型改名成需要的类型名就行。

制作虚幻图表编辑器

继承类型

UEdGraphSchema

  1. EdGraphSchema里定义了图表操作的大部分全局行为
  2. 在FBlueprintEditorUtils::CreateNewGraph中将UEdGraph和EdGraphSchema建立映射

UEdGraph

EdGraph是图表实例的类型,定义了该图表的行为(例如保存图表

UEdGraphNode

  1. EdGraphNode是图表节点实例的类型,定义了节点的行为
  2. AutowireNewNode定义了节点的自动连接行为

FAssetEditorToolkit

  1. 可在初始化时调用FAssetEditorToolkit::InitAssetEditor定义面板的布局。(复杂情况参考FApplicationMode)
  2. 通过向FUICommandList的变量中注册事件(复制、粘贴、拷贝、删除等等)定义基础编辑器操作

节点行为类型

  1. FConnectionDrawingPolicy
  2. FEdGraphSchemaAction

显示类型

继承S类型实现显示行为

SGraphNode

节点的显示定义

通过UEdGraphNode::CreateVisualWidget将SNode类型和UNode类型映射上

SGraphPin

Pin的显示定义(蓝图中就是参数之类可以连线的地方)

通过SGraphNode::CreatePinWidgets将SPin与SNode映射上

资源行为类型

FAssetTypeActions_Base

  1. 定义创建资源时的分类 GetCategories
  2. 定义了资源被请求打开时的操作 OpenAssetEditor,将FAssetEditorToolkit与运行时使用的资源(UBP_Graph_Template)映射上

UFactory

工厂类,编辑器用于实例化图表资源

添加右键菜单

图表右键菜单

重写UEdGraphSchema中的GetGraphContextActions

节点右键菜单

重写UEdGraphNode中的GetContextMenuActions

重写UEdGraphSchema中的GetContextMenuActions给全局的Node或者Pin添加行为

节点错误报告

UEdGraphNode中设置ErrorMsg、bHasCompilerMessage、ErrorType(EMessageSeverity::Type)

SGraphNode在节点需要更新错误信息的地方调用UpdateErrorInfo

添加编辑器面板

FWorkflowAllowedTabSet

  1. 面板的集合
  2. 调用FWorkflowAllowedTabSet::RegisterFactory注册每个面板实例化的定义
  3. 调用FWorkflowCentricApplication::PushTabFactories(FBlueprintEditor的一个基类)注册FWorkflowAllowedTabSet

FWorkflowTabFactory

  1. 面板实例化定义的基类
  2. 继承并重写FWorkflowTabFactory::CreateTabBody实现特定面板的实例化
  3. 向FWorkflowAllowedTabSet的实例中注册该面板实例化定义(FWorkflowAllowedTabSet::RegisterFactory)

其它工具类

FGraphEditor_ClassHelper_Template

GatherClasses 搜集UClass信息

构造函数中FGraphEditor_ClassHelper_Template(UClass* InRootClass); InRootClass表示搜集的根

FGraphEditorToolkit_Template::HandleTabManagerSpawnTabGraph

创建了图表控件

拓展蓝图编辑器

效果

继承类型

UBlueprint

  1. 自定义蓝图的资源类型
  2. 调用FKismetEditorUtilities::CreateBlueprint创建蓝图资源
  3. 重写GetReparentingRules定义该蓝图类型可使用的父类

UBlueprintGeneratedClass

  1. 自定义蓝图的Runtime类型

FApplicationMode

  1. 定义了App的模式
  2. 定义了初始的界面布局
  3. FBlueprintEditor::RegisterApplicationModes中重写以映射操作
  4. 调用FWorkflowCentricApplication::PushTabFactories(FBlueprintEditor的一个基类)设置FWorkflowAllowedTabSet(所有面板的定义)
  5. FApplicationMode::ToolbarExtender为当前的工具栏,通过FBlueprintEditor::GetToolbarBuilder()->AddCompileToolbar(ToolbarExtender)向工具栏中添加功能,也可调用FExtender::AddToolBarExtension添加自定义的功能

FKismetCompilerContext

  1. 蓝图编译的过程定义
  2. 在模块初始化时注册该编译器,FKismetCompilerContext::RegisterCompilerForBP
  3. 重写FinishCompilingClass在蓝图编译后进行图表的拷贝、绑定事件的添加等操作
  4. 重写CreateClassVariablesFromBlueprint用于设计图表的变量暴露,比FBlueprintEditorUtils::AddMemberVariable的好处为变量在蓝图中不能编辑

S类型

SGraphEditor

图表编辑器的S类型

SNew(SGraphEditor).AdditionalCommands(Commands).GraphToEdit(EdGraph);

运行时绑定事件

PropertyEditor拓展类型

  1. IDetailPropertyExtensionHandler 每个属性的拓展
  2. IDetailCustomization 拓展整个Detail面板

添加绑定事件

  1. FKismetEditorUtilities::FindBoundEventForComponent
  2. FKismetEditorUtilities::CreateNewBoundEventForClass

UDynamicBlueprintBinding类型

  1. 蓝图绑定事件的基类,子类UComponentDelegateBinding就是对象绑定
  2. UBlueprintGeneratedClass::DynamicBindingObjects中存储了运行时可绑定的事件
  3. UDynamicBlueprintBinding::BindDynamicDelegates执行运行时绑定

自定义函数绑定

  1. 参考UMG模块中的FDelegateEditorBinding与FDelegateRuntimeBinding
  2. 自己的蓝图类中定义EditorBinding,GeneratedClass类型中定义RuntimeBinding
  3. 自己通过反射写运行时绑定的操作

模板使用自定义类型_自定义虚幻图表_拓展蓝图功能相关推荐

  1. oracle如何自定义类型,Oracle 自定义类型

    一.子类型 这种类型最简单,类似类型的一个别名,主要是为了对常用的一些类型简单化,它基于原始的某个类型.如: 有些应用会经常用到一些货币类型:number(16,2).如果在全局范围各自定义这种类型, ...

  2. Markdown基本语法大全_含各类图表_含例子说明

    目录 1. 目录的使用 2. 标题 3. 强调 4. 列表 5. 注脚 6. 链接和图片 7. 代码片段 8. 表格 9. 注释 10. KaTeX数学公式 11 甘特图 12 UML图表 12.1 ...

  3. aidl使用_Android进阶之AIDL如何使用自定义类型

    如何在 AIDL 中使用自定义类型,具体步骤如下: 创建自定义类型 声明自定义类型 定义与自定义类型相关的业务 重写业务实体类 远程调用 验证 AIDL 1. 创建自定义类型 自定义类型传输的就是一个 ...

  4. 【Spring5.x】对象的生命周期、配置文件参数化、自定义类型转换器、后置处理Bean

    工厂高级特性 对象的生命周期 创建阶段 初始化阶段 - InitializingBean.init-method 销毁阶段 - DisposableBean.destroy-method 对象的生命周 ...

  5. SpringMVC全局乱码过滤器、注解@RequestParam、自定义类型转换器

    目录 配置全局乱码过滤器 参数绑定注解@RequestParam 注解@RequestParam的参数使用说明 获得Restful风格的参数 自定义类型转换器 自定义转换器的开发步骤: 获得Servl ...

  6. 类模板,多种类型的类模板,自定义类模板,类模板的默认类型,数组的模板实现,友元和类模板,友元函数,类模板与静态变量,类模板与普通类之间互相继承,类模板作为模板参数,类嵌套,类模板嵌套,类包装器

     1.第一个最简单的类模板案例 #include "mainwindow.h" #include <QApplication> #include <QPush ...

  7. c++模板 --- 类模板、自定义类型当做模板参数

    生成一个类模板 类中用到了未知类型叫做类模板 用 template 修饰的类,这个类就是一个模板类 多用在数据结构中,忽略类型的问题 只要被 template 修饰,就是一个模板类,有没有用未知类型都 ...

  8. java converter转换器_在SpringMVC中设置自定义类型转换器Converter

    前言 在SpringMVC中为我们提供了许多内置的类型转换器,当我们在HTML表单中发起一个请求时,Spring会根据表单项中name属性的值映射到POJO的属性名,调用相对性属性的set方法帮我们把 ...

  9. 数据类型有自定义类型吗_自定义类型的数据表和数据集

    数据类型有自定义类型吗 I think the Typed DataTable and Typed DataSet are very good options when working with da ...

最新文章

  1. hexo使用jenkins自动部署到阿里云
  2. 开发完成的springboot项目扩展 swagger
  3. 脑机接口可以实时从脑电波中重建人脑中的图片?
  4. 重做53. Maximum Subarray
  5. 构造函数调用默认构造函数_显式无参数构造函数与默认构造函数
  6. spring-DataSource
  7. Error: A JNI error has occurred, please check your installation and try again
  8. bzoj 1951 [Sdoi2010]古代猪文 ——数学综合
  9. SqlServer标识列
  10. js 浮点数精度问题 可以用accounting.js解决
  11. 四:Jquery-animate
  12. (已拿offer)2017腾讯暑期实习生从笔试到面试总结(附带华为、阿里面试经历)...
  13. Python实现好友信息管理系统 添加、删除、修改、备注、查询好友信息
  14. MapGuide Maestro 3.0发布
  15. LM358运放(比较器、跟随器)输出最高电压问题的探讨
  16. 第2.2节 串行SPI接口控制PE4312数控衰减器
  17. CSDN_MySQL入门技能树学习整理知识点
  18. 乾隆的太医留下来的民间偏方
  19. 分布式系统设计模式 - 预写日志(Write Ahead Log)
  20. 猫哥教你写爬虫 043--模拟浏览器

热门文章

  1. 【Python】读取 txt 文件
  2. 守护线程C语言windows,C言语如何利用子线程刷新主线程
  3. bigdecimal 科学计数转普通计数_LoaRunner性能测试教程:Windows计数器(2)
  4. 基于Python-Pygame:200行代码实现完整的俄罗斯方块
  5. Linux为什么虚拟内存大于物理内存?
  6. Mac上IDA报错/:Permission denied Please specify another file path for the database
  7. win10 wsl和wsl2使用总结
  8. Android中long类型对应Java/Jni/C++中的类型
  9. 高通平台printk输出log到串口
  10. python之读取文本操作