PaperSloth’s diary

主にゲーム開発関連についての記事を書きます。

UE4 SceneCaptureComponent2DでTextureStreamingが走らない場合の対処法

目次

環境

UE4.25.0 Preview7
Visual Studio Community 2019

概要

SceneCaptureComponent2Dを使用してCapture Every Frameフラグを有効化しているにも関わらず
Capture先でTextureStreamingが走らないという経験をした方向けの記事です。

具体的な現象としては遠方でのCapture時に発生します。
さらにめんどうなことに再現するのに少し手間がかかります。
一度正常にStreamingが走った後はEditorを再起動しないと再現ができません。
Streamingした結果がCacheされているからでしょうね。

問題の再現

まずはどういった状態になるのかを見ていきましょう。
こちらがCaptureしたRenderTargetをPlaneに貼ったものです。
TextureStreamingが走っていないため、Textureが粗いものになっています。
CaptureするActorはSubLevelに分けて(1000000.0, 1000000.0, 0.0)の遠方を基準に配置しました。
f:id:PaperSloth:20200502171242p:plain

そしてこちらがTextureStreamingが走った後の期待値です。
f:id:PaperSloth:20200502171310p:plain

岩のMeshが一番違いが分かりやすいと思います。
原因としてはMainCamera以外ではStreamingManagerが走らないことが原因と思われます。
そのため、MainCameraに映らない遠方のCaptureしたActor等は手動で走らせてやる必要があります。

回避方法

こちらのAnswerHubでの回答にあるように手動でUpdateSceneCaptureContents() を呼び出して更新してやる必要があります。
このアプローチのためにはC++コードの記述が必要になります。
追記に書きましたがBlueprint側から利用可能なノードも用意されています。
ただし、挙動が違うものになりますので注意が必要です。
https://answers.unrealengine.com/questions/841147/view.html

ざっくりと書くとStereamingManagerに位置情報を送り
SceneInterfaceからUpdateSceneCaptureContents() を呼び出すだけです。

IStreamingManager::Get().AddViewSlaveLocation(CaptureLocation);
World->Scene->UpdateSceneCaptureContents(CaptureComponent);

USceneCaptureComponent2Dを継承してコードを書くのが手っ取り早いですが
なんとなくUBlueprintFunctionLibraryを継承してコードを用意しました。
USceneCaptureComponent2D版はAnswerHubのリンク先にコード例があります。

今回追加したのはUpdateCapture() で位置とSceneCaptureComponent2Dを渡し、boolで成功判定を返す関数です

// BlueprintFunctionLibrary.h
#pragma once

#include "CoreMinimal.h"
#include "Kismet/BlueprintFunctionLibrary.h"
#include "Engine/SceneCapture2D.h"
#include "SandboxFunctionLibrary.generated.h"

UCLASS()
class SANDBOX425_API USandboxFunctionLibrary : public UBlueprintFunctionLibrary
{
    GENERATED_BODY()

    UFUNCTION(BlueprintCallable, Category = "Sandbox", meta = (WorldContext = "WorldContextObject"))
    static bool UpdateCapture(UObject* WorldContextObject, FVector CaptureLocation, USceneCaptureComponent2D* CaptureComponent);
};

// BlueprintFunctionLibrary.cpp
#include "SandboxFunctionLibrary.h"

bool USandboxFunctionLibrary::UpdateCapture(UObject* WorldContextObject, FVector CaptureLocation, USceneCaptureComponent2D* CaptureComponent)
{
    UWorld* World = GEngine->GetWorldFromContextObject(WorldContextObject);
    if (!World || !World->Scene)
    {
        return false;
    }

    IStreamingManager::Get().AddViewSlaveLocation(CaptureLocation);
    World->Scene->UpdateSceneCaptureContents(CaptureComponent);
    return true;
}

あとはこの関数を呼び出すだけでStreamingManagerが期待通りに動作し、Textureの粗さは改善されます。
Level Blueprintから以下の呼び出しをしました。
(確認用に作成したBlueprintで処理としてはかなり悪いのでここは参考にしない方が良いです)
f:id:PaperSloth:20200502172506p:plain


この解決方法の問題点として、Textureの粗さが改善された後もMainCamera以外で無駄にTextureStreamingを走らせてしまうことです。
なにかしらの方法で終了判定を取得して更新を止めた方が良いです。

ひとまず以上で無事にTextureの粗さは改善されます。
同様の問題を踏んだ方はこちらの方法を検討されてみてもよいかもしれません。
f:id:PaperSloth:20200502171310p:plain



