ほげたつブログ

プログラムとアニメーションをかじって生きてる

FLayoutSaveRestore::LoadFromConfig で地雷を踏んだ話

小ネタですが備忘録代わりに。読んでも面白くない系です。

前置き

UE4 でアセット単位の専用エディタを作る場合、FApplicationMode を継承した FXxxEditorMode というクラスを作り、そこで FTabManager 経由でレイアウトを定義するのが主流のようです。例えばエンジン定義のものだと FSkeletalMeshEditorMode、FBlueprintEditorApplicationMode、FBehaviorTreeEditorApplicationMode 等があり、現状はほとんどがこれで作られています。

試してみた

試しに下記のようなレイアウトを定義してみました。SkeletonTree、Viewport、Details を表示するだけのシンプルなものです。(FSkeletonEditorMode からパクってきました)

TabLayout = FTabManager::NewLayout("Standalone_MyEditor_Layout_v1")
    ->AddArea
    (
        FTabManager::NewPrimaryArea()
        ->SetOrientation(Orient_Vertical)
        ->Split
        (
            FTabManager::NewStack()
            ->SetSizeCoefficient(0.1f)
            ->SetHideTabWell(true)
            ->AddTab(InHostingApp->GetToolbarTabId(), ETabState::OpenedTab)
        )
        ->Split
        (
            FTabManager::NewSplitter()
            ->SetSizeCoefficient(0.9f)
            ->SetOrientation(Orient_Horizontal)
            ->Split
            (
                FTabManager::NewStack()
                ->SetSizeCoefficient(0.2f)
                ->SetHideTabWell(true)
                ->AddTab(MyEditorTabs::SkeletonTreeTab, ETabState::OpenedTab)
            )
            ->Split
            (
                FTabManager::NewStack()
                ->SetSizeCoefficient(0.6f)
                ->SetHideTabWell(true)
                ->AddTab(MyEditorTabs::ViewportTab, ETabState::OpenedTab)
            )
            ->Split
            (
                FTabManager::NewSplitter()
                ->SetSizeCoefficient(0.2f)
                ->SetOrientation(Orient_Vertical)
                ->Split
                (
                    FTabManager::NewStack()
                    ->SetSizeCoefficient(0.5f)
                    ->SetHideTabWell(false)
                    ->AddTab(MyEditorTabs::DetailsTab, ETabState::OpenedTab)
                    ->SetForegroundTab(MyEditorTabs::DetailsTab)
                )
            )
        )
    );


結果から言うと上手く表示されず、具体的には SkeletonTree のみが表示されていて、WidgetReflector を使っても Viewport と Details が見つからない状態で数時間ハマりました。

原因

FApplicationMode::ActivateMode 時に EditorConfig からユーザーが保存したレイアウトを読み込む処理があります。

return FLayoutSaveRestore::LoadFromConfig(GEditorLayoutIni, TabLayout.ToSharedRef());


作る過程で最初に SkeletonTree だけを表示してみた時があったのですが、どうもその時にレイアウトが保存され、その後にどれだけレイアウトを変更しても上記処理で上書きされてしまっていたようです。

対処

「Window」→「Reset Layout ...」から保存されたレイアウトを初期化することで正常な表示になりました。もしくは FTabManager::NewLayout する時に指定するレイアウト名を変更することでも保存済みレイアウトが使われることを回避できるかと思います。


できました。