Datasmith のメタデータを使用する

Unreal でアセットに関するカスタム メタデータを取得し、ブループリント スクリプティングや Python スクリプティングを使用してエディタ内およびランタイム時の両方でメタデータを処理する方法について説明します。

Datasmith インポータでは処理対象のオブジェクトに関する メタデータ を自動的に取り込むことができます。このメタデータは 3D デザインまたは CAD アプリケーションで各オブジェクトに対してユーザーがセットアップした情報です。メタデータは、通常、アセットが表す、機械のパーツや建築要素に関する実世界の情報 (そのピースのコスト、構成している素材、重量や断熱性能などの物理特性、パーツに加えることのできる最大トルクなどの使用上の情報など) を保存するために使用されます。メタデータは、アセットに関してプロジェクトで必要になる可能性がある他の種類の情報を保存するために使用することもできます。

Unreal Engine と Unreal Editor でこのメタデータを利用できるようにすると、次の 2 つの点で役に立ちます。

  • アセット パイプライン内: アセットをインポートし、レベルをセットアップするときにメタデータを使用できます。これは異なる処理が必要な異なる種類のアセットとアクタを区別するために役に立ちます。次はその例です。例:

    • Datasmith インポート プロセス時にメタデータを使用して、最終シーンに不要な特定の種類のアセットを識別することで、そのような不要なアセットのインポートを省略することができます。

    • インポート後にメタデータを使用して、レベル内のマージ、結合、置換したいアクタ、またはマテリアルを置換したいアクタを識別できます。

  • ゲームのランタイム時: ランタイム時にメタデータを使用して、ソース デザイン ツールから取り込んだアクタに関する選択した情報をユーザーに表示できます。次はその例です。例:

    • レベルのオブジェクトに、構造プロパティに関する情報を含む BIM データがある場合は、プレイヤーがシーンでそれらのオブジェクトを選択すると、インタラクティブ体験でその情報を視覚化する必要がある場合があります。

    • または、プレイヤーが異なるデザイン オプションを選択できる製品コンフィギュレータのプロジェクトである場合、プレイヤーがその時点で選択した表示されているアセットに割り当てられるコストのメタデータに基づいてコストの中間結果を、ゲームプレイ ロジックで計算して表示する必要がある場合があります。

このページでは Datasmith インポート プロセスを通じて Unreal にメタデータを取り込む方法、エディタ内およびランタイム時の両方でスクリプトでメタデータにアクセスする方法について説明します。

メタデータ ソース

現在、Datasmith は次のデザイン ツールからメタデータをインポートします。

現在、Datasmith はジオメトリのメタデータのみを処理します。ライトやカメラなど他のシーン オブジェクトのメタデータの処理はサポートしていません。

Unreal Editor でメタデータを表示する

Datasmith のインポート プロセスが完了したら、[Details (詳細)] パネルの [Asset User Data (アセット ユーザー データ)] セクションで、レベルの Static Mesh アクタのメタデータを確認できます。

Viewing Datasmith metadata in Unreal

現在のことろ、Datasmith のメタデータは Unreal Editor では読み取り専用です。

ブループリントおよび Python でメタデータにアクセスする

シーンのオブジェクトに関連付けられているメタデータにアクセスする方法は複数あります。使用すべき方法は、メタデータにアクセスする必要があるのが Datasmith のインポート プロセス中であるのか、インポートの終了後であるのかに応じて決まります。

すべてのメタデータのキーと値は、デザイン アプリケーションまたは CAD アプリケーションでの元のタイプに関係なく、Unreal Engine では文字列として保存されます。例えば、3ds Max のメタデータ値に、true などの Boolean 値や 312 などの数値を設定した場合、Unreal 内でスクリプトで読み取るときには、それらの値は文字列になります。値が Boolean や数値である必要がある場合、[Utilities (ユーティリティ)] > [String (文字列)] > [String to Int (文字列を整数に変換)] または [String to Float (文字列を浮動小数点に変換)] などのブループリント変換ノード、または int()、float() などの Python のビルトイン文字列解析関数を使用してください。

