跳至主要內容

ED12.EdGraph|自定义Node/Pin外观

Mr.Si大约 1 分钟u++

需求

头像
默认的节点外观有点丑耶
头像
自定义一个不就行了
头像
我不会
头像
跟着老夫做一遍

FGraphPanelNodeFactory

头像

用于把 UEdGraphNode 映射成 Slate 可视化节点(SGraphNode) 的工厂

UEdGraphNode   ——(NodeFactory)——>   SGraphNode
数据节点                UI节点
头像
也就是说:
  • UEdGraphNode = 编辑器数据节点(逻辑层)
  • SGraphNode = 视觉层 Slate Widget(长什么样)
  • FGraphPanelNodeFactory = 决定这个节点显示成什么样

流程

自定义 SGraphNode

class SComboGraphNode : public SGraphNode
{
public:
	SLATE_BEGIN_ARGS(SComboGraphNode) {}
	SLATE_END_ARGS()

	void Construct(const FArguments& InArgs, UComboGraphEdNode* InNode)
	{
		this->GraphNode = InNode;
		UpdateGraphNode();
	}

	virtual void UpdateGraphNode() override;
};
头像
这样咱就可以
  • 自定义标题
  • 自定义背景颜色
  • 自定义布局
  • 添加图标
  • 添加动画
  • 添加额外信息

写之前介绍过的NodeFactory

struct XXX_API FComboNodeFactory : public FGraphPanelNodeFactory
{
	virtual TSharedPtr<class SGraphNode> CreateNode(class UEdGraphNode* InNode) const override;
};
头像
这个函数的作用是:

如果是你的战斗图节点 → 返回你的 UI 类 否则返回 nullptr(让其他 Factory 处理)


注册 Factory(非常关键)

头像
工厂有了,生产材料也有了,所以最终在哪里生产呢?
头像

一般在 Editor Module StartupModule() 里

TSharedPtr<FComboGraphNodeFactory> ComboNodeFactory;

void FComboGraphEditorModule::StartupModule()
{
	ComboNodeFactory = MakeShareable(new FComboGraphNodeFactory());

	FEdGraphUtilities::RegisterVisualNodeFactory(ComboNodeFactory);
}

注销:

void FComboGraphEditorModule::ShutdownModule()
{
	if (ComboNodeFactory.IsValid())
	{
		FEdGraphUtilities::UnregisterVisualNodeFactory(ComboNodeFactory);
	}
}