ED09.EdGraph|序
大约 3 分钟
导言
UEdGraph 系统结构

UEdGraph
UEdGraphNode
UEdGraphPin
UEdGraphSchema
PinA->LinkedTo.Add(PinB);
PinB->LinkedTo.Add(PinA);
实践
1.派生三剑客

UCLASS()
class XXX_EDITOR_API USuperComboGraphEdGraph : public UEdGraph
{
GENERATED_BODY()
};
2.派生UEdGraphNode

UCLASS()
class XXX_EDITOR_API USuperComboGraphEdGraphNode : public UEdGraphNode
{
GENERATED_BODY()
};
3.派生UEdGraphSchema
UCLASS()
class XXX_EDITOR_API USuperComboGraphEdSchema : public UEdGraphSchema
{
GENERATED_BODY()
};
4. 要显示图表的类中缓存图表指针
UCLASS()
class UXXX : public UObject
{
GENERATED_BODY()
public:
#if WITH_EDITORONLY_DATA
// 图表资源保存点
UPROPERTY()
TObjectPtr<UEdGraph> EditorGraph;
#endif
};
5. 类内写上CreateGraph
函数
void UXXX::CreateGraph()
{
if (EditorGraph == nullptr)
{
EditorGraph = USoundCue::GetSoundCueAudioEditor()->CreateNewSoundCueGraph(this);
EditorGraph->bAllowDeletion = false;
const UEdGraphSchema* Schema = EditorGraph->GetSchema();
Schema->CreateDefaultNodesForGraph(*EditorGraph);
}
}

6.创建 GraphEditor 控件(UI)
.h
/** 你要显示图表的指针 */
TObjectPtr<USuperComboGraph> SuperComboGraphObj;
/**图表指针*/
TSharedPtr<SGraphEditor> GraphEditorWidget;
.cpp
void FSuperComboGraphAssetsEditor::CreateGraphEditorWidget()
{
if (!SuperComboGraphObj) return;
if (!SuperComboGraphObj->EditorGraph)
{
SuperComboGraphObj->EditorGraph = FBlueprintEditorUtils::CreateNewGraph(
SuperComboGraphObj,
NAME_None,
USuperComboGraphEdGraph::StaticClass(),
USuperComboGraphEdSchema::StaticClass()
);
SuperComboGraphObj->EditorGraph->bAllowRenaming = false;
SuperComboGraphObj->EditorGraph->bAllowDeletion = false;
const UEdGraphSchema* GraphSchema = SuperComboGraphObj->EditorGraph->GetSchema();
GraphSchema->CreateDefaultNodesForGraph(*SuperComboGraphObj->EditorGraph);
}
// 创建 GraphEditor 控件
FGraphAppearanceInfo AppearanceInfo;
AppearanceInfo.CornerText = LOCTEXT("SuperComboGraphCornerText", "Super Combo Graph");
FGraphEditorCommands::Register();
GraphEditorWidget = SNew(SGraphEditor)
.AdditionalCommands(nullptr)
.GraphToEdit(SuperComboGraphObj->EditorGraph)
.Appearance(AppearanceInfo)
.AutoExpandActionMenu(true)
.ShowGraphStateOverlay(false);
}
7.挂载 SDockTab
到 Layout
具体注册方法我们上一篇已经讲了,这里只做简单描述
//1.注册ID
static const FName CombGraphTabId;
//2.生成对应的标签页
TSharedRef<SDockTab> SpawnTab_SuperComboGraph(const FSpawnTabArgs& Args) const;
TSharedRef<SDockTab> FSuperComboGraphAssetsEditor::SpawnTab_SuperComboGraph(const FSpawnTabArgs& Args) const
{
check( Args.GetTabId() == CombGraphTabId );
return SNew(SDockTab)
.Label(LOCTEXT("SuperComboGraphTitle", "Super Combo Graph"))
[
GraphEditorWidget.ToSharedRef()
];
}
//3.通过ID组除生成的标签页
void FSuperComboGraphAssetsEditor::RegisterTabSpawners(const TSharedRef<FTabManager>& Manager)
{
/*注册工作区的菜单分类*/
WorkspaceMenuCategory = Manager->AddLocalWorkspaceMenuCategory(LOCTEXT("WorkspaceMenu_SuperComboGraph", "Super ComboGraph "));
const auto WorkspaceMenuCategoryRef = WorkspaceMenuCategory.ToSharedRef();
/*注册自定义的标签页(Tab)*/
FAssetEditorToolkit:: RegisterTabSpawners(Manager);
/*Graph / 画布*/
Manager->RegisterTabSpawner( CombGraphTabId, FOnSpawnTab::CreateSP(this, &FSuperComboGraphAssetsEditor::SpawnTab_SuperComboGraph) )
.SetDisplayName( LOCTEXT("CombGraphTab", "CombGraphTab") )
.SetGroup(WorkspaceMenuCategoryRef)
.SetIcon(FSlateIcon(FSuperCombGraphEditorStyle::GetStyleSetName(), "SiGaoHe.Main"));
}
//4.添加到标签页
InitAssetEditor(Mode,InitToolkitHost,TEXT("SuperComboGraphEditor"),CreateEditorLayout(),true,true,ObjectToEdit,false);