インポート中にメタデータにアクセスする

Datasmith インポート プロセス に (たとえばシーンに Unreal のアセットを生成する前に、除外したい特定のメッシュを識別するために、メタデータにアクセスする必要がある場合)、Datasmith シーンからメタデータを読み取ることができます。入力プロセス中にスクリプトを実行する方法の背景情報については、「Datasmith インポート プロセスをカスタマイズする」を参照してください。

Datasmith シーンで「メッシュ アクタ要素」にアタッチされているメタデータが見つかります。

%Globals:BlueprintOrPythonSelectVar%

必要なノードは [Datasmith] > [Scene (シーン)] および [Datasmith] > [Element (要素)] にあります。

これらのノードにアクセスするには、コンテキスト メニューの [Context Sensitive (状況依存)] チェックボックスをオフにするか、パレットで必要なノードを見つける必要があります。

ノード

説明

Get All Metadata

Datasmith シーンのすべてのオブジェクトに関して記録されたすべてのメタデータ オブジェクトの配列を取得します。

Get All Objects and Values for Key

指定のキーを含む Datasmith シーンのすべてのオブジェクトのリストを取得します。それらすべてのオブジェクトで該当キーに関して記録されたすべての値のリストも取得します。

Get Metadata for Object

指定のオブジェクトに割り当てられているすべてのメタデータを取得します。

Get Metadata Value for Key

指定のオブジェクトに割り当てられている指定のキーの値を取得します。

Get Metadata Keys and Values for Value

値が ◆String to Match◆ 入力に一致する指定のオブジェクトのすべてのキーを取得します。

