简介
为了添加自定义的节点,主要需要注意3个类,Node类、Pin类、ConnectionDrawingPolicy类(连线)。这些类都是由FStateMachineGraphNodeFactory工厂类创建,该工厂类需要在模块类中注册。此外,还需要在UStateMachineGraphSchema类中写一些图表节点操作的逻辑。
- 最后的效果如下
包含3种类型的节点,EntryNode,StateNode,TransitionNode,为此需要自定义Node、Pin、Connection的样式。我们主要是参考UE4中动画状态机部分的相关代码,其中都有相应的实现。 - 文件结构如下
添加节点类
以状态机节点为例,先添加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