PaperSloth’s diary

Unity(C#)、UE4(Blueprint/C++)についての記事を書いたり日常のことをつぶやきます。

UE4 ファイルパスの話

目次

・ContentBrowserの話
Unreal C++からアセットをロードする時の注意点

環境

Visual Studio Community 2015
・Unreal Engine4.16

ContentBrowserの話

Unreal C++でプロジェクトを作成すると下記のように

  • Content
  • C++ Clsasses

という構成になります。
f:id:PaperSloth:20170703204116p:plain


Content Browser上でアセットを選択すると
Copy Referenceでそのアセットへのパスがクリップボードに保存されます。

f:id:PaperSloth:20170703204941p:plain
図の例では
StaticMesh'/Engine/VREditor/BasicMeshes/SM_Cube_01.SM_Cube_01'
が保存されます。

Unreal C++からアセットをロードする時の注意点

さて、ここからが本題です。

Content以下の自作のAssetをコード上から参照したい場合に詰まったことがあります。
(当時はCopy Referenceの存在を知らなかったので)

今回は下記のスタティックメッシュを参照してみようと思います。
f:id:PaperSloth:20170703205830p:plain

先程と同様にCopy Referenceを行ってみると
StaticMesh'/Game/Sandbox/Meshes/SM_Building.SM_Building'
というようなパスが取得できます。
そこで、気になったのが/Game/Sandbox/という部分です。
Engineのアセットの場合は/Engine/なのですが
Content以下の場合は/Game/となっており/Content/ではありません。


ロードする必要のあるアセットが正確に分かっていて、そのプロパティを初期化時に設定する場合の例です(あんまり使わない例です)。
header側

private:
    const FName MeshComponentName = TEXT("Mesh");

    UPROPERTY(Category = Actor, VisibleAnywhere, BlueprintReadOnly, meta = (AllowPrivateAccess = "true"))
        class UStaticMeshComponent* Mesh;

public:
    ABaseActor(const FObjectInitializer& ObjectInitializer);

cpp側

ABaseActor::ABaseActor(const FObjectInitializer& ObjectInitializer)
	: Super(ObjectInitializer)
{
    static ConstructorHelpers::FObjectFinder<UStaticMesh> buildingMesh(TEXT("/Game/Sandbox/Meshes/SM_Building"));
    Mesh = CreateOptionalDefaultSubobject<UStaticMeshComponent>(MeshComponentName);
    if (Mesh == nullptr)
        return;
    Mesh->SetStaticMesh(buildingMesh.Object);
}


結果
f:id:PaperSloth:20170703224659p:plain
無事にビルのモデルがセットされたActorが出来ました。




余談ですが、Content Browserは4つまで表示出来ます。
f:id:PaperSloth:20170703204541p:plain