UE5をさわっている際に、コンテンツブラウザのアセットへのアクセスではまったので、メモも兼ねて記事にします。
過去に投稿した記事『FStringからブループリントをSpawnする』の内容が、UE5だとアクセスの仕方が変わっていた箇所もあり、補足の記事となります。
調査環境
UnrealEngine 5.1.1
AssetDataとは
コンテンツブラウザのアセットへのアクセスするには、目的のアセットのAssetDataを見つける必要があります。
AssetDataの説明については、以前書いた記事の『AssetData構造体とは』または、『AssetData構造体を取得する為のノード』をご参照ください。
AssetDataについては、二つ注意点があります。
一つ目の注意点は、UE5では、AssetData構造体の定義が変わっている点です。
以下の画像のように『AssetClassPath』というパラメータが増えています。
二つ目の注意点が、AssetClassを使わないという点です。
これは、5.1のバージョンから、AssetClassが正しい情報を返さなくなっている為です。
詳細は、おかずさんがTwitterで説明されている為、おかずさんのツイートをご参照ください。
AssetDataを取得する方法
今回補足したかった点です。
基本的には、以前書いた記事での紹介しているように、GetAssetsRegistryを使って、GetAssetByPathやGetAssetsbyClass等のノードを使用する事で変わりません。
UE5から、『ContentBrowserDataSubsystem』や『SubobjectDataSubsystem』というサブシステムが追加されており、GetAssetByPathやGetAssetsbyClassなどのノードが実装されています。
その為、当初はこちらに移行するのかなっと考えていましたが、GetAssetsRegistryと同様の使い方をしても、目的の動作はしませんでした。
今後、バージョンアップされた際に、Subsystemを使う必要があるかも知れません。
GetAssetsbyClassでの、引数のClassNameがName型ではなく、TopLevelAssetPath型になっている為、注意してください。
プロジェクトの内のアセットを探すのが目的なら、TopLevelAssetPathのPackageNameは、『/Script/Engine』 を入れておけば大丈夫です。
ブループリントのクラスを取得する
今回補足したかったもう一つの点です。
過去に投稿した記事『FStringからブループリントをSpawnする』だと、AssetDataからのAsset化は、『AssetRegistryのGetAssetsから、名前一致でAssetDataを見つけるという方法』を取っていたのですが、この方法だと、AssetDataを見つける事は出来ますが、Castが失敗してしまう為、Asset化が出来ない事が分かりました。
対応方法としては、こちらもおかずさんがQita記事を上げているので、一度参照ください。
具体的には、以下のようなブループリントのように、『GetBlueprintAsset』から目的のブループリントを引数に渡して、GetObjectまで変換してキャストを行います。
GetAssetsRegistryから探した、AssetDataからのAsset化は、キャストに失敗してしまいます。
最後に
最後に、GetDataで取得できるSubjectData構造体で実装されているチェックノードを紹介して記事を締めます。
IsRootComponent
ルートコンポーネント(ブループリントの直下のコンポーネント)であるかをチェックする。
IsDefaultSceneRoot
DefaultSceneRootであるかをチェックする。
IsSceneComponent
SceneComponentであるかをチェックする。
IsRootActor
結果がtrueで返さってきます。
IsRootActorの挙動はちょっと不明です。『This is the root actor if it points to an AActor and has no parent』っという説明されていた為、Actorを親クラスにしたブループリントのサブクラスであるかの判定を行っているのかと思いましたが、そういう訳でもなさそうでした...。
IsNativeComponent
こちらは、EComponentCreationMethod::Nativeでないかのチェックを行っています。EComponentCreationMethod::Nativeは、クラス宣言時にデフォルトとしてセットされている為、
EComponentCreationMethod::Nativeでないかのチェックがどういう時に、役に立つのか調べきれませんでした。
列挙型のEComponentCreationMethodは、以下の定義がされています。
UENUM()
enum class EComponentCreationMethod : uint8
{
/** A component that is part of a native class. */
Native,
/** A component that is created from a template defined in the Components section of the Blueprint. */
SimpleConstructionScript,
/**A dynamically created component, either from the UserConstructionScript or from a Add Component node in a Blueprint event graph. */
UserConstructionScript,
/** A component added to a single Actor instance via the Component section of the Actor's details panel. */
Instance,
};
事前にチェックを行い、Castノードに余計なアセットが辿り着かないようにチェックを行いましょう。