【UE4】名前やパスについてのあれこれ【C++】

#概要
UnrealEngineでは様々な名前やパスを取り扱います。
それらは文字列型で管理され、変数名によって内容が表されています。
変数に何が入っているか確認するための備忘録です。

#文字列について
Tonkotsuさんの記事が非常にわかりやすいです。
[【UE4】FString、FText、FNameの違い](https://shuntaendo.hatenablog.com/entry/2017/07/04/045214)

#様々な名前について
UnrealEngineにおいては同じ文字列型でも変数の名前によってその内容が決められているようです。
例えばObjectNameなどはよく見かけると思います。
そのほかにもPackageNameやFilenameなど様々な変数名が存在します。
エンジンのAPIで要求する文字列を変数名で指定されることがあるので、
変数名と内容の対応を確認していきます。
今回の検証に当たり、下記のようなATestActorというクラスを作成し、デフォルトのThirdPersonCPPレベルに配置して実行しています。

```C++
void ATestActor::BeginPlay()
{
	Super::BeginPlay();

	// 各種コード	
}
```

#アクタが持つ名前とパス
アクタが持つ関数として、以下の二つが容易に見つかるかと思います。

```C++
UE_LOG(LogTemp, Log, TEXT("ObjectName = %s"), *GetName());
UE_LOG(LogTemp, Log, TEXT("PathName = %s"), *GetPathName());
```

これらの出力結果は以下の通りです。

```
GetName()=FilePathActor_2
GetFullName()=FilePathActor_C /Game/ThirdPersonCPP/Maps/UEDPIE_0_ThirdPersonExampleMap.ThirdPersonExampleMap:PersistentLevel.FilePathActor_2
```

GetNameは配置されているアクタの名前ですね。
ただパスはレベルのパスになっています。
次にもう少し詳しく見ていきましょう。

##FAssetData
FAssetDataはアセットのパスや名前などをメンバに持つ構造体です。
UObjectをとりあえずこれに突っ込めば文字列操作不要で欲しい名前やパスを取得することができるはずです。

```C++
const FAssetData AssetData(this);
AssetData.PrintAssetData();
```

出力内容は以下の通りです。

```
FAssetData for /Game/ThirdPersonCPP/Maps/UEDPIE_0_ThirdPersonExampleMap.ThirdPersonExampleMap:PersistentLevel.TestActorBP_2
=============================
    PackageName: /Game/ThirdPersonCPP/Maps/UEDPIE_0_ThirdPersonExampleMap
    PackagePath: /Game/ThirdPersonCPP/Maps
    AssetName: TestActorBP_2
    AssetClass: TestActorBP_C
    TagsAndValues: 0
    ChunkIDs: 0
    PackageFlags: 1179648
```

レベル上に配置されているもののため、パスがレベルになっていますね。
使われているBPの場所を知りたいときは以下のようにすると取得できます。

```C++
const FAssetData DefaultAssetData(GetClass()->GetDefaultObject());
DefaultAssetData.PrintAssetData();
```

出力結果は以下のようになります。


```
FAssetData for /Game/Assets/TestActorBP.Default__TestActorBP_C
=============================
    PackageName: /Game/Assets/TestActorBP
    PackagePath: /Game/Assets
    AssetName: Default__TestActorBP_C
    AssetClass: TestActorBP_C
    TagsAndValues: 0
    ChunkIDs: 0
    PackageFlags: 1
```

これらの出力を見るに、エディタ上で"アセット"とされているものは、
C++では"Package"として扱われているようです。
レベルに配置してあるそのもののパスをとってきても、
ブループリントアセットのお明日が返ってくるわけではないので注意が必要です。
まとめると以下のようになります

| 変数名      | 内容詳細 | 
| ----------- | -------------- | -------- | 
| ObjectPath  | プロジェクトのルートからのパス+オブジェクトの名前 | 
| PackageName | 所属しているアセットのパス+名前 | 
| PackagePath | 所属しているアセットのパス | 
| AssetName   | オブジェクトの名前 | 
| AssetClass  | オブジェクトのクラス名 | 

##FPackageName
ごくまれにfilenameという変数名が登場します。
これはPackageNameに.mapや.uassetなどの拡張子をつけた形になっています。
FPackageNameでは、PackageName周りの文字列の操作を行ってくれる関数や、拡張子の固定文字列などが定義されています。
PackageNameはクラスにもなっている通り様々な場所で扱うことがあります。
ファイル名に関する出力結果について割愛させていただきます。

##FPaths
パスに関する関数があります。
プロジェクトのパスやエンジンのパスなどはここから取得することができます。
ルートパスを変換する関数もあるようです。
あんまりお世話になることはないと思いますが、一応紹介しておきます。

#まとめ

| 変数名               | 文字列の例                                      | 内容まとめ                                                 | 
| -------------------- | ----------------------------------------------- | ---------------------------------------------------------- | 
| ObjectName/AssetName | TestActorBP_C                                   | アセットの名前/配置されたインスタンスの名前/オブジェクト名 | 
| PackageName          | /Game/Assets/TestActorBP                        | オブジェクトが所属するアセットのパス                       | 
| PackagePath          | /Game/Assets                                    | オブジェクトが所属するアセットのフォルダのパス             | 
| ObjectPath           | /Game/Assets/TestActorBP.Default__TestActorBP_C | オブジェクトが所属するアセットのパス+オブジェクト名前      | 
| FileName             | ~/Assets/TestActorBP.asset                      | ルートフォルダからの拡張子付きパス        

備忘録にどうぞ。
自分もよく忘れて出力して中身を確認したりします。          

質問ご指摘などありましたらお気軽にコメントしていただければと思います！