85 lines
2.9 KiB
C++
Raw Normal View History

2025-11-17 15:11:34 +08:00
// 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