简介
GraphTab是编辑器可以创建节点和编辑节点的页签(Tab),如蓝图编辑器、行为树编辑器和动画蓝图编辑器中的图表。我们的目标是实现类似动画状态机这样的图表,也是我们主要参考引擎代码的地方。
文件结构如下:
创建图表相关类
StateMachineGraph表示页签中的图表对象,继承自UEdGraph。该类需要在StateMachine资源类中进行保存。
- StateMachineGraph.h
UCLASS(MinimalAPI)
class UStateMachineGraph : public UEdGraph
{
GENERATED_BODY()
};
- StateMachine.h
UPROPERTY()
UEdGraph* StateMachineGraph;
GraphSchema表示当前图表操作的所有逻辑,比如创建节点、右键空白处、连线等。这里空白处右键点击菜单中只添加了一个操作(SchemaAction),创建一个State节点。
- StateMachineGraphSchema.h
UCLASS(MinimalAPI)
class UStateMachineGraphSchema : public UEdGraphSchema
{
GENERATED_BODY()
private:
// 空白处右键的生成的菜单
virtual void GetGraphContextActions(FGraphContextMenuBuilder& ContextMenuBuilder) const override;
};
#define LOCTEXT_NAMESPACE "StateMachineGraphSchema"
void UStateMachineGraphSchema::GetGraphContextActions(FGraphContextMenuBuilder& ContextMenuBuilder) const
{
// Add action
FText Category = LOCTEXT("AddStateMachine", "Add State Node");
FText MenuDesc = LOCTEXT("MenuDesc", "State");
FText ToolTip = LOCTEXT("StateToolTip", "A State Node");
TSharedPtr<FEdGraphSchemaAction_CreateStateNode> NewStateNode(new FEdGraphSchemaAction_CreateStateNode(Category, MenuDesc, ToolTip, 0));
ContextMenuBuilder.AddAction(NewStateNode);
}
#undef LOCTEXT_NAMESPACE
添加GraphSchemaAction类
SchemaAction类表示在菜单中选中点击这个Action会发生什么事情,如蓝图编辑器中通常是点击一个Action,创建对应的函数节点。这里是点击后创建一个State节点。
// 这个类表示执行这个Actoin会发生什么事情,比如创建一个节点
USTRUCT()
struct FEdGraphSchemaAction_CreateStateNode : public FEdGraphSchemaAction
{
GENERATED_BODY()
FEdGraphSchemaAction_CreateStateNode() {
};
FEdGraphSchemaAction_CreateStateNode(FText InNodeCategory, FText InMenuDesc, FText InToolTip, const int32 InGrouping)
: FEdGraphSchemaAction(MoveTemp(InNodeCategory), MoveTemp(InMenuDesc), MoveTemp(InToolTip), InGrouping)
{
}
// 点击Act