箱に攻撃を当てるとHPは減る。でも、箱の見た目は変わらず、当たったことが伝わりにくい。そこで、攻撃された箱を一瞬赤くしてみます。数値を見なくても「今の攻撃が効いた」と分かる、被弾フラッシュです。
同じ青い箱を2個並べても、変えたいのは攻撃された1個だけ。そのために使うのが Dynamic Material Instance です。箱ごとに色を調整できるようにし、赤みを0.2秒で元へ戻すところまで作ります。
この記事でわかること
- 同じマテリアルの箱でも、1個だけ色を変えられる仕組み
- 赤みの強さを調整するパラメータの作り方
- MIDを一度作って変数に持ち、繰り返し使う方法
- Timelineを既存のダメージ処理につなぐ手順
実践は、体力とダメージの記事で作った BP_Damageable が出発点です。E キーでCubeのHPが減り、無敵時間とHPが0になったときの消滅まで動く、シングルプレイの状態で進めます。マテリアルの画面が初めてなら、マテリアル入門も先に確認してください。
当たった箱だけ変えるには
Material は、「色をどう混ぜるか」「表面をどれくらいざらつかせるか」をノードで組んだ、見た目の元になるアセットです。そのMaterialを親として、色や数値の設定を変えたものが Material Instance です。
コンテンツブラウザで作る通常のMaterial Instanceは、正式には Material Instance Constant(MIC)。赤い箱用、青い箱用と、編集画面で設定した色違いを保存するのに向いています。
今回使う Material Instance Dynamic(MID) は、Blueprintで作り、ゲーム中にもパラメータを書き換えられるものです。「Dynamic Material Instance」は同じものを指します。Materialから直接作っても、設定済みのMICから作っても構いません。

MIDは親のノードを丸ごと別のグラフにするものではありません。色を混ぜる仕組みは親と共通にし、混ぜる割合をそれぞれに持たせると考えると、今回の使い方がつかめます。
たとえば、箱Aと箱Bに別々のMIDを割り当てます。Aの「赤み」を1へ変えても、Bの値は0のままです。逆に、同じMIDを2個の箱に割り当てれば、そのMIDの値を変えたときに両方の色が変わります。

必要なのは、「箱ごとのMIDを用意すること」と「当たった箱のMIDへ値を渡すこと」。まずは、その値を受け取れる親マテリアルを作りましょう。
赤みを調整できるマテリアルを作る
パラメータは、外から調整できるように名前を付けた値です。今回は FlashAmount という数値を用意し、0なら元の青、1なら赤、その間なら2色を混ぜた色になるようにします。

コンテンツブラウザでMaterialを作り、M_Flashable と名付けて開きます。「Material Domain」は Surface、「Blend Mode」は Opaque、「Shading Model」は Default Lit のままで進めます。作るノードは次のとおりです。
| 作るもの | 名前・値 | 役割 |
|---|---|---|
| Vector Parameter | OriginalColor:R=0.1、G=0.4、B=1、A=1 | 通常時の青 |
| Constant3Vector | R=1、G=0、B=0 | 被弾時の赤 |
| Scalar Parameter | FlashAmount:Default Value=0 | 赤を混ぜる割合 |
| LinearInterpolate(Lerp) | 下図のようにつなぐ | 2色を割合に応じて混ぜる |
Scalar は数値1つ、Vector は複数の数値をまとめたものです。ここではVector ParameterをR・G・B・Aの色として使います。ノード名で検索して追加できますし、既存のConstantやConstant3Vectorを右クリックして「Convert to Parameter」で変換する方法でも作れます。

OriginalColor のRGBをLerpの A、赤を B、FlashAmount を Alpha へつなぎ、Lerpの出力をMaterialの Base Color へ渡します。 Alphaは「Bをどれだけ混ぜるか」 です。ここでは透明度を変えて いるわけではありません。
Materialの Metallic は0、Roughness は0.7にしておきます。FlashAmountのDefault Valueを一度1に変え、プレビューが赤くなるか確かめてください。確認したら 0へ戻して「Apply」と保存をします。この時点で、色を変える仕組みは完成です。
今回は表面の色が赤くなる表現です。暗闇でも自ら光る表現には Emissive Color が必要ですが、まずは明るい場所で色の変化を確かめます。
箱ごとのMIDを作り、変数に持つ
BP_Damageable を開き、「Components」で DamageMesh を選びます。「Details → Materials → Element 0」に M_Flashable を割り当ててください。
このElement 0は、マテリアルスロットの番号です。スロットは「この部品にどのマテリアルを使うか」の割り当て先で、番号は0から始まります。今回の標準Cubeは0を使います。別のメッシュでは体と装備などに分かれることもあるため、見た目を変えたい部分の番号を確認します。

