【UE4】 エクスプローラからフォルダを選択してパスを取得する方法


◆ 概要

 任意のディレクトリ以下のアセットを読み込む機能の実装に必要でした。
 その備忘録となります。

 内容はとても簡単で、「IDesktopPlatform::OpenDirectoryDialog」を
 呼び出すだけです。


ソースコード

 ブループリント関数ライブラリとして実装した例となります。

ヘッダ

#pragma once

#include "CoreMinimal.h"
#include "Kismet/BlueprintFunctionLibrary.h"
#include "TestBlueprintFunctionLibrary.generated.h"

UCLASS()
class SANDBOX_API UTestBlueprintFunctionLibrary : public UBlueprintFunctionLibrary
{
    GENERATED_BODY()

public:
  /**
   * 表題の機能、エクスプローラを開き、選択したフォルダのパスを引数に格納する
   */
    UFUNCTION(BlueprintCallable)
    static void OpenDirectoryDialog(FString& OutDirectoryPath);

private:
  /**
   * ウィンドウのハンドルを返す
   */
    static void* GetWindowHandle();
};  

ソースファイル

#include "TestBlueprintFunctionLibrary.h"
#include "Engine.h"
#include "Misc/Paths.h"
#include "Developer/DesktopPlatform/Public/IDesktopPlatform.h"
#include "Developer/DesktopPlatform/Public/DesktopPlatformModule.h"
#include "Editor/MainFrame/Public/Interfaces/IMainFrameModule.h"

// 選択したフォルダのパスを返す
void UTestBlueprintFunctionLibrary::OpenDirectoryDialog(FString& OutDirectoryPath)
{
    void* WindowHandle = GetWindowHandle();
    if (WindowHandle)
    {
        IDesktopPlatform* DesktopPlatform = FDesktopPlatformModule::Get();
        if (DesktopPlatform)
        {
            // IDesktopPlatform::OpenDirectoryDialog が表題の機能を満たす
            const bool Result = DesktopPlatform->OpenDirectoryDialog(
                WindowHandle,
                "Directory Dialog",
                "",
                OutDirectoryPath
            );

            // 絶対パスに変換
            OutDirectoryPath = FPaths::ConvertRelativePathToFull(OutDirectoryPath);
        }
    }
}

// ウィンドウのハンドルを返す
void* UTestBlueprintFunctionLibrary::GetWindowHandle()
{
    // エディタのみで動かすことを想定
    // ランタイムの場合は、GEngine->GameViewport->GetWindow()->GetNativeWindow()->GetOSWindowHandle();
    if (!GIsEditor)
    {
        return nullptr;
    }

    IMainFrameModule& MainFrameModule = IMainFrameModule::Get();
    TSharedPtr<SWindow> MainWindow = MainFrameModule.GetParentWindow();

    if (MainWindow.IsValid() && MainWindow->GetNativeWindow().IsValid())
    {
        return MainWindow->GetNativeWindow()->GetOSWindowHandle();
    }

    return nullptr;
}

  実装した「UTestBlueprintFunctionLibrary::OpenDirectoryDialog」を
  呼び出すことで、 エクスプローラが立ち上がり、フォルダを選択すると
  OutDirectoryPathにパスが格納されるかと思います。


◆ 補足

  実装にあたりいくつか必要なモジュールがありました。

  • MainFrame
  • SlateCore

  その他、不足しているモジュールをBuild.csに追加する必要があるかもしれません。


◆ 参考