ぼっちプログラマのメモ

Unreal Engineについて書いたりしてます

【UE5】特定のディレクトリ以下にあるファイルの変更を検出する方法について

はじめに

UE5にはAuto Reimportという「アセットの元データ(画像、モデル、テキストデータなど)が変更されると自動的に再インポートを行う」機能があります。ただ直接的な元データではなかったり、プロジェクト独自にチェックや変換処理をしたい時はAuto Reimportでは難しい場合があります。

dev.epicgames.com

そんなときに「元データが変更されたことを検出できる仕組み」があると便利だったりします。ということで、UE5における実装方法について調べてみました。

ファイルの変更を検出する方法

早速ですが、指定ディレクトリ以下にある各ファイルの変更を検出する処理は以下のようにして組めます。

// 検出機能に登録するデリゲートを管理
FDelegateHandle DirectoryWatcherHandle;
// 検出対象のディレクトリ。相対パス、フルパスどちらもOK
FString Directory = FPaths::ProjectSavedDir() / TEXT("hogehoge");

FDirectoryWatcherModule& DirectoryWatcherModule =
    FModuleManager::LoadModuleChecked<FDirectoryWatcherModule>("DirectoryWatcher");
if (IDirectoryWatcher* DirectoryWatcher = DirectoryWatcherModule.Get())
{
    DirectoryWatcher->RegisterDirectoryChangedCallback_Handle(
        Directory,
        IDirectoryWatcher::FDirectoryChanged::CreateLambda([this](const TArray<FFileChangeData>& FileChanges)
        {
            for (const FFileChangeData& FileChange : FileChanges)
            {
                // ファイルの追加・削除ではなく変更のみを対象に
                if (FileChange.Action == FFileChangeData::FCA_Modified)
                {
                    // FileChange.Filename でファイルパスを取得
                }
            }
        }),
        DirectoryWatcherHandle
    );
}

監視を切る場合はUnregisterDirectoryChangedCallback_Handleを使用すればOKです。

DirectoryWatcher->UnregisterDirectoryChangedCallback_Handle(Directory, DirectoryWatcherHandle);

おまけ

UE標準の Auto Reimport では AutoReimportManagerFContentDirectoryMonitorFFileCache周辺のクラスを使っているので真似しようと思ったのですが、FFileCache::Tick()を回す必要があったりと手間が多そうなので今回は簡単な方法を選んでみました。

FFileCacheの方だとTimestampだけでなくHashでも検出ができるので、より高度な判定をしたい場合はこちらを使ったほうがいいかもしれません。

おしまい