最後に余談ですがSceneCaptureComponentでは
Actorを選択した時にViewport右下にCapture先がPreviewされないため
確認用にCameraComponentを追加するのもアリかもしれません。
完全に無駄なComponentのため、リリース時には必ず削除する必要がありますがテスト用としてはオススメです。
f:id:PaperSloth:20200502173209p:plain

[追記] Blueprintで動作させる

カニパンチさんに教えていただきました。
情報を提供いただき、ありがとうございました。

Prestream Textures ノードを使用することでActor内の全StaticMeshComponent, StaticMeshComponentごとにStreamingを走らせることが可能なようです。
Actor側のPrestreamTexturesの引数Secondsに0.0fを設定していると60.0f*60.0f*24.0f*30.0fの30日分走ります。
そのため、実際に運用される場合は適切な数値を入れたほうがよいでしょう。
f:id:PaperSloth:20200502183524p:plain

例えば岩のActorのみを更新したい場合は下記のようになります。
f:id:PaperSloth:20200502182151p:plain

動作させると岩のActorのみが更新されていることが確認できました。
f:id:PaperSloth:20200502182255p:plain

UE4 ノードの整理(ルートを直線にする方法)

目次

環境

UE4.25.0 Preview2

概要

以前にもBlueprint TipsのスライドでStraighten Connectionsの紹介をしましたが
他にも便利な機能があるのでそちらを紹介していこうと思います。

www.slideshare.net

Blueprint編

上記のSlideでも紹介したStraighten Connectionsのおさらいから。
複数のノードを選択して「Q」キーでしたね。
f:id:PaperSloth:20200314203131g:plain

もしくは複数のノードを選択して
ノード上で右クリック -> Alignment -> Straighten Connection(s)です。
f:id:PaperSloth:20200314203238p:plain


ですが、これだと意図した通りに真っ直ぐになってくれない場合もあります。
そういった場合に便利なのが「Straighten Connection to (node name)」です。
ピンの上で右クリック -> Straighten Connections to (node name)で使用可能です。
f:id:PaperSloth:20200314203555p:plain

これを実行するとそのピンを基準に接続先のノードが真っ直ぐになります。
具体的にはsin node等微妙に真っ直ぐにならないノードが真っ直ぐになって便利です。

before
f:id:PaperSloth:20200314203944g:plain
after
f:id:PaperSloth:20200314204003g:plain

ここまで紹介した機能は全てBlueprint Classに限らず
Level BlueprintやAnimation Blueprintでも共通の操作です。

Material Editor編

続いてはMaterial です。
Materialでは「Straighten Connection(s)」が使用可能で、「Straighten Connection to (node name)」が使用不可です。
Materialの方が高さが合わないノードが多いので特に欲しい機能ですが、ないのであれば仕方ありません。

まずは「Straighten Connection(s)」のおさらいから。
Blueprint同様に複数ノードを選択して「Q」キーで真っ直ぐにしてくれます。
f:id:PaperSloth:20200314204702g:plain

Blueprint同様にsin nodeなどは相変わらずズレます。
「Straighten Connection to (node name)」が使えればいいのですが、別の手段で回避します。
人によってはEditor背景のGridに合わせたいという要望もあると思います。
そういった時に「Straighten Connection(s)」ではズレてしまうため
少し手間ですが手動でGridに合わせることでルートを真っ直ぐにしつつGridに合った並びにできます。

Niagara Editor編

いきなり脱線しますが、UE4.25 PreviewからNiagaraの BETAが外れて正式リリースになりそうですね。
先ずはアイコンが変わっていました。

UE4.24
f:id:PaperSloth:20200314210745p:plain
UE4.25
f:id:PaperSloth:20200314210836p:plain

Effectツール感があっていい感じのアイコンになりましたね。

本題に戻ります。
NiagaraのModule ScriptとFunction Scriptのノードの整列についてはMaterialと同じです。
「Straighten Connection(s)」が使用可能で、「Straighten Connection to (node name)」が使用不可です。

複数のノードを選択して「Q」キーで整列が可能です。
f:id:PaperSloth:20200314211816g:plain


まとめ

今回はひたすらルートを真っ直ぐにすることについて書きました。
BlueprintはPinごとに制御可能なので便利ですがMaterial とNiagaraも対応してほしいなと思っています。
大きく困ることはないので、好みの問題ですが。

