この記事は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構造体を取得する為のノードもいくつか用意されています。
AssetData構造体とは
AssetData構造体を取得する為のノード
簡単にいくつかのノードをご紹介します。
また、「 GetAsset 」となっているノードは、単一のデータを取得でき、「GetAssets」となっているノードは、配列で取得します。
GetAssetByClass
Class名で、AssetDataを取得します。
SearchSubClassesは、サブクラスも候補にいれるかどうかです。
例えば、よく使いそうな物は、以下の物があります。
AssetClass名 | アセット |
---|---|
World | レベル |
LevelSequence | レベルシーケンス |
MapBuildDataRegistry | レベルのビルドデータ |
Material | マテリアル |
MaterialInstanceConstant | マテリアルインスタンス |
Blueprint | ブループリント |
Class名は、SlateEditorStyle.cppでAssetTypesという名前の配列で定義されています。
どのAssetClassが何を指しているかを全て調査はしていません。レベルのように、名前から予想が付かないものも中にはあります。
cppファイルの場所 : UnrealEngine-4.25\Engine\Source\Editor\EditorStyle\Private\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の場合は、保存されていないアセットは含まれません。
GetAssetByObjectPath
ObjectPathから、AssetDataを特定するノードです。
IncludeOnlyOnDiskAssetsが、trueの場合は、保存されていないアセットは含まれません。
GetAllAssetsノード
名前の通り、プロジェクト内の全てのAssetDataを取得します。AssetDataをどこを探したら分からない場合は、オブジェクト名から、全探索するしかないでしょう。
IncludeOnlyOnDiskAssetsが、trueの場合は、保存されていないアセットは含まれません。
他にも、いくつかのノードが用意されています。
生成する事もできる
公開されているノードでは、AssetDataをAssetRegistryから取得する場合は、「PackageName」「PackagePath」「ObjectPath」など、AssetData構造体が持っている情報から引いてくる必要があり、AssetDataが持っている情報を持っていない場合は、正直面倒です。
ただ、これらの情報は、フォーマットが決まっている為、オブジェクト名やディレクトリパスから生成する事も可能です。
PackagePath・・・Content以下をパスのルートとして、先頭に「/Game」を追加します
例 : /Game/TestPath
PackageName・・・PackagePathにオブジェクト名を追加します
例 : /Game/TestPath/TestLevel
ObjectPath・・・PackageNameの最後尾に、「.(ドット)」を入れ、オブジェクト名をくっつけます
例 : /Game/TestPath/TestLevel.TestLevel
また、エクスプローラーのパスからObjectPathを生成する事もノードのみで可能なので、一緒に載せておきます。
※ フルパスにしか対応していません
※ 同じプロジェクト内のフォルダしか変換できません
明日は、EpicJapanの篠山さんの発表になります。
楽しみですね!