UE4自定义资源和编辑器(四):添加图表节点

本文介绍了在UE4中添加自定义图表节点的详细步骤,包括创建Node类、Pin类、ConnectionDrawingPolicy类,注册工厂类以及在GraphScheme中补充逻辑。通过自定义EntryNode、StateNode和TransitionNode,实现类似UE4动画状态机的图表编辑功能。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

简介

为了添加自定义的节点,主要需要注意3个类,Node类、Pin类、ConnectionDrawingPolicy类(连线)。这些类都是由FStateMachineGraphNodeFactory工厂类创建,该工厂类需要在模块类中注册。此外,还需要在UStateMachineGraphSchema类中写一些图表节点操作的逻辑。

  • 最后的效果如下
    在这里插入图片描述
    包含3种类型的节点,EntryNode,StateNode,TransitionNode,为此需要自定义Node、Pin、Connection的样式。我们主要是参考UE4中动画状态机部分的相关代码,其中都有相应的实现。
  • 文件结构如下
    Node

添加节点类

以状态机节点为例,先添加UStateNode类和对应的Slate类。其实也就是把UE4中AnimStateNode部分的代码拷贝过来,按自己的需求进行修改。

  • StateNode.h
UCLASS(MinimalAPI)
class UStateNode : public UEdGraphNode
{
   
	GENERATED_BODY()

public:
	virtual void AllocateDefaultPins() override;
	virtual void AutowireNewNode(UEdGraphPin* FromPin) override;
	virtual UEdGraphPin* GetInputPin() const {
    return Pins[0]; }
	virtual UEdGraphPin* GetOutputPin() const {
    return Pins[1]; }
	virtual FString GetStateName() const {
    return TEXT("MyState"); }
	TArray<UTransitionNode*>& GetTransitionNodes();//The TransitionNodes to next state

private:
	TArray<UTransitionNode*> TransitionNodes;
};
  • StateNode.cpp
void UStateNode::AllocateDefaultPins()
{
   
	CreatePin(EGPD_Input, FName("StateNodePin"), FName("In"));//Pins[0]
	CreatePin(EGPD_Output, FName("StateNodePin"), FName("Out"));//Pins[1]
}

void UStateNode::AutowireNewNode(UEdGraphPin* FromPin)
{
   
	Super::AutowireNewNode(FromPin);

	//@TODO: If the FromPin is a state, create a transition between us
	if (FromPin)
	{
   
		if (GetSchema()->TryCreateConnection(FromPin, GetInputPin()))
		{
   
			FromPin->GetOwningNode()->NodeConnectionListChanged();
		}
	}
}

TArray<UTransitionNode*>& UStateNode::GetTransitionNodes()
{
   
	return TransitionNodes;
}

对应的Slate类

  • SGraphNodeState.h
class SGraphNodeState : public SGraphNode
{
   
public:
	SLATE_BEGIN_ARGS(SGraphNodeState){
   }
	SLATE_END_ARGS()

	void Construct(const FArguments& InArgs, UStateNode* InNode);

	// SNodePanel::SNode interface
	virtual void GetNodeInfoPopups(FNodeInfoContext* Context, TArray<FGraphInformationPopupInfo>& Popups) const override;
	// End of SNodePanel::SNode interface

	// SGraphNode interface
	virtual void UpdateGraphNode() override;
	virtual void CreatePinWidgets() override;
	virtual void AddPin(const TSharedRef<SGraphPin>& PinToAdd) override;
	virtual TSharedPtr<SToolTip> GetComplexTooltip() override;
	// End of SGraphNode interface
protected:
	FSlateColor GetBorderBackgroundColor() const;
	virtual FText GetPreviewCornerText() const;
	virtual const FSlateBrush* GetNameIcon() const;
};
  • SGraphNodeState.cpp
class SStateMachineOutputPin : public SGraphPin
{
   
public:
	SLATE_BEGIN_ARGS(SStateMachineOutputPin){
   }
	SLATE_END_ARGS()

	void Construct(const FArguments& InArgs, UEdGraphPin* InPin);
protected:
	// Begin SGraphPin interface
	virtual TSharedRef<SWidget>	GetDefaultValueWidget() override;
	// End SGraphPin interface

	const FSlateBrush* GetPinBorder() const;
};

void SStateMachineOutputPin::Construct(const FArguments
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值