さて、仕事でここまでやる必要があるかという正直過剰だと思います。
個々人の意識の問題として整理するのは大変良いことですが
プロジェクトのルールに組み込む際にここまで強要するのは過剰だと思っています。

また、これだけ一生懸命整理してもエンジンのアップデート等の原因で簡単に破綻してしまいます。
何事も程々がいいということですね。
個人プロジェクトで意識的にこういったことをやる分には良いことだと思います。

以上!

日記 第4回UE4何でも勉強会のLT に登壇してきました

イベントページはこちら
ue4allstudy.connpass.com


登壇内容は「Blueprint Tips 30選」です
資料はslidesharegithubにアップしました。

www.slideshare.net

GitHub - PaperSloth/Presentation: 登壇資料


公開した資料はslideshareでは標準でgifが動作しないため、githubにgif版をアップしました。
gif版の方がより正確に内容が伝わりやすくなっていると思います。


色々と登壇内容を考えたのですが、初心者向けにBlueprintの操作についてまとめた資料を目標に作成しました。
登壇時間が5分しかないということがすっぽり抜けており、当日は10個も紹介できませんでしたが。

登壇の0-5分前にgithubslideshareに公開できると勉強会が終わってからの作業もスムーズだと感じました。
また機会があればどこかで何かを話そうと思います。

UE4 外部ライブラリの使用方法について

この記事はUnreal Engine 4(UE4) Advent Calendar 2019の22日目の投稿記事です。
Unreal Engine 4 (UE4)のカレンダー | Advent Calendar 2019 - Qiita


目次

環境

UE4.23.1
Visual Studio 2017 Community

結論

最初に結論だけを書きます。
Static Library, Dynamic-link Libraryどちらの場合も編集するのは .Build.cs です。
・共通(Static Libraryはこれで設定完了)

// インクルードファイルへのpath 情報を追加
// .h/.hpp ファイルを配置したディレクトリへのpathを記述
PublicSystemIncludePaths.Add(Path.Combine(LibraryPath, "include"));
// ライブラリへのpath 情報を追加
// .lib ファイルを格納したディレクトリへのpath を記述
PublicLibraryPaths.Add(Path.Combine(LibraryPath, "lib", "x64"));
// ライブラリをプロジェクトに追加
// .lib ファイルの名前を記述
PublicAdditionalLibraries.Add("LirbraryName.lib");


・Dynamic-link Library

// ライブラリをプロジェクトに追加
// .dll ファイルの名前を記述
 PublicDelayLoadDLLs.Add("LibraryName.dll");
