オブジェクト名からPackageNameを取得する

この記事は[Unreal Engine 4 (UE4) その2 Advent Calendar 2020](https://qiita.com/advent-calendar/2020/ue4_due)の7日目の記事です。

# 最初に
この記事で扱っている情報は、4.25.4のバージョンでの説明となっております。

# オブジェクト名とは
この記事では、コンテンツブラウザから見えるuassetやumapに名前を指しています。

# PackageNameとは
公式サイトで明確な説明を見つける事は出来ませんでしたが、UE4プロジェクトにおける、Assetのアドレスのようなものです。
例えば、コンテンツ直下にBP_Aというブループリントがあった場合は、「Game/BP_A」が、PackageNameとなります。

また、公式サイトには、[アセットとパッケージ](https://docs.unrealengine.com/ja/Engine/Basics/AssetsAndPackages/index.html)という説明ページがあります。

# 何に使うものなのか
UE4Editorから作業を行っている場合は、通常は意識して使用する機会は少ないかと思います。
逆に言えば、何らかの形で、UE4Editorに対して、外部から作業を行いたい場合に、どのAssetを操作するべきなのかAssetを特定する為に、UE4Editorに引数として渡したりもされます。

# PackageNameを調べるには
方法は、色々ありますが、この記事では[AssetRegistry](https://docs.unrealengine.com/ja/Programming/Assets/Registry/index.html)を使用しています。
Get Asset Registryというノードから、AssetRegistryのインスタンスを取得し、AssetData構造体を取得する必要があります。
AssetData構造体を取得する為のノードもいくつか用意されています。
![GetAssetReaistryノード.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/153021/9b7c8fb1-067f-5c65-1f17-18d68e633173.png)

# AssetData構造体とは
パラメータとして、以下の情報を持っています。
![AssetData構造体.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/153021/120bda84-fee3-bca3-3b63-8fd59a33696b.png)


# AssetData構造体を取得する為のノード
簡単にいくつかのノードをご紹介します。
また、「 <b>GetAsset</b> 」となっているノードは、単一のデータを取得でき、「<b>GetAssets</b>」となっているノードは、配列で取得します。

#### GetAssetByClass
Class名で、AssetDataを取得します。
<b>SearchSubClasses</b>は、サブクラスも候補にいれるかどうかです。

![GetAssetsByClass.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/153021/4d1bedc8-04e1-abc3-7d0e-5614cb28b10a.png)

例えば、よく使いそうな物は、以下の物があります。

| AssetClass名                | アセット                       |
|:----------------------------|:------------------------------|
| World                       |レベル                          |
| LevelSequence               |レベルシーケンス                 |
| MapBuildDataRegistry        |レベルのビルドデータ             |
| Material                    |マテリアル                      |
| MaterialInstanceConstant    |マテリアルインスタンス           |
| Blueprint                   |ブループリント                  |

Class名は、SlateEditorStyle.cppでAssetTypesという名前の配列で定義されています。
どのAssetClassが何を指しているかを全て調査はしていません。レベルのように、名前から予想が付かないものも中にはあります。

<b>cppファイルの場所</b> : UnrealEngine-4.25\Engine\Source\Editor\EditorStyle\Private\SlateEditorStyle.cpp


```cpp:SlateEditorStyle.cpp
// Asset Type Classes
const TCHAR* AssetTypes[] = {

	TEXT("AbilitySystemComponent"),
	TEXT("Actor"),
	TEXT("ActorComponent"),
	TEXT("AIController"),
	TEXT("AimOffsetBlendSpace"),
	TEXT("AimOffsetBlendSpace1D"),
	TEXT("AIPerceptionComponent"),
	TEXT("AnimationModifier"),		
	TEXT("AnimBlueprint"),
	TEXT("AnimLayerInterface"),
	TEXT("AnimComposite"),
	TEXT("AnimInstance"),
	TEXT("AnimMontage"),
	TEXT("AnimSequence"),
	TEXT("AnimationSharingSetup"),
	TEXT("ApplicationLifecycleComponent"),
	TEXT("AtmosphericFog"),
	TEXT("BehaviorTree"),
	TEXT("BlackboardData"),
	TEXT("BlendSpace"),
	TEXT("BlendSpace1D"),
	TEXT("BlockingVolume"),
	TEXT("Blueprint"),
	TEXT("BlueprintFunctionLibrary"),
	TEXT("BlueprintInterface"),
	TEXT("BlueprintMacroLibrary"),
	TEXT("BoxReflectionCapture"),
	TEXT("ButtonStyleAsset"),
	TEXT("CableActor"),
	TEXT("CableComponent"),
	TEXT("CameraActor"),
	TEXT("CameraAnim"),
	TEXT("CameraBlockingVolume"),
	TEXT("Character"),
	TEXT("CharacterMovementComponent"),
	TEXT("Class"),
	TEXT("CullDistanceVolume"),
	TEXT("CurveBase"),
	TEXT("DataAsset"),
	TEXT("DataTable"),
	TEXT("DecalActor"),
	TEXT("Default"),
	TEXT("DefaultPawn"),
	TEXT("DialogueWave"),
	TEXT("DialogueVoice"),
	TEXT("DirectionalLight"),
	TEXT("DirectionalLightMovable"),
	TEXT("DirectionalLightStatic"),
	TEXT("DirectionalLightStationary"),
	TEXT("DocumentationActor"),
	TEXT("EditorTutorial"),
	TEXT("EnvQuery"),
	TEXT("ExponentialHeightFog"),
	TEXT("FileMediaSource"),
	TEXT("Font"),
	TEXT("FontFace"),
	TEXT("ForceFeedbackEffect"),
	TEXT("GameModeBase"),
	TEXT("GameStateBase"),
	TEXT("HUD"),
	TEXT("Interface"),
	TEXT("InterpData"),
	TEXT("KillZVolume"),
	TEXT("Landscape"),
	TEXT("LevelBounds"),
	TEXT("LevelSequence"),
	TEXT("LevelStreamingVolume"),
	TEXT("LightmassCharacterIndirectDetailVolume"),
	TEXT("VolumetricLightmapDensityVolume"),
	TEXT("LightmassImportanceVolume"),
	TEXT("MassiveLODOverrideVolume"),
	TEXT("Material"),
	TEXT("MaterialFunction"),
	TEXT("MaterialInstanceActor"),
	TEXT("MaterialInstanceConstant"),
	TEXT("MaterialParameterCollection"),
	TEXT("MatineeActor"),
	TEXT("MediaPlayer"),
	TEXT("MediaTexture"),
	TEXT("LevelSequenceActor"),
	TEXT("MultiFont"),
	TEXT("NavLinkProxy"),
	TEXT("NavMeshBoundsVolume"),
	TEXT("NavModifierComponent"),
	TEXT("NavModifierVolume"),
	TEXT("Note"),
	TEXT("ObjectLibrary"),
	TEXT("PainCausingVolume"),
	TEXT("ParticleSystem"),
	TEXT("Pawn"),
	TEXT("PawnNoiseEmitterComponent"),
	TEXT("PawnSensingComponent"),
	TEXT("PhysicalMaterial"),
	TEXT("PhysicsAsset"),
	TEXT("PhysicsConstraintActor"),
	TEXT("PhysicsConstraintComponent"),
	TEXT("PhysicsHandleComponent"),
	TEXT("PhysicsThruster"),
	TEXT("PhysicsThrusterComponent"),
	TEXT("PhysicsVolume"),
	TEXT("PlaneReflectionCapture"),
	TEXT("PlatformMediaSource"),
	TEXT("PlayerController"),
	TEXT("PlayerStart"),
	TEXT("PointLight"),
	TEXT("PoseAsset"),
	TEXT("PostProcessVolume"),
	TEXT("PrecomputedVisibilityOverrideVolume"),
	TEXT("PrecomputedVisibilityVolume"),
	TEXT("ProceduralFoliageVolume"),
	TEXT("ProceduralFoliageBlockingVolume"),
	TEXT("ProjectileMovementComponent"),
	TEXT("RadialForceActor"),
	TEXT("RadialForceComponent"),
	TEXT("ReflectionCapture"),
	TEXT("RotatingMovementComponent"),
	TEXT("SceneCapture2D"),
	TEXT("SceneCaptureCube"),
	TEXT("SceneComponent"),
	TEXT("SkyLight"),
	TEXT("SkyLightComponent"),
	TEXT("SkyAtmosphere"),
	TEXT("SkeletalMesh"),
	TEXT("Skeleton"),
	TEXT("SlateBrushAsset"),
	TEXT("SlateWidgetStyleAsset"),
	TEXT("StringTable"),
	TEXT("SphereReflectionCapture"),
	TEXT("SpotLight"),
	TEXT("SpotLightMovable"),
	TEXT("SpotLightStatic"),
	TEXT("SpotLightStationary"),
	TEXT("SpringArmComponent"),
	TEXT("StaticMesh"),
	TEXT("StreamMediaSource"),
	TEXT("SubsurfaceProfile"),
	TEXT("TargetPoint"),
	TEXT("TextRenderActor"),
	TEXT("Texture2D"),
	TEXT("TextureRenderTarget2D"),
	TEXT("TextureRenderTargetCube"),
	TEXT("TriggerBase"),
	TEXT("TriggerBox"),
	TEXT("TriggerCapsule"),
	TEXT("TriggerSphere"),
	TEXT("TriggerVolume"),
	TEXT("TouchInterface"),
	TEXT("UserDefinedCaptureProtocol"),
	TEXT("UserDefinedEnum"),
	TEXT("UserDefinedStruct"),
	TEXT("UserWidget"),
	TEXT("WidgetBlueprint"),
	TEXT("WindDirectionalSource"),
	TEXT("World"),
	TEXT("Cube"),
	TEXT("Sphere"),
	TEXT("Cylinder"),
	TEXT("Cone"),
	TEXT("Plane"),
	TEXT("CineCameraActor"),
	TEXT("CameraRig_Crane"),
	TEXT("CameraRig_Rail"),
	TEXT("FoliageType_Actor")
};

```

#### GetAssetByPath
GetAssetByPathは、PackagePathから、その階層にあるAssetDataを取得します。
例えば、Contentの直下に「TestPath」というフォルダを作成してある場合は、以下のPackagePathで取得できます。
正 : /Game/TestPath
誤 : /Game/TestPath/TestActor.TestActor ※ ObjectPathにしてしまうと正しく動作しません

<b>Recursive</b>は、下の階層まで結果に含めるかどうかです。
<b>IncludeOnlyOnDiskAssets</b>が、trueの場合は、保存されていないアセットは含まれません。

![GetAssetsByPath.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/153021/198f6e68-abbd-6cb9-56d8-579e5bb519ce.png)


#### GetAssetByObjectPath
ObjectPathから、AssetDataを特定するノードです。
<b>IncludeOnlyOnDiskAssets</b>が、trueの場合は、保存されていないアセットは含まれません。

![GetAssetByObjectPath.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/153021/e80c75dc-46ee-837d-5ced-dec320961296.png)

#### GetAllAssetsノード　
名前の通り、プロジェクト内の全てのAssetDataを取得します。AssetDataをどこを探したら分からない場合は、オブジェクト名から、全探索するしかないでしょう。
<b>IncludeOnlyOnDiskAssets</b>が、trueの場合は、保存されていないアセットは含まれません。

![GetAllAssets.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/153021/cdcf6b9a-5af6-26ca-c726-05282721c4b4.png)



他にも、いくつかのノードが用意されています。

# 生成する事もできる
公開されているノードでは、AssetDataをAssetRegistryから取得する場合は、「PackageName」「PackagePath」「ObjectPath」など、AssetData構造体が持っている情報から引いてくる必要があり、AssetDataが持っている情報を持っていない場合は、正直面倒です。

ただ、これらの情報は、フォーマットが決まっている為、オブジェクト名やディレクトリパスから生成する事も可能です。

<b>PackagePath</b>・・・Content以下をパスのルートとして、先頭に「/Game」を追加します
例 : /Game/TestPath
<b>PackageName</b>・・・PackagePathにオブジェクト名を追加します
例 : /Game/TestPath/TestLevel
<b>ObjectPath</b>・・・PackageNameの最後尾に、「.(ドット)」を入れ、オブジェクト名をくっつけます
例 : /Game/TestPath/TestLevel.TestLevel

また、エクスプローラーのパスからObjectPathを生成する事もノードのみで可能なので、一緒に載せておきます。
<font color="Red" size="2">**※ フルパスにしか対応していません**</font>
<font color="Red" size="2">**※ 同じプロジェクト内のフォルダしか変換できません**</font>

![エクスプローラーのパスからObjectPathを生成する.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/153021/bbb059b1-4396-d5e0-0e74-28e58b09bfeb.jpeg)

[エクスプローラーのパスからObjectPathを生成する](https://blueprintue.com/blueprint/g3kgxrk7/)

明日は、[EpicJapanの篠山さん](https://qiita.com/EGJ-Nori_Shinoyama)の発表になります。
楽しみですね！