Datasmith Metadata Element オブジェクトを返す上記のノードの場合、[Datasmith] > [Element (要素)> [Get Properties (プロパティの取得)][Get Property (プロパティの取得)][Get Properties Count (プロパティ数の取得)] を使用して、メタデータ オブジェクトからキー/値を取得できます。

Datasmith Metadata Element

使用例

この例では、メタデータ キーに割り当てられた値を使用して、プロジェクトに不要であることがわかっているジオメトリを識別して、Static Mesh アセットを作成する前に Datasmith シーンからそのジオメトリを削除する方法を示しています。

Datasmith のインポート プロセス中に、unreal.DatasmithSceneElement オブジェクトを使用してシーンのオブジェクトに関するメタデータを取得できます。次の関数の詳細については、「Python API リファレンス」 を参照してください。

get_all_metadata(object_class) Datasmith シーンのすべてのオブジェクトに関して記録されたすべてのメタデータ オブジェクトの配列を取得します

get_all_objects_and_values_for_key(key, object_class) 指定のキーを含む Datasmith シーンのすべてのオブジェクトのリストを取得します。それらすべてのオブジェクトで該当キーに関して記録されたすべての値のリストも取得します。

get_metadata_for_object(object) 指定のオブジェクトに割り当てられているすべてのメタデータを取得します。|

get_metadata_value_for_key(object, key) 指定のオブジェクトに割り当てられている指定のキーの値を取得します。|

get_metadata_keys_and_values_for_value(object, string_to_match) 2 番目のパラメータに一致する値をもつ指定されたオブジェクトのすべてのキーを取得します。

使用例

この例では、メタデータ キーに割り当てられた値を使用して、プロジェクトに不要であることがわかっているジオメトリを識別して、Static Mesh アセットを作成する前に Datasmith シーンからそのジオメトリを削除する方法を示しています。

    key_name = "name"
    remove_keyword = "Clutch"
    meshes_to_skip = set([])
    # Get all scene elements that have the "name" key.
    objects_and_values = ds_scene_in_memory.get_all_objects_and_values_for_key(key_name, unreal.DatasmithMeshActorElement)
    objects = objects_and_values[0]
    values = objects_and_values[1]
    # Iterate through them looking for ones whose value matches a keyword
    for index, value in enumerate(values):
        if remove_keyword in value:
            print("removing actor named: " + value)
            # Remove the mesh actor element from the scene, and put the mesh element in a list to remove later
            mesh_actor = objects[index]
            mesh = mesh_actor.get_mesh_element()
            meshes_to_skip.add(mesh)
            ds_scene_in_memory.remove_mesh_actor(mesh_actor)
    # Remove all the meshes we don't need to import.
    for mesh in meshes_to_skip:
        mesh_name = mesh.get_element_name()
        print("removing mesh named " + mesh_name)
        ds_scene_in_memory.remove_mesh(mesh)

インポート後にメタデータにアクセスする

インポート プロセスで Datasmith シーンが Unreal のアセットとアクタにファイナライズされたら、Datasmith では、Datasmith シーンの各メッシュ要素のメタデータを、その Static Mesh アセットのインスタンスを表す、レベルのすべてのアクタにも適用します。その後は、ユーザーがブループリントまたは Python を使用して、レベルで Static Mesh アクタの一部またはすべてのメタデータを取得できます。

%Globals:BlueprintOrPythonSelectVar%

次のノードは 1 つの特定のアクタのメタデータにアクセスします。これらはパフォーマンスへの影響はほとんどありません。そのため、プロジェクトのランタイム時でもいつでも、使用できます。使用するシーン (コールアウトやプロジェクトのランタイム UI のメニュー) にある 1 つ以上の選択されたオブジェクトのインポートされたメタデータを視覚化したい場合は、以下がランタイムのブループリント グラフで使用する必要のあるノードです。

これらのノードは [Datasmith User Data (Datasmith ユーザー データ)] カテゴリにあります。  

ノード

説明

Get Datasmith User Data Value for Key

指定のオブジェクトに割り当てられている指定のキーを含むメタデータの値を取得します。

Get Datasmith User Data Keys and Values for Value

String to Match 入力で指定する値を含む指定されたオブジェクト上のすべてのキーを取得します。キーの名前がわからず、 だけわかっている場合の検索にはこのノードを使用します。

Get Datasmith User Data

アクタに関して記録されているすべて**のキー/値のペアを含むメタデータ オブジェクトを取得します。これにより、これらのメタデータ オブジェクトにユーザーが繰り返し処理を行うことができます。

対照的に次のノードは、現在のレベル (または特定のクラスを共有するすべて) にあるすべての Static Mesh アクタのメタデータにアクセスします。レベルには多数のアクタが含まれていることがあるため、これらの関数は CPU リソースを大量に消費することがあり、ランタイム ゲームプレイで使用するとパフォーマンスが低下する可能性があります。そのため、これらのノードは、エディタ専用ブループリント クラスで作成するグラフでのみ使用できます。

これらのノードは、[Editor Scripting (エディタ スクリプティング)] > [Datasmith User Data (Datasmith ユーザー データ)] カテゴリにあります。

ノード

説明

Get All Objects and Values for Key

Datasmith のメタデータの指定キーを含む現在のレベルにあるすべてのアクタのリストを取得します。それらすべてのオブジェクトで該当キーに関して記録されたすべての値のリストも取得します。

Get All Datasmith User Data

現在のレベルにあるすべてのアクタのすべてのメタデータ オブジェクトの完全なリストを取得します。

上記の Get Datasmith User Data ノードおよび Get All Datasmith User Data ノードでは、Datasmith ユーザー データ オブジェクトのリファレンスを返します。このオブジェクトには、オブジェクトの Datasmith のメタデータを構成するすべてのキーと値/ペアのマップである、メタデータと呼ばれるアクセス可能な変数が 1 つあります。このタイプのオブジェクトを操作するには、出力ピンをドラッグして、[Variables (変数)] > [Get Metadata (メタデータの取得)] を選択します。

Datasmith User Data Object References

これにより、キー/値がマップとして提供されます。これで、[Utilities (ユーティリティ)]> [Map (マップ)] カテゴリのユーティリティ ノードを使用して、データを操作できます。例えば、このグラフはすべてのキーを 1 つずつ繰り返し処理して、各キーに関連付けられた値を取得します。

詳細については、「ブループリント API リファレンス」を参照してください。

使用例

このセクションでは、レベルでプレイヤーが選択するオブジェクトの、ランタイム時のアセット メタデータをどのように視覚化する方法の簡単な例を示します。

Metadata in a UMG widget

テキストは、それぞれが文字列変数に関連付けられている 2 つのテキスト フィールドを含む UMG ウィジェットにより記述されます。ウィジェット用のブループリント グラフでは、カスタム イベントに渡す、アクタから Datasmith のメタデータの 2 つのアイテムをカスタム アクションが抽出し、それらのアイテムを関連付けられている変数に保存します。

UMG widget Event Graph

次のレベル ブループリントでは、プレイが開始されたときにこのようなウィジェットを追加する方法、およびユーザーがマウス ボタンを押すたびにカーソルの下にあるアクタとともに取り込む方法の例を示します。

UMG でのユーザー インターフェースのビルドの詳細については、「UMG UI デザイナー クイック スタート ガイド」 およびその関連セクションを参照してください。

Datasmith のインポート プロセスが完了したら、unreal.DatasmithContentLibrary クラスを使用して、すべてのアクタまたは選択したアクタのメタデータにアクセスできます。次の関数の詳細については、「Python API リファレンス」 を参照してください。

get_all_datasmith_user_data(object_class) 現在のレベルにあるすべてのアクタのすべてのメタデータ オブジェクトの完全なリストを取得します。

get_all_objects_and_values_for_key(key, object_class) Datasmith のメタデータの指定キーを含む現在のレベルにあるすべてのアクタのリストを取得します。それらすべてのオブジェクトで該当キーに関して記録されたすべての値のリストも取得します。

get_datasmith_user_data(object) アクタに関して記録されているすべて**のキー/値のペアを含むメタデータ オブジェクトを取得します。これにより、これらのメタデータ オブジェクトにユーザーが繰り返し処理を行うことができます。

get_datasmith_user_data_keys_and_values_for_value(object, string_to_match) 2 番目のパラメータで指定する値を含む指定されたアクタ上のすべてのキーを取得します。キーの名前がわからず、値だけわかっている場合の検索にはこのノードを使用します

get_datasmith_user_data_value_for_key(object, key) 指定のアクタに割り当てられている指定のキーを含むメタデータの値を取得します。

使用例

Unreal Editor 内で実行する Python スクリプトでは、インポート後に Datasmith のメタデータを使用して、特定の特殊な処理を適用したいレベル内の Static Mesh アクタを特定できます。

    import unreal
    new_actor_name = "Exterior Walls"
    metadata_key = "Type"
    metadata_value = "Wall:Exterior"
    meshes_to_join = set([])
    # Iterate through the Actors in the current Level
    all_actors = unreal.EditorLevelLibrary.get_all_level_actors()
    for actor in all_actors:
        # Retrieve the value of this Actor's Datasmith metadata for the key set above, if any
        actor_value = unreal.DatasmithContentLibrary.get_datasmith_user_data_value_for_key(actor, metadata_key)
        # If the key exists, and its value contains a keyword set above, add the Actor to a list
        if actor_value and metadata_value in actor_value:
            print("found a matching actor: " + actor_value)
            meshes_to_join.add(actor)
    # Join all Actors that were found above into a single Actor with many components
    options = unreal.EditorScriptingJoinStaticMeshActorsOptions(destroy_source_actors=True, new_actor_label=new_actor_name, rename_components_from_source=True)
    unreal.EditorLevelLibrary.join_static_mesh_actors(meshes_to_join, options)
    print "Merged all actors!"
このページは Unreal Engine の前のバージョン用です。現在リリースされている Unreal Engine 5.1 に対して更新は行われていません。
Unreal Engine のドキュメントを改善するために協力をお願いします!どのような改善を望んでいるかご意見をお聞かせください。
調査に参加する
キャンセル