イベントグラフでは、既存の Event BeginPlay → Set CurrentHealth の後ろに処理を追加します。HPを最大値へ戻す初期化は、そのまま残してください。
- Componentsの
DamageMeshをグラフへドラッグします。このノードは、色を変えるメッシュを指定するための参照です。 - 青い出力から線を伸ばして
Create Dynamic Material Instanceを検索します。Target is Primitive Componentと表示されるものを使います。 Element Indexを0、Source MaterialをM_Flashableにします。Optional NameはNoneのままで構いません。Return Valueを右クリックして「Promote to Variable」を選び、変数名をDynMatにします。型は Material Instance DynamicのObject Reference になります。- 白い実行線を
Set CurrentHealth → Create Dynamic Material Instance → Set DynMatの順につなぎます。

このCreateノードは、MIDを作るだけでなく、DamageMeshのスロット0へ割り当てるところまで行います。続けてSet Materialを置く必要はありません。検索結果に Parent を指定する別のCreateノードが出た場合は、上の手順どおりDamageMeshから線を伸ばして選び直します。
Return Value は、今作ったMIDです。DynMat に保存する参照は、「後からどのMIDを操作するか」を指定するためのもの。変数へ入れるたびに新しいMIDが増えるわけではありません。
箱を2個配置すると、それぞれのBeginPlayでMIDが作られ、それぞれのDynMatに保存されます。以後はこの変数を使って値を変えます。
作る処理と、色を変える処理を分ける
今回、Createを呼ぶのはBeginPlayで1回です。被弾のたびに必要なのは、用意したMIDの値を書き換えることだけ。フラッシュ中に作り直す処理は入れません。

数値を変えるのは Set Scalar Parameter Value、色を変えるのは Set Vector Parameter Value です。今回は前者で、DynMatの FlashAmount を動かします。
Timelineで赤みを0へ戻す
FlashAmountを1にすれば赤くなりますが、値を戻さないと赤いままです。そこで Timeline を使います。Timelineは「何秒後に、どんな値にするか」を決め、その間の値も出してくれるノードです。
今回は、0秒で1、0.2秒で0にします。赤みが少しずつ薄まり、最後に元の青へ戻ります。

BP_Damageableのイベントグラフを右クリックし、「Add Timeline」でFlashTimelineを作ります。- ダブルクリックして開き、Floatトラックを追加して
Flashと名付けます。 - グラフ上で右クリックしてキーを2個追加します。各キーを選び、TimeとValueを下表に合わせます。
- 2個のキーを選択して右クリックし、補間を「Linear」にします。直線に沿って一定の割合で減る設定です。
- 「Length」を
0.2にし、「Loop」と「AutoPlay」はオフにします。コンパイルしてイベントグラフへ戻ります。
| キー | Time(秒) | Value |
|---|---|---|
| 開始 | 0 | 1 |
| 終了 | 0.2 | 0 |
トラック名の Flash はTimelineが出す数値の名前、FlashAmount はマテリアルが受け取るパラメータ名です。同じ名前である必要はありません。次の接続で、前者の値を後者へ渡します。
Timelineの編集操作を詳しく知りたい場合は、Timelineで値を変化させる記事も参照してください。
ダメージ処理につなぐ
ここからは、作成済みのFlashTimelineを使います。まず、赤みを毎回書き込む接続を作り、その後に被弾時の入口をつなぎましょう。
Timelineの値をMIDへ渡す
DynMat をグラフへGetで置き、青い出力から Set Scalar Parameter Value を追加します。Target is Material Instance Dynamic と表示されるノードです。Collection を指定する同名ノードは使いません。

| 接続・設定 | 内容 |
|---|---|
FlashTimelineの Update | Set Scalar Parameter Valueの白い実行入力へ |
| Get DynMatの青い出力 | Target へ |
Parameter Name | FlashAmount と入力 |
FlashTimelineの緑の Flash 出力 | Value へ |
白いUpdateの線は「今、この処理を動かす」、緑のFlashの線は「今の赤みの値」を渡します。両方が必要です。再生中にこの処理が繰り返され、最後に0が書き込まれると青へ戻ります。
ダメージが通り、生き残ったときに再生する
前提記事では、Event AnyDamage の後で無敵かを調べ、ダメージを受けられるときだけHPを減らしています。その後、HPが0以下なら消滅、生きていれば無敵時間を解除するタイマーを設定する流れです。
生存側にある Set Timer by Event の白い出力を、FlashTimelineの Play from Start へつなぎます。図はこのつなぎ目だけを示しています。タイマーのEvent・Timeの接続や、HPを減らす処理は、前提記事のまま使います。

Set Timer by Eventは「後で無敵を解除する予約」を置くノードです。白い出力は、無敵時間が終わるまで待ちません。 そのため、フラッシュは被弾直後に始まります。
Play from Start は、Timelineを先頭から再生する入力です。普通の Play は現在位置から続けるので、フラッシュの途中で次の被弾が起きても先頭に戻りません。毎回赤みを付け直したい今回は、Play from Startを使います。
無敵中はこの経路まで来ないため、追加のダメージもフラッシュも発生しません。HPが0になったときは別の経路で箱が消えるので、フラッシュせず消滅します。消えた位置に撃破エフェクトも出したい場合は、Niagaraの記事へ進めます。
2個並べて動きを確かめる
コンパイル・保存してPlayします。箱の正面で E を押し、HP表示と色の変化を見てください。
