85 lines
2.9 KiB
C++
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

// Fill out your copyright notice in the Description page of Project Settings.
#include "DialogueGraphSchema.h"
#include "Node/DialogueGraphNode_Base.h"
#include "Node/DialogueGraphNode_NPC.h"
#include "Node/DialogueGraphNode_Player.h"
#include "Node/DialogueGraphNode_Root.h"
#define LOCTEXT_NAMESPACE "DialogueGraphSchema"
UEdGraphNode* FDialogueGraphSchemaAction_NewNode::PerformAction(UEdGraph* ParentGraph, UEdGraphPin* FromPin, const FVector2D Location, bool bSelectNewNode)
{
UDialogueGraphNode_Base* NewNode = NewObject<UDialogueGraphNode_Base>(ParentGraph, ClassTemplate);
NewNode->CreateNewGuid();
NewNode->SetPostion(Location);
NewNode->InitializeNodeData();
NewNode->AllocateDefaultPins();
ParentGraph->Modify();
ParentGraph->AddNode(NewNode, true, bSelectNewNode);
// 如果从某个Pin拖拽创建自动连接
if (FromPin && NewNode->Pins.Num() > 0)
{
for (UEdGraphPin* Pin : NewNode->Pins)
{
if (Pin->Direction != FromPin->Direction)
{
GetDefault<UDialogueGraphSchema>()->TryCreateConnection(FromPin, Pin);
break;
}
}
}
return NewNode;
}
void UDialogueGraphSchema::CreateDefaultNodesForGraph(UEdGraph& Graph) const
{
FGraphNodeCreator<UDialogueGraphNode_Root> NodeCreator(Graph);
UDialogueGraphNode_Root* MyNode = NodeCreator.CreateNode(true, UDialogueGraphNode_Root::StaticClass());
NodeCreator.Finalize();
SetNodeMetaData(MyNode, FNodeMetadata::DefaultGraphNode);
}
void UDialogueGraphSchema::GetGraphContextActions(FGraphContextMenuBuilder& ContextMenuBuilder) const
{
// 添加npc对话节点
TSharedPtr<FDialogueGraphSchemaAction_NewNode> NPCNodeAction = MakeShareable(new FDialogueGraphSchemaAction_NewNode(
UDialogueGraphNode_NPC::StaticClass(),
LOCTEXT("DialogueNode_NPC_Category", "NPC Dialogue"),
LOCTEXT("DialogueNode_NPC_Desc", "NPC Dialogue Node"),
LOCTEXT("DialogueNode_NPC_Tooltip", "Create a npc dialogue node")
));
ContextMenuBuilder.AddAction(NPCNodeAction);
// 添加npc对话节点
TSharedPtr<FDialogueGraphSchemaAction_NewNode> PlayerNodeAction = MakeShareable(new FDialogueGraphSchemaAction_NewNode(
UDialogueGraphNode_Player::StaticClass(),
LOCTEXT("DialogueNode_Player_Category", "Player Dialogue"),
LOCTEXT("DialogueNode_Player_Desc", "Player Dialogue Node"),
LOCTEXT("DialogueNode_Player_Tooltip", "Create a Player dialogue node")
));
ContextMenuBuilder.AddAction(PlayerNodeAction);
}
const FPinConnectionResponse UDialogueGraphSchema::CanCreateConnection(const UEdGraphPin* A, const UEdGraphPin* B) const
{
// 不能连接自己
if (A->GetOwningNode() == B->GetOwningNode())
{
return FPinConnectionResponse(CONNECT_RESPONSE_DISALLOW, LOCTEXT("ConnectionSameNode", "Cannot connect to self"));
}
// 必须一个输入一个输出
if (A->Direction == B->Direction)
{
return FPinConnectionResponse(CONNECT_RESPONSE_DISALLOW, LOCTEXT("ConnectionSameDirection", "Must connect input to output"));
}
return FPinConnectionResponse(CONNECT_RESPONSE_MAKE, TEXT(""));
}
#undef LOCTEXT_NAMESPACE