0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

ADX+UEで、動的マテリアルからアプローチするサウンド

Last updated at Posted at 2022-12-18

はじめに

アンリアルエンジンとサウンドミドルウェア「ADX for UE」を連携させてサウンドを再生する際、UEの機能である「マテリアル」からサウンドに影響を与えてみようという試みです。

マテリアルインスタンスのパラメータドリブンでAisacコントロールを行ったり、またその結果によってマテリアルインスタンスのパラメータに変化を及ぼしたりといったリアルタイム処理が可能です。
物理挙動をベースにした衝突音を加味したり、マテリアルをデザインするアーティストによるサウンド設計など面白い挙動が再現できるかもしれません。

この記事では基本的なマスターマテリアルやマテリアルインスタンスの作成と、パラメータの数値を取り出しAtomサウンドに変化を与えるところまでを扱います。

前提

当記事ではUE5.0を使用しています。基本的にブループリントのみでの実装を想定します。
ADXはインディー向けの「LE版」であれば、無料で使用できます。
https://game.criware.jp/products/adx-le/

なお、ADX2は「ADX」へ名称が変更になりましたが、ツール構成は変更ありません(2がないから古いほう、というわけではありません)。

記事執筆時点のADX for UEのSDKバージョンはADX LE UE SDK(1.31.00.01)です。

ADX for UEの導入や基本的な使い方は以下の記事にあります。必要に応じて参照してください。
ADX for UEの導入で、一歩上のサウンド表現を(導入編)

ADX for UEの導入で、一歩上のサウンド表現を(実践編)

実装

マスターマテリアルを作成する

最終的にマテリアルから派生する「マテリアルインスタンス」からパラメータを取得することになりますが、その大元となるマテリアル、「マスターマテリアル」を作ってみることにしましょう。
「マスターマテリアル」は親、「マテリアルインスタンス」は子という認識をするとわかりやすそうです。

コンテンツブラウザで右クリックし、「Material」を作成します。
A01.png
わかりやすい名前をつけます。
A02.png
ダブルクリックするとマテリアルエディタが開きます。
A03.png
「T」キーを押しながら空いている場所をクリックするとTextureSampleノードが作られます。これは指定したテクスチャを取得・表示できるものです。「RGB」から「BaseColor」につなぎます。
A04.png
左下のDetailsパネルでテクスチャを指定すると、マテリアルの表面に貼り付けられます。
A05.png
「1」キー(テンキーではない方)を押しながらクリックすると、float型として扱える変数が出現します(一応Constantという名前がついています)。
A06.png
同じようにTextureSampleと変数を追加しつなげていきます。
次の画像のように構成すれば、ひとまず最低限の機能をもつマスターマテリアルができそうです。
下のTextureSampleでは「Normal」につなげていますので、ノーマルマップを指定します。
A07.png
ノードを右クリックして「Convert to Parameter」を選択すると……
A08.png
ノードは「パラメータ」化され、マテリアルの子であるマテリアルインスタンスで画像や数値をカスタマイズできるようになります。さらに、ゲーム内で動的にパラメータを変化させることも可能になります。
A09.png
4つのノードすべてをパラメータにコンバートします。
A10.png
Constantノードについては、Detailsパネルでデフォルト値、スライダーの最小値最大値を設定できます。
A11.png
これでとりあえずの完成です。「Apply」を押して保存します。
A12.png

マテリアルインスタンスを作成する

マスターマテリアルからマテリアルインスタンスを作成します。
B01.png
マスターマテリアルの性質を受け継いだ子、マテリアルインスタンスが作られます。
マテリアルに「M_(マテリアル名)」と名前をつけたのに対し、こちらは「MI_(マテリアルインスタンス名)」と名前をつけます。
B02.png
ダブルクリックして開きます。
マスター側でパラメータ化した数値が表示されていますので、チェックをつけてスライダーを操作するとマテリアルインスタンスの質感が変わっていきます。
B03.png
パラメータ化したテクスチャについても同様に、チェックを入れることで別の画像を指定して差し替えることができます。
B04.png

マテリアルインスタンスのパラメータを取得し、衝突音を変化させる

オブジェクト用アクターを作成する

