介绍
我们添加了一个UStateMachine的自定义资源,现在我们在创建一个FStateMachineEditor的编辑器类来编辑这个资源。UE4中任何的编辑器都是由一个个Tab(页签)组成,由编辑器中的TabManager管理。StateMachineEditor打开后会和蓝图编辑器类似,有默认的菜单栏和工具栏、有图表和细节面板。这里菜单栏、工具栏、图表、细节面板都是页签。
我们先创建只有默认菜单栏、工具栏、和细节面板的编辑器,后面再详细介绍图表页签的创建。
创建编辑器类
首先创建一个FStateMachineEditor编辑器类,用于编辑StateMachine资源类。FStateMachineEditor从FWorkflowCentricApplication继承则可以切换编辑模式,结构会更加清晰,建议都从FWorkflowCentricApplication继承。编辑器类额外添加了一个DocumentManager变量,DocumentManager可以替换TabManager可以用于管理所有的图表页签,同蓝图编辑器类似。
- StatMachineEditor.h:
class STATEMACHINEEDITOR_API FStateMachineEditor : public FWorkflowCentricApplication, public FNotifyHook, public FEditorUndoClient
{
public:
FStateMachineEditor();
virtual ~FStateMachineEditor();
//初始化编辑器函数
void InitStateMachineEditor(const EToolkitMode::Type Mode, const TSharedPtr< class IToolkitHost >& InitToolkitHost, UStateMachine* InStateMachine);
public:
//~ Begin FWorkflowCentricApplication Interface
virtual void RegisterTabSpawners(const TSharedRef<class FTabManager>& InTabManager) override;
//~ End FWorkflowCentricApplication Interface
//~ Begin IToolkit Interface
virtual FName GetToolkitFName() const override;
virtual FText GetBaseToolkitName() const override;
virtual FString GetWorldCentricTabPrefix() const override;
virtual FLinearColor GetWorldCentricTabColorScale() const override;
//~ End IToolkit Interface
virtual void RegisterToolbarTab(const TSharedRef<class FTabManager>& InTabManager);
virtual void InvokeStateMachineGraphTab(); //打开图表Tab,预留
UStateMachine* GetStateMachine() {
return StateMachine.Get(); }
TSharedPtr<FDocumentTracker> GetDocumentManager() {
return DocumentManager; }
private:
TWeakObjectPtr<UStateMachine> StateMachine;
TSharedPtr<FDocumentTracker> DocumentManager;
};
- StatMachineEditor.cpp:
void FStateMachineEditor::InitStateMachineEditor(const EToolkitMode::Type Mode, const TSharedPtr<class IToolkitHost>& InitToolkitHost, UStateMachine* InStateMachine)
{
StateMachine = InStateMachine;
// Initialize the asset editor and spawn nothing (dummy layout)
const TSharedRef<FTabManager::FLayout> DummyLayout = FTabManager::NewLayout("NullLayout")->AddArea(FTabManager::NewPrimaryArea());
InitAssetEditor(Mode, InitToolkitHost, FName("StateMachineEditorApp"), DummyLayout, tru