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

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

Windows
MacOS
Linux

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

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

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

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

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

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

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

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

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

メタデータ ソース

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

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

Autodesk 3ds Max

[Object Properties (オブジェクト プロパティ)] ウィンドウの [User Defined (ユーザー定義)] タブで 3ds Max オブジェクトにメタデータを追加します。

Metadata in 3ds Max User Defined Properties

3ds Max でメッシュ用のこのパネルを表示するには、次の手順を実行します。

  1. ウトライナまたはビューポートでメッシュを選択します。

  2. 右クリックして、コンテキスト メニューから [Properties (プロパティ)] または [Object Properties (オブジェクト プロパティ)] を選択するか、メイン メニューから [Edit (編集)] > [Properties (プロパティ)] を選択します。

  3. 上図のように、key = value ペアの形式でこのパネルにメタデータを入力します。

    等号 (=) の両側に必ず半角スペースを 1 つ入れてください 。このスペースがない場合、Datasmith がメタデータを認識できず、予期したとおりにメタデータがインポートされません。

using MAXScript を使用してユーザー定義のプロパティをセットアップすることもできます。

元は Revit で作成され、3ds Max にインポートされたモデルの場合、3ds Max インポータにより、ユーザー定義プロパティにモデルの BIM 情報がすでに設定されています。

Autodesk Revit

Revit ビューで要素を選択すると、[Properties (プロパティ)] パレットに、その要素に割り当てられているすべてのインスタンス プロパティのリストが表示されます。これらの値は自由に変更したり、独自のカスタム プロパティを追加したりできます。

これらのプロパティの設定方法および使用方法の詳細については、「Revit のヘルプ」 を参照してください。

Datasmith を使用して Revit のシーンを Unreal Editor にインポートする場合、Datasmith では各 Revit 要素のすべてのインスタンスのプロパティを、Unreal Engine のレベルでその要素用に Datasmith が作成する Static Mesh アクタのメタデータとして割り当てます。また、このメタデータには、空でないオブジェクトの Revit タイプの任意の型のプロパティも含まれています。

Datasmith のメタデータは常にキー/値ペアのフラット リストであるため、[Properties (プロパティ)] パレットのカテゴリのヘッダー (上図の [Constraints (コンストレイント)][Structural (構造)][Dimensions (寸法)]、および [Identity Data (識別データ)] など) は含まれません。実際のプロパティの名前と値のみが保持されます。

Dassault Systèmes SolidWorks

SolidWorks ファイルをインポートすると、Datasmith では、作成する各 Static Mesh アクタに最小限の事前設定メタデータを追加して、元の SolidWorks デザインでのそのメッシュのパーツ名とアセンブリを示します。ただし、Datasmith では、現時点では、パーツやアセンブリに追加するカスタム メタデータ プロパティを引き継ぎません。

Trimble SketchUp Pro

SketchUp で作成する各コンポーネントでは、[Price (価格)]、[Size (サイズ)] および [Status (ステータス)] など Advanced Attributes を設定できます。

Metadata in SketchUp Pro Advanced Attributes

Datasmith では、Type 値 (ある場合) を含むこれらすべての高度な属性をメタデータにインポートします。

Datasmith のメタデータはコンポーネントのジオメトリを表す個別の Static Mesh アクタではなく、シーン階層のコンポーネントを表すアクタにアタッチされている場合があります。シーンでこのようなアクタを使用している場合、後述されるブループリントや Python の例を調整する必要があります。

Maxon Cinema 4D

Cinema 4D では、[Attributes (属性)]パネルで [User Data (ユーザー データ)] > [Manage User Data (ユーザー データの管理)] を選択して、シーンの各オブジェクトにユーザー データを追加できます。

User Data set on an object in Cinema 4D

この実行方法の詳細については、「Cinema 4D ドキュメント」 を参照してください。

データ変換にはいくつかの重要な注意事項が適用されます。

  • Cinema 4D では、ユーザー データを階層グループに編成することができますが、Unreal Engine では Datasmith のメタデータは常にキー/値のフラット リストです。上記のようにユーザー データにグループが含まれている場合、Datasmith では階層を平坦化して、すべてのグループのすべてのメタデータ キーを単一のフラット リストに保存します。グループ名自体は破棄されます。

    例えば、以下の画像では、グループがインポートされておらず、ネストされたプロパティ (IntegerDataVectorDataColorDataBooleanData) が StringData および FloatData と兄弟関係になるように移動されていることがわかります。

  • Cinema 4D でユーザー データに設定したデータ型に関係なく、Datasmith のメタデータに保存される値は常に文字列です。Datasmith では、できる限り、元のデータの値を文字列に変換します。この文字列を解析すると関連情報を抽出できます。ただし、グラデーション、他のシーン オブジェクトへのリンク、優先度の値、スプラインなど、一部の複雑または特殊な Cinema 4D のデータ型はサポートされていません。

    例えば、以下の画像は、ColorData アイテムおよび VertexData アイテムが、元の色と頂点の RGB 値と XYZ 値をそれぞれ含む文字列にどのように変換されるかを示しています。

  • Datasmith では、メタデータのキー名に英数字、ハイフンおよびアンダースコアのみ使用できます。ユーザー データの名前に他の文字が含まれている場合、それらの文字は自動的にアンダースコアに変換されます

