// 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(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()->TryCreateConnection(FromPin, Pin); break; } } } return NewNode; } void UDialogueGraphSchema::CreateDefaultNodesForGraph(UEdGraph& Graph) const { FGraphNodeCreator 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 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 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