6
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

Unreal Engine 4 (UE4) その2Advent Calendar 2020

Day 7

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

Last updated at Posted at 2020-11-30

この記事はUnreal Engine 4 (UE4) その2 Advent Calendar 2020の7日目の記事です。

最初に

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

オブジェクト名とは

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

PackageNameとは

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

また、公式サイトには、アセットとパッケージという説明ページがあります。

何に使うものなのか

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

PackageNameを調べるには

方法は、色々ありますが、この記事ではAssetRegistryを使用しています。
Get Asset Registryというノードから、AssetRegistryのインスタンスを取得し、AssetData構造体を取得する必要があります。
AssetData構造体を取得する為のノードもいくつか用意されています。
GetAssetReaistryノード.png

AssetData構造体とは

パラメータとして、以下の情報を持っています。
AssetData構造体.png

AssetData構造体を取得する為のノード

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

GetAssetByClass

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

GetAssetsByClass.png

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

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

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

cppファイルの場所 : UnrealEngine-4.25\Engine\Source\Editor\EditorStyle\Private\SlateEditorStyle.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にしてしまうと正しく動作しません

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

GetAssetsByPath.png

GetAssetByObjectPath

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

GetAssetByObjectPath.png

GetAllAssetsノード 

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

GetAllAssets.png

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

生成する事もできる

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

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

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

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

エクスプローラーのパスからObjectPathを生成する.jpg

エクスプローラーのパスからObjectPathを生成する

明日は、EpicJapanの篠山さんの発表になります。
楽しみですね!

6
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
6
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?