アクターを新規に作成します。
コンテンツブラウザの適当な場所で右クリックし、「Blueprint Class」です。
C01.png
親クラスは「Actor」を選択します。
C02.png
ダブルクリックして開き、「StaticMesh」コンポーネントを追加します。
C03.png
StaticMeshコンポーネントをこのアクターのベースとしたいので、ドラッグして一番上に持っていきます。
「DefaultSceneRoot」コンポーネントに被せるイメージです。
C04.png
適当にメッシュを指定します。
C05.png
「Simulate physics」にチェックをつけます。これで物理挙動がシミュレートされるようになります。
C06.png

衝突時にサウンドを再生する

イベントグラフに移動します。
物理挙動シミュレーションで衝突した時にイベントを発火するには、Set Notify Rigid Body Collisionノードで有効にしてあげる必要があります。
C07.png
「StaticMesh」コンポーネントを右クリックし、「Add OnComponentHit」を選択。
C08.png
衝突時のイベントノードが現れます。
C09.png
今回は「衝突の強さが一定以上か判別し、衝突音を再生する」という方法をとることにしましょう。
「Normal Impulse」のベクター情報をVector Lengthノードに通すことによって大体の衝撃の強さが取得できます。
C10.png
「Hit」アウトプットピンから線を伸ばし、Break Hit Resultノードで衝突結果から情報を取り出します。
C11.png
サウンドの再生にはPlay Sound at Locationノードを使用します。同名のノードがありますが、必ず「Atom」カテゴリにあるものを使用してください。
Play Sound at Locationノードで再生するAtomキューを指定します。
C12.png
次のようにノードをつなげば音が鳴るようになります。
C13.png
レベルに配置してみましょう。落下時などの強い衝撃でサウンドが再生されるはずです。
C14.png

パラメータを取得する

マテリアルインスタンスのパラメータを取得・操作するためには「ダイナミックマテリアルインスタンス」を作成・適用する必要があります。これはマテリアルインスタンスのさらにインスタンス(子)になるイメージです。
Event BeginPlayの処理のあとに、Create Dynamic Material Instanceでダイナミックマテリアルインスタンスを作成します。
D01.png
次の画像のようにつなげば、現在のStaticMeshが持つマテリアル(もしくはマテリアルインスタンス)を元にダイナミックマテリアルインスタンスを作成できます。
D02.png
青いアウトプットピン「Return Value」を右クリックし「Promote to Variable」で変数化します。
D03.png
適当に名前をつけます。
D04.png
最後に、Set MaterialでStaticMeshのマテリアルをダイナミックマテリアルインスタンスで上書きすればOKです。
D05.png

衝突時に、ダイナミックマテリアルインスタンスのパラメータを見てサウンドに変化を与えます。
AtomキューをAISACコントロールで操作したいので、Play Sound at LocationからSpawn Atom Sound at Locationにノードを差し替えます。
E01.png
再生が終わったら音源をレベルに残さないよう「Auto Destroy」にチェックがついていることを確認しておきましょう。
E06.png

ダイナミックマテリアルインスタンスから値を取得するには、Get (型の名前) Parameter Valueノード各種を使用します。パラメータ化したあらゆる値を取得できます。「Parameter Value」にはマテリアルインスタンスが持つパラメータ名を指定します。一致していないと正常に処理が行われませんので、よく確認しておきましょう。
また、このノードは通常のGetノードと異なり白い線をつなぐ必要があります。取得タイミング(ノードが実行されたタイミング)での数値が返される点も留意しておく必要がありそうです。
E02.png
衝突時にこのオブジェクトが持つマテリアルの「Metalic」を取得します。Get Scalar Parameter ValueConstantノードが持つFloat型変数を取得できます。
E03.png
Set Aisac by NameでAISACコントロールに値を渡し変化を与えます。Metalicですので、数値が高いほど重い音(金属音)が響くようにAtomCraftで調整すると良さそうです。
E04.png
また、「Roughness」の値を取得してさらに変化を与えることもできます。この場合は数値が高いほど乾いた音にするといいかもしれません。
E05.png

補足

PhysicsMaterialから再生するキューを選択する

マテリアルインスタンスごとにPhysicsMaterialを指定できます。
F01.png
PhysicsMaterialごと対応したサウンドを再生する方法は以下の記事にまとめてありますので、興味があれば参照してみてください。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?