// プロジェクトのパッケージング情報に.dll の情報を追加し、ファイルコピー
// .dll ファイルを格納したディレクトリへのpath を記述
 RuntimeDependencies.Add(Path.Combine(LibraryPath, "lib", "x64");

概要

今回はUE4で外部のライブラリ(Static Library, Dynamic-link library)の使用方法について書きます。
使用するライブラリは自作した簡単なライブラリを使用します。
Static Libraryはint の足し算を行うだけのもの : ExampleLib
Dynamic-link Libraryはint の引き算を行うだけのもの : ExampleDll
この2つを用意しました。
わざわざライブラリ化する意味は全くありませんが、使用方法の参考例として用意しました。

ライブラリの作成方法についてはUE4の話から逸れるため、作成方法などについては省略します。
下記ドキュメントを参考にしてください。
チュートリアル: スタティック ライブラリを作成して使用する (C++) | Microsoft Learn
Visual Studio で C/C++ DLL を作成する | Microsoft Learn

Static Libraryの作成

設定等は大幅に省いてざっくりとコードだけ載せます。

こちらも設定等は省いてコードだけ。

UE4でのLibraryの使用方法

ようやくUE4の話に戻ります。
まずは新規にUE4プロジェクトを作成します。


続いて使用するライブラリをそれぞれプロジェクトに紐付けるために適切なディレクトリに移します。
(ProjectRoot)\ThirdParty\ 以下にファイルを置くのが一般的でしょう。
ThirdPartyというフォルダは存在しないため、新規作成します。

例 :
(ProjectRoot)\ThirdParty\(LibraryName)\include\
(ProjectRoot)\ThirdParty\(LibraryName)\lib\(PlatformName)\

今回は以下のように配置しました。
・ Static Library
(ProjectRoot)\ThirdParty\ExampleLib\include\
(ProjectRoot)\ThirdParty\ExampleLib\lib\x64\

・Dynamic-link Library
(ProjectRoot)\ThirdParty\ExampleDll\include\
(ProjectRoot)\ThirdParty\ExampleDll\lib\x64

ライブラリに更新が入った時には
Generate Visual Studio project filesでプロジェクトを再生成しています。
これが正しいフローなのかどうかは疑問が残りますが、これでライブラリの更新は反映されます。

ライブラリのリンクについて編集するのは基本的に下記のファイルのみです。
(ProjectRoot)\Source\(ProjectName)\(ProjectName).Build.cs
今回の場合だと (ProjectRoot)\Source\LibrarySandbox\LibrarySandbox.Build.cs
コメント等を削除して、初期の記述状態は下記になります。

using UnrealBuildTool;

public class LibrarySandbox : ModuleRules
{
    public LibrarySandbox(ReadOnlyTargetRules Target) : base(Target)
    {
        PCHUsage = PCHUsageMode.UseExplicitOrSharedPCHs;

        PublicDependencyModuleNames.AddRange(new string[] { "Core", "CoreUObject", "Engine", "InputCore" });

        PrivateDependencyModuleNames.AddRange(new string[] { });
    }
}

ライブラリの使用準備にあたってThirdPartyへのFullPath取得のPropertyを追加します。

// Path使用のため追加
using System.IO;

public class LibrarySandbox : ModuleRules
{
    // 追加
    private string ThirdPartyPath
    {
        get { return Path.GetFullPath(Path.Combine(ModuleDirectory, "../../ThirdParty/")); }
    }
...
}

Static Libraryの使用方法

Static Libraryを使用するにあたっては下記へのファイル追加が必要です
・PublicSystemIncludePaths
・PublicLibraryPaths
・PublicAdditionalLibraries

includeファイルのディレクトリの追加、ライブラリへのpath の追加、ライブラリの追加です
今回の例では下記のようになります。

public class LibrarySandbox : ModuleRules
{
    ...
    public LibrarySandbox(ReadOnlyTargetRules Target) : base(Target)
    {
        ...
        PrivateDependencyModuleNames.AddRange(new string[] { });

        // 下記を追加
        string ExampleLibPath = Path.Combine(ThirdPartyPath, "ExampleLib");
        PublicSystemIncludePaths.Add(Path.Combine(ExampleLibPath, "include"));

        PublicLibraryPaths.Add(Path.Combine(ExampleLibPath, "lib", "x64"));
        PublicAdditionalLibraries.Add("ExampleLib.lib");
...
}

では実際に使用できるかコードを書いて確かめてみます。
GameModeのctorから呼び出してみます。

#include "LibrarySandboxGameModeBase.h"
#if PLATFORM_WINDOWS
#include "ExampleLib.h"
#include <memory>
#endif

ALibrarySandboxGameModeBase::ALibrarySandboxGameModeBase()
{
#if PLATFORM_WINDOWS
    const auto helloLib(std::make_shared<ExampleLib::HelloLib>());
    UE_LOG(LogTemp, Log, TEXT("Hello Static Library World : 1 + 2 = %d"), helloLib->Add(1, 2));
#endif
}

実行してみると無事に動作することが確認できました。

LogInit: FAudioDevice initialized.
LogLoad: Game class is 'LibrarySandboxGameModeBase'
LogTemp: Hello Static Library World : 1 + 2 = 3

手順としてはPublicSystemIncludePaths, PublicLibraryPaths, PublicAdditionalLibrariesに設定を記述するだけでプロジェクトから使用できるため比較的お手軽です。

Dynamic-link Libraryを使用するにあたっては下記へのファイル追加が必要です
・PublicSystemIncludePaths
・PublicLibraryPaths
・PublicAdditionalLibraries
・PublicDelayLoadDLLs
・RuntimeDependencies

includeファイルのディレクトリの追加、ライブラリへのpath の追加、ライブラリの追加、ライブラリのパッケージング時のコピー

今回の例では下記のようになります。

public class LibrarySandbox : ModuleRules
{
    ...
    public LibrarySandbox(ReadOnlyTargetRules Target) : base(Target)
    {
        ...
        PrivateDependencyModuleNames.AddRange(new string[] { });

        // 下記を追加
        string exampleDllRootPath = Path.Combine(ThirdPartyPath, "ExampleDll");
        PublicSystemIncludePaths.Add(Path.Combine(exampleDllRootPath, "include"));

        string exampleDllPath = Path.Combine(exampleDllRootPath, "lib", "x64");
        PublicLibraryPaths.Add(exampleDllPath);
        PublicAdditionalLibraries.Add("ExampleDll.lib");

        string exampleDllName = "ExampleDll.dll";
        string exampleDllFullPath = Path.Combine(exampleDllPath, exampleDllName);
        PublicDelayLoadDLLs.Add(exampleDllName);
        RuntimeDependencies.Add(exampleDllFullPath);
...
}

実際に使用できるかコードを書いて確かめてみます。
GameModeのctorから呼び出してみます。

#include "LibrarySandboxGameModeBase.h"
#if PLATFORM_WINDOWS
#include "ExampleDll.h"
#include <memory>
#endif

ALibrarySandboxGameModeBase::ALibrarySandboxGameModeBase()
{
#if PLATFORM_WINDOWS
    const auto helloDll(std::make_shared<ExampleDll::HelloDll>());
    UE_LOG(LogTemp, Log, TEXT("Hello Dynamic-link Library World : 2 - 1 = %d"), helloDll->Sub(2, 1));
#endif
}

実行してみるとエラーが出ます。
delayhlp.cpp の中でKernelBase.dllで例外が発生したと表示されます。
これはBinaries/Win64/ 以下にdll が存在せずEditorから実行できません。
ですのでdll をBinaries/(Platforms)/以下にコピーするコードを追加します。

using System;
using System.IO;

public class LibrarySandbox : ModuleRules
{
    ...
    public LibrarySandbox(ReadOnlyTargetRules Target) : base(Target)
    {
        ...
        string exampleDllName = "ExampleDll.dll";
        string exampleDllFullPath = Path.Combine(exampleDllPath, exampleDllName);
        PublicDelayLoadDLLs.Add(exampleDllName);
        RuntimeDependencies.Add(exampleDllFullPath);
        CopyDll(exampleDllName, exampleDllFullPath);
    }

    // Binaries以下にdll をコピーする
    private void CopyDll(string dllName, string dllFullPath)
    {
        if (!File.Exists(dllFullPath))
        {
            Console.WriteLine("file {0} does not exist", dllName);
            return;
        }
        string binariesDir = Path.Combine(ModuleDirectory, "../../Binaries/Win64/");
        if (!Directory.Exists(binariesDir))
        {
            Directory.CreateDirectory(binariesDir);
        }
        string binariesDllFullPath = Path.Combine(binariesDir, dllName);
        if (File.Exists(binariesDllFullPath))
        {
            File.SetAttributes(binariesDllFullPath, File.GetAttributes(binariesDllFullPath) & ~FileAttributes.ReadOnly);
        }
        // try catchでくくっていないとパッケージ作成時にこけます
        try
        {
            File.Copy(dllFullPath, binariesDllFullPath, true);
        }
        catch (Exception ex)
        {
            Console.WriteLine("failed to copy file: {0}", dllName);
        }
    }
}


これで無事に動作することが確認できました。

LogInit: FAudioDevice initialized.
LogLoad: Game class is 'LibrarySandboxGameModeBase'
LogTemp: Hello Dynamic-link Library : 2 - 1 = 1

手順としてはPublicSystemIncludePaths, PublicLibraryPaths, PublicAdditionalLibraries, に設定を記述することに加えて
PublicDelayLoadDLLs, RuntimeDependenciesが追加されました。
RuntimeDependenciesは記述がなくとも動作しますが
これを設定していないとプロジェクトのパッケージング時にそのフォルダにDLLがコピーされないため
DLLがなくて動作しないという問題を避けることができます。

パッケージング後のディレクトリはWindows PC向けパッケージでは下記のようになります。
WindowsNoEditor\LibraySandbox.exe
WindowsNoEditor\LibrarySandbox\ThirdParty\ExampleDll\lib\x64\ExampleDll.dll


最後にbuild.cs と使用例を全文載せておきます。


UE4 C++のバージョンを変更する方法

環境

UE4.23.1
Visual Studio Comuunity 2019

UE4Unreal C++環境について

リリース時のUE4Unreal C++C++11をベースに一部C++14で開発されていました
jp docだとC++11, us docだとC++14と記載されています。
Coding Standard | Unreal Engine Documentation
コーディング標準 | Unreal Engine ドキュメント

しかし、現在はC++17以降も使用できるようになっています。
ちょうどUE4.22でVisual Studio 2015のサポートを(基本的には)終了した頃からでしょうか。
※基本的にはと書いたのはtarget.csにCompilerの指定を書けばVS2015でも動作するためです。

おさらいとして、UE4で使用するIDEの変更方法についての記事も載せておきます。
papersloth.hatenablog.com

UE4C++のバージョン指定方法

UE4で使用されるC++のバージョン指定はProjectのtarget.cs内に記述をすることで変更が可能です。

以下はプロジェクト作成時の target.csです

using UnrealBuildTool;
using System.Collections.Generic;

public class ProjectNameTarget : TargetRules
{
    public ProjectNameTarget(TargetInfo Target) : base(Target)
    {
        Type = TargetType.Game;

        ExtraModuleNames.AddRange(new string[] { "ProjectName" });
    }
}

C++のバージョン指定は下記を追記するだけで行なえます。
CppStandard = CppStandardVersion.{任意のバージョン};

using UnrealBuildTool;
using System.Collections.Generic;

public class ProjectNameTarget : TargetRules
{
    public ProjectNameTarget(TargetInfo Target) : base(Target)
    {
        Type = TargetType.Game;

        ExtraModuleNames.AddRange(new string[] { "ProjectName" });
        CppStandard = CppStandardVersion.Cpp17; //C++17を指定
        // C++14の場合 -> CppStandardVersion.Cpp14
        // 最新のC++の場合 -> CppStandardVersion.Latest
    }
}


以上です!
お好きなIDEC++バージョンで快適な開発ライフを!

UE4 Lighting Channelsについて

環境

UE4.23.1

Lighting Channelsについて

通常のLightingではChannel 0番のみが使用されており、特に意識する必要はありません。
Lighting Channelsを使うと独特で面白い絵作りや
広いワールドに対してエリアごとに全く異なるライティングの絵作りなど
特徴的な表現ができるようになります。
ただし、パフォーマンスにも影響を与えるためプロファイリングをとって注意して扱ってください。
f:id:PaperSloth:20191112212109p:plain

設定方法

Lighting Channelsの設定が可能なのは
・Directional Light
・Point Light
・Spot Light
・Rect Light
上記4つになります。

・Sky Light についてはLighting Channelsが設定できないため、注意が必要です

設定箇所は各Lightの 「Light -> Lighting Channels」にあります。
f:id:PaperSloth:20191112211706p:plain
デフォルトでは0のみが使用されています。

Channelは単一でも組み合わせでも設定が可能です。
f:id:PaperSloth:20191112213104p:plain

さて、Channelを設定しても画面上で特に変化は起きないと思います。
Lighting ChannelsはLightだけでなく、各メッシュごとの設定が必要で
「Static Mesh, Skeletal Meshごとに設定が必要です」
設定箇所はLight同様に「Light -> Lighting Channels」です。
f:id:PaperSloth:20191112212436p:plain


さらにもう1点注意が必要なのが「影」です。
Shadow Castするのは同一のChannelのメッシュ同士のみです。

Channel 0に白、1に赤、2に青のChannelを設定した
Directional Lightを3つ配置しました。
言葉にすると分かりにくいので、下図をご覧ください。
f:id:PaperSloth:20191112212711p:plain

まずステージ全体のStatic Mesh(床)はLight Channel 0です。
そのため、0と0 & 1と書かれたキャラクターの影のみが落ちます。

続いてChannel 1と書かれたキャラクターと床は1の赤いライトのみが適用され
2と書かれたキャラクターと床には2の青いライトのみが適用されるようになっています。


以上の特性に気をつけて、色々な絵作りをやってみてください!
以上です。

UE4 Projectから直接参照されていないuassetをパッケージに含める方法

環境

UE4.23.1

登録方法と概要

Project内では通常使用されないが、特殊なケースで使用したい場合に使えると思います。
例:開発用に外部のjsoncsvからパス指定でロードするアセットを変更して確認を行いたい場合
例:ロードしたいアセットがパッケージに上手く紐付かずやむを得ず暫定対応でロードさせたい場合
...etc
なんにせよ通常の開発では使わないものと思いますし
ずっと登録したままだと無駄にパッケージサイズが肥大化するため注意が必要です。

注意点として、この方法が使えるのはContentフォルダ以下に配置された.uassetに限ります。

方法としては簡単で
「ProjectSetting -> (Project)Packaging -> (Packaging)Additional Asset Directories to Cook」
以下に参照先のディレクトリを登録するだけです。
f:id:PaperSloth:20191112205054p:plain