大量のテクスチャーを自動的にレベルに配置できないか?

100枚の絵画のテクスチャーがあって、それをレベルに配置したい場合、どうするのが良いでしょうか?100個のメッシュと100つのマテリアルを作り一つ一つ適用していくという方法もあるでしょう。しかしこれでは効率が悪すぎますし、テクスチャー数の増減や変更にも対応が難しいでしょう。

こうした表現を効率的に実現する場合もデータアセットを利用するというアプローチ方法があります。このチュートリアルではブループリントとデータアセットを組み合わせ、フォルダ内のテクスチャーを自動的に収集して登録、レベルに配置する方法を紹介します。

Primary Data Asset型のブループリントクラスを作成

まずテクスチャーのデータをまとめて保持するためのブループリントクラスを作成します。

  1. 新規作成
  2. ブループリントクラスを選択
  3. すべてのクラスで検索
  4. Primary Data Assetを親クラスとして選択
  5. 作成
  6. 名前を変更し「BP_Data」とします。
アセット内のテクスチャーを検索する仕組み

次に作成した「BP_Data」に変数やブループリントを加えます。ここで定義した変数は後述するデータアセットで使用することできるようになります。ポイントは(6)の「Get Assets by Path」。指定したパス内にあるデータを全て取得できる便利なノードです。

  1. 変数を追加し「TexDic」とします。
  2. 変数の型はMap型に設定します。これは連想配列のようにキーと値をセットに保管する配列です。
  3. カスタムイベントを作成します。名称は「Reload Data」とします。
  4. 「Reload Data」の詳細パネルで「エディタで呼び出す」をONにします。これでエディタ上にボタンが現れ、ボタンをクリックすることでこのイベントが呼び出されるようになります。
  5. 配列を空にします
  6. 検索したいフォルダのパスを入力し「Recursive」をONにします。なおフォルダのURLはコンテンツブラウザで確認できます。
  7. 見つかったテクスチャーの個数分、繰り返し処理を行います。
  8. アセットの情報を分解し、「アセット名」を取り出します。
  9. アセットをテクスチャーとしてキャストします。
  10. アセット名とテクスチャーをセットで配列に代入します。
テクスチャーをデータアセット化

次にデータアセットを作成します。このデータアセットは先ほど作った「BP_Data」を元に、実際にアセットを管理するブループリントクラスになります。(エディタ内のボタンから呼び出されるブループリントによって自動追加される処理にちょっと驚かされます)

  1. 新規作成
  2. その他
  3. データアセットを選択
  4. 「BP_Data」を選択
  5. 作成
  6. 名前を「DataAsset」に変更し、ダブルクリックして開きます。
  7. 「BP_Data」で作成したイベント用ボタン「Reload Data」をクリックすると、アセットの検索が始まり、データアセットの中にデータが自動的に追加されます。
マテリアルの作成

テクスチャーを貼り付けるためのマテリアルを作成しましょう。ポイントはTexture SampleのTexをパラメータ化し、ブループリントから変更できるようにしておくことです。

  1. マテリアルを作成。名前を「Mat_Image」に変更。
  2. マテリアルを開き、Texture Sampleのノードを追加。
  3. Texポートを右クリックし、パラメータへ昇格を選択すると、Texパラメーターノードが追加される。
  4. Texパラメーターの詳細パネルで、Texureを目的のテクスチャーに変更しておくと分かりやすい。
平面を配置したクラスの作成

テクスチャーを実際に貼り付けるためのスタティックメッシュを用意します。今回は平面をビューポートに一つだけ配置したシンプルなブループリントクラスを作成しました。

  1. ブループリントクラスの作成(Actor型)
  2. Planeコンポーネントをビューポートに追加
  3. 位置や向きを調整
  4. マテリアルに先ほど作成した「Mat_Image」を適用
レベルの構築

データアセットに追加されたテクスチャーを元に「BP_Image」をスポーンしてレベルに配置します。今回はレベルブループリントを使用していますが、ブループリントクラスでも問題ありません。

  1. 新規レベルの作成
  2. レベルブループリントを開く
レベルプループリントの構築
  1. 変数を追加。変数名は「Data」とします。
  2. 変数の型を「BP_Class」を設定しコンパイル。
  3. 「Data」のデフォルト値として「DataAsset」を選びます。
  4. DataAsset内のTexDic配列に含まれているすべてのデータを取得
  5. 配列データの総数分繰り返し処理をする
  6. スポーンする位置を計算
  7. 「BP_Image」クラスをスポーンする
  8. 「BP_Image」に配置されているPlaneに適用されているマテリアルをインスタンス化
  9. 配列からテクスチャーを取り出す
  10. Planeマテリアルのテクスチャーを、データアセットから取得したものに変更する
完成

データアセットを使用すると、ブループリント内でのアセットの指定が簡単となり、今回の作例のようにテクスチャーを切り替えたりすることが手軽に行えるようになります。大量のテクスチャーを空間に配置したりする際に活用できるのではないでしょうか。

メニュー