Hi I am using GitHub - jinyuliao/GenericGraph: Generic graph data structure plugin for ue4 but having trouble to create new Nodes.
I made classes which inherent from those following classes
Editor Module
-UEdNode_GenericGraphNode
-SEdNode_GenericGraphNode
Runtime Module
-UGenericGraphNode
I made a new FGraphPanelNodeFactory
class FGraphPanelNodeFactory_GenericGraphAnswer : public FGraphPanelNodeFactory
{
virtual TSharedPtr<class SGraphNode> CreateNode(UEdGraphNode* Node) const override
{
if (UEdNode_Answer* EdNode_GraphNodeAnwser = Cast<UEdNode_Answer>(Node))
{
return SNew(SedNode_Answer, EdNode_GraphNodeAnwser);
}
else if (UEdNode_GenericGraphEdge* EdNode_Edge = Cast<UEdNode_GenericGraphEdge>(Node))
{
return SNew(SEdNode_GenericGraphEdge, EdNode_Edge);
}
return nullptr;
}
};
And also a FEdGraphSchemaAction.h
USTRUCT()
struct FAssetSchemaAction_GenericGraphAnwser_NewNode : public FEdGraphSchemaAction
{
GENERATED_USTRUCT_BODY();
public:
FAssetSchemaAction_GenericGraphAnswer_NewNode(): NodeTemplate(nullptr) {}
FAssetSchemaAction_GenericGraphAnswer_NewNode(const FText& InNodeCategory, const FText& InMenuDesc, const FText& InToolTip, const int32 InGrouping)
: FEdGraphSchemaAction(InNodeCategory, InMenuDesc, InToolTip, InGrouping), NodeTemplate(nullptr) {}
virtual UEdGraphNode* PerformAction(class UEdGraph* ParentGraph, UEdGraphPin* FromPin, const FVector2D Location, bool bSelectNewNode = true) override;
virtual void AddReferencedObjects(FReferenceCollector& Collector) override;
UEdNode_Answer* NodeTemplate;
};
And I use the FEdGraphSchemaAction in the UAssetGraphSchema_GenericGraph::GetGraphContextActions
if (!Graph->NodeType->HasAnyClassFlags(CLASS_Abstract))
{
//Og Node
TSharedPtr<FAssetSchemaAction_GenericGraph_NewNode> NewNodeAction(new FAssetSchemaAction_GenericGraph_NewNode(LOCTEXT("GenericGraphNodeAction", "Generic Graph Node Tooltip"), Desc, AddToolTip, 0));
NewNodeAction->NodeTemplate = NewObject<UEdNode_GenericGraphNode>(ContextMenuBuilder.OwnerOfTemporaries);
NewNodeAction->NodeTemplate->GenericGraphNode = NewObject<UGenericGraphNode>(NewNodeAction->NodeTemplate, Graph->NodeType);
NewNodeAction->NodeTemplate->GenericGraphNode->Graph = Graph;
ContextMenuBuilder.AddAction(NewNodeAction);
//My new Node <-----------
TSharedPtr<FAssetSchemaAction_GenericGraphAnswer_NewNode> NewNodeAction2(new FAssetSchemaAction_GenericGraphAnswer_NewNode(LOCTEXT("GenericGraphNodeAction2", "Generic Graph Node Tooltip2"), Desc, AddToolTip, 0));
NewNodeAction2->NodeTemplate = NewObject<UEdNode_Answer>(ContextMenuBuilder.OwnerOfTemporaries);
NewNodeAction2->NodeTemplate->GenericGraphNode = NewObject<UGenericGraphNodeAnswer>(NewNodeAction2->NodeTemplate, Graph->NodeType);
NewNodeAction2->NodeTemplate->GenericGraphNode->Graph = Graph;
ContextMenuBuilder.AddAction(NewNodeAction2);
Visited.Add(Graph->NodeType);
}
If I implement it like this, UE crashes and says that the line is wrong, where I use my runtime class inherented from UGenericGraphNode.
NewNodeAction2->NodeTemplate->GenericGraphNode = NewObject<UGenericGraphNodeAnswer>(NewNodeAction2->NodeTemplate, Graph->NodeType);
The weird thing is that It works, if I use my original runtime class (clearly not the result I want)
NewNodeAction2->NodeTemplate->GenericGraphNode = NewObject<UGenericGraphNode>(NewNodeAction2->NodeTemplate, Graph->NodeType);
What do I do wrong?