🤔

【UE5】たかがアセットのパス、されどアセットのパス...

に公開

はじめに

皆様、よくUnreal C++のコンストラクタ内などでアセットのパスからテクスチャやマテリアル、メッシュなどを読み込むことってありますよね。
そのさい、アセットのPathを気を付けないと正しく読み込まれなかったり、失敗したりしてしまいます。
今回は私自身の備忘録と併用で記録しておきたいと思います。

いろんなアセットの読み方

  • TSubclassOfを使った非同期ロード
hogehoge.cpp
FString Path = TEXT("パスのファイル名");
TSubclassOf<Ahogehoge> hogeclass = TSoftPtr<AHogehoge>(FSoftObjectPath(*Path)).LoadSynchronous();
  • ConstructorHelperのFClassFinder/FObjectFinderを使った(コンストラクタ限定)
hogehoge.cpp
#include "UObject/ConstructorHelpers.h"

Ahogehoge::Ahogehoge()
{
    ConstrcutorHelpers::FclassFinder<APawn> DefaultPlayer(TEXT("ファイルパス"));
    if(DefaultPlayer.Succeeded())
    {
        hogeclass = DefaultPlayer.Class;
    }
}
  • LoadObjectを使ったロード
hogehoge.cpp
UStaticMesh* mesh = LoadObject<UStaticMesh>(nullptr,TEXT("ファイルのパス"));
if(mesh != nullptr)
{
    MeshCmp->SetStaticMesh(mesh);
}

ファイルパスの書き方

今回はアセットにある SM_ChamferCube を表現してみましょう。

通常のアセットを読むファイルパス

  • 通常の「リファレンスパス」を使用します。
hoge.txt
TEXT("/Script/Engine.StaticMesh'/Game/LevelPrototyping/Meshes/SM_ChamferCube.SM_ChamferCube'");

ブループリント(BP)を読み込むパス

  • 通常の「リファレンスパス」の末尾に _C を記載する必要があります。
  • 今回は BP_ThirdPersonCharacter を表現してみましょう。
hoge.txt
TEXT("/Script/Engine.Blueprint'/Game/ThirdPerson/Blueprints/BP_ThirdPersonCharacter.BP_ThirdPersonCharacter_C'");

今回ぶち当たった壁

GameModeBaseクラス内にて、DefaultPawnクラスをC++から設定する際におこったことです。
私はいつも通り、「BPだから上のファイルパス+_Cでうまく読み込めるだろう」と思って以下のように記載しました。
テンプレートに乗っている通りに書いてみました。

DefaultGameModeBaase.cpp
#include "UObject/ConstructorHelpers.h"

ADefaultGameModeBase::ADefaultGameModeBase()
{
	static ConstructorHelpers::FClassFinder<APawn> DefaultPlayerClass(TEXT("/Script/Engine.Blueprint'/Game/ThirdPerson/Blueprints/BP_ThirdPersonCharacter.BP_ThirdPersonCharacter_C'"));
	if (DefaultPlayerClass.Class != nullptr)
	{
		DefaultPawnClass = DefaultPlayerClass.Class;
	}
}

残念なことに読み込まれない...

なぜかPlayボタン(Alt+P)で読み込むことができませんでした。

間違い

実は、この場合のファイルのパスで _C は不要だったのです。
私は、前半の /Script/Engine.Blueprint' もいらないと聞いたのですが、特に関係なさそうな気がします。(次意識して調査してみます)

正しくは?

DefaultGameModeBaase.cpp
#include "UObject/ConstructorHelpers.h"

ADefaultGameModeBase::ADefaultGameModeBase()
{
	static ConstructorHelpers::FClassFinder<APawn> DefaultPlayerClass(TEXT("/Game/ThirdPerson/Blueprints/BP_ThirdPersonCharacter.BP_ThirdPersonCharacter"));
	if (DefaultPlayerClass.Class != nullptr)
	{
		DefaultPawnClass = DefaultPlayerClass.Class;
	}
}

これでようやくキャラクターが読み込まれました!
ファイルのパスは謎深い...

Discussion