【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に追加する必要があるかもしれません。


◆ 参考


SourcetreeとGitLabをSSHで通信させる方法


◆ 概要

 SourcetreeとGitLabをSSHで繋げる手順の備忘録


◆ 手順

 ※ SourcetreeにGitLabのアカウントを追加する方法は割愛します。
  ページ下部の「参考」を参照してください。

  1. Sourcetreeで公開・秘密鍵を生成する

    ・「ツール」 > 「SSH キーの作成/インポート」を選択

f:id:vector10:20220220102012j:plain:w450

    ・「Generate」ボタンから公開・秘密鍵を生成

f:id:vector10:20220220102029j:plain

    ・画像の青枠で囲ったボタンからそれぞれの鍵を保存する
     ※上部の大きな赤枠はGitLabに公開鍵として追加します

  2. GitLabに公開鍵を追加する

    ・GitLabのPreferenceを開く

f:id:vector10:20220220102031j:plain:w800

    ・「SSH Keys」を選択し、「Key」に手順1.の赤枠の内容をコピペ
     ※ 正しくコピペできた場合は「Title」が自動で表示されるはず
       有効期限に関しては未入力の場合、無期限となる

    ・「Add Key」ボタンを押下して公開鍵を登録

  3. Sourcetreeに秘密鍵を追加する

    ・「ツール」> 「SSH エージェントを起動...」から保存した秘密鍵を登録
      ※ できない場合はオプションの「SSH キー」から設定してください

    SSH エージェントを起動...

f:id:vector10:20220220102012j:plain

    ※ オプション..

f:id:vector10:20220220102036j:plain

◆ 補足

    ・SSH通信がうまくいかない場合

    アカウントの「優先するプロトコル」が「SSH」になっているか確認してください。

f:id:vector10:20220220102009j:plain

◆ 参考