次の画像は、上記のユーザー データをインポートした結果を示しています。

Cinema 4D user data after conversion

IFC 2x3

Datasmith は、各 IFC オブジェクトに割り当てられたすべてのプロパティをインポートして、Unreal Engine の対応するアクタに Datasmith のメタデータとして保存します。

データ変換に関する注記:

  • IFC ではプロパティをグループに編成できます。例えば、上の画像では、複数のグループ PSet_Revit_MechanicalPSet_Revit_DimensionsPSet_Revit_Identity Data などが表示されています。ただし、Unreal Engine では Datasmith のメタデータは常にキー/値のフラット リストです。上記のように IFC プロパティにグループが含まれている場合、Datasmith では階層を平坦化して、すべてのグループのすべてのメタデータ キーを単一のフラット リストに保存します。グループ名自体は破棄されます。グループ名自体は破棄されます。

  • Datasmith では、メタデータのキー名に英数字、ハイフンおよびアンダースコアのみ使用できます。ユーザー データの名前に他の文字が含まれている場合、それらの文字は自動的にアンダースコアに変換されます例えば、上の画像では、Fixture Units プロパティは、Datasmith のメタデータでは Fixture_Units に変換されます。

    メタデータ値の特殊文字はすべて保持されます。

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 シーンで メッシュ アクタ要素 にアタッチされているメタデータが見つかります。

実装方法を選んでください。

Blueprints

Python

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

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

ノード

説明

Get All Metadata (すべてのメタデータを取得する)
Get All Metadata

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

Get All Objects and Values for Key (キーのすべてのオブジェクトと値を取得する)
Get All Objects and Values for Key

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

Get Metadata for Object (オブジェクトのメタデータを取得する)
Get Metadata for Object

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

Get Metadata Value for Key (キーのメタデータ値を取得する)
Get Metadata Value For Key

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

Get Metadata Keys and Values for Value (値のメタデータのキーおよび値を取得する)
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)
Retrieves an array of all metadata objects recorded for all objects in the Datasmith Scene.

get_all_objects_and_values_for_key(key, object_class)
Retrieves a list of all objects in the Datasmith Scene that have a specified key.You'll also get a list of all values recorded for that key across all those objects.

get_metadata_for_object(object)
Retrieves all metadata assigned to a specified object.

get_metadata_value_for_key(object, key)
Retrieves the value of a specified key assigned to a specified object.

get_metadata_keys_and_values_for_value(object, string_to_match)
Retrieves all keys on a specified object whose value matches the second parameter.

使用例

この例では、メタデータ キーに割り当てられた値を使用して、プロジェクトに不要であることがわかっているジオメトリを識別して、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 アクタの一部またはすべてのメタデータを取得できます。

実装方法を選んでください。

Blueprints

Python

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

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

ノード

説明

Get Datasmith User Data Value for Key
Get Datasmith User Data Value for Key

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

Get Datasmith User Data Keys and Values for Value
Get Datasmith User Data Keys and Values for Value

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

Get Datasmith User Data
Get Datasmith User Data

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

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

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

ノード

説明

Get All Objects and Values for Key
Get All Objects and Values for Key

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

Get All Datasmith User Data
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 つずつ繰り返し処理して、各キーに関連付けられた値を取得します。

ブループリントでのマップの操作方法の詳細については、「Blueprint Map」 を参照してください。

使用例

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

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)
Retrieves the full list of all metadata objects for all Actors in the current Level.

get_all_objects_and_values_for_key(key, object_class)
Retrieves a list of all Actors in the current Level that have a specified key in their Datasmith metadata.You'll also get a list of all values recorded for that key across all those objects.

get_datasmith_user_data(object)
Retrieves a metadata object that contains all key-value pairs recorded for the specified Actor, so that you can iterate through them yourself.

get_datasmith_user_data_keys_and_values_for_value(object, string_to_match)
Retrieves all keys on the specified Actor that have the value you specify in the second parameter.Use this node if you know the value you're looking for, but not the name of the key.

get_datasmith_user_data_value_for_key(object, key)
Retrieves the value of the metadata with the specified key assigned to the specified Actor.

使用例

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!"
Select Skin
Light
Dark

Welcome to the new Unreal Engine 4 Documentation site!

We're working on lots of new features including a feedback system so you can tell us how we are doing. It's not quite ready for use in the wild yet, so head over to the Documentation Feedback forum to tell us about this page or call out any issues you are encountering in the meantime.

We'll be sure to let you know when the new system is up and running.

Post Feedback