【Unreal Engine】UE5で被弾フラッシュ:Dynamic Material Instanceで当たった箱だけ赤くする

作成: 2026-07-20最終更新: 2026-09-06

攻撃された箱だけ赤くなり、0.2秒で元の色へ戻る被弾フラッシュを作ります。Dynamic Material Instanceの役割、色を混ぜるパラメータ、Timelineと既存のダメージ処理への接続を図解します。

箱に攻撃を当てるとHPは減る。でも、箱の見た目は変わらず、当たったことが伝わりにくい。そこで、攻撃された箱を一瞬赤くしてみます。数値を見なくても「今の攻撃が効いた」と分かる、被弾フラッシュです。

同じ青い箱を2個並べても、変えたいのは攻撃された1個だけ。そのために使うのが Dynamic Material Instance です。箱ごとに色を調整できるようにし、赤みを0.2秒で元へ戻すところまで作ります。

青い箱が被弾時に赤くなり、0.2秒後に青へ戻る3コマ

この記事でわかること

  • 同じマテリアルの箱でも、1個だけ色を変えられる仕組み
  • 赤みの強さを調整するパラメータの作り方
  • MIDを一度作って変数に持ち、繰り返し使う方法
  • Timelineを既存のダメージ処理につなぐ手順

実践は、体力とダメージの記事で作った BP_Damageable が出発点です。E キーでCubeのHPが減り、無敵時間とHPが0になったときの消滅まで動く、シングルプレイの状態で進めます。マテリアルの画面が初めてなら、マテリアル入門も先に確認してください。

Sponsored

当たった箱だけ変えるには

Material は、「色をどう混ぜるか」「表面をどれくらいざらつかせるか」をノードで組んだ、見た目の元になるアセットです。そのMaterialを親として、色や数値の設定を変えたものが Material Instance です。

コンテンツブラウザで作る通常のMaterial Instanceは、正式には Material Instance Constant(MIC)。赤い箱用、青い箱用と、編集画面で設定した色違いを保存するのに向いています。

今回使う Material Instance Dynamic(MID) は、Blueprintで作り、ゲーム中にもパラメータを書き換えられるものです。「Dynamic Material Instance」は同じものを指します。Materialから直接作っても、設定済みのMICから作っても構いません。

MaterialからMICとMIDを作れ、MICを親にしてMIDを作ることもできる関係

MIDは親のノードを丸ごと別のグラフにするものではありません。色を混ぜる仕組みは親と共通にし、混ぜる割合をそれぞれに持たせると考えると、今回の使い方がつかめます。

たとえば、箱Aと箱Bに別々のMIDを割り当てます。Aの「赤み」を1へ変えても、Bの値は0のままです。逆に、同じMIDを2個の箱に割り当てれば、そのMIDの値を変えたときに両方の色が変わります。

同じMIDの共有では箱AとBが赤くなり、別々のMIDではAだけが赤くなる比較

必要なのは、「箱ごとのMIDを用意すること」と「当たった箱のMIDへ値を渡すこと」。まずは、その値を受け取れる親マテリアルを作りましょう。

赤みを調整できるマテリアルを作る

パラメータは、外から調整できるように名前を付けた値です。今回は FlashAmount という数値を用意し、0なら元の青、1なら赤、その間なら2色を混ぜた色になるようにします。

FlashAmountが0なら青、0.5なら青と赤の中間、1なら赤になる比較

コンテンツブラウザでMaterialを作り、M_Flashable と名付けて開きます。「Material Domain」は Surface、「Blend Mode」は Opaque、「Shading Model」は Default Lit のままで進めます。作るノードは次のとおりです。

作るもの名前・値役割
Vector ParameterOriginalColor:R=0.1、G=0.4、B=1、A=1通常時の青
Constant3VectorR=1、G=0、B=0被弾時の赤
Scalar ParameterFlashAmount:Default Value=0赤を混ぜる割合
LinearInterpolate(Lerp)下図のようにつなぐ2色を割合に応じて混ぜる

Scalar は数値1つ、Vector は複数の数値をまとめたものです。ここではVector ParameterをR・G・B・Aの色として使います。ノード名で検索して追加できますし、既存のConstantやConstant3Vectorを右クリックして「Convert to Parameter」で変換する方法でも作れます。

OriginalColorをLerpのA、赤をB、FlashAmountをAlphaにつなぎ、出力をBase Colorへ渡す接続

OriginalColor のRGBをLerpの A、赤を BFlashAmountAlpha へつなぎ、Lerpの出力をMaterialの Base Color へ渡します。 Alphaは「Bをどれだけ混ぜるか」 です。ここでは透明度を変えているわけではありません。

Materialの Metallic は0、Roughness は0.7にしておきます。FlashAmountのDefault Valueを一度1に変え、プレビューが赤くなるか確かめてください。確認したら 0へ戻して「Apply」と保存をします。この時点で、色を変える仕組みは完成です。

今回は表面の色が赤くなる表現です。暗闇でも自ら光る表現には Emissive Color が必要ですが、まずは明るい場所で色の変化を確かめます。

Sponsored

箱ごとのMIDを作り、変数に持つ

BP_Damageable を開き、「Components」で DamageMesh を選びます。「Details → Materials → Element 0」に M_Flashable を割り当ててください。

このElement 0は、マテリアルスロットの番号です。スロットは「この部品にどのマテリアルを使うか」の割り当て先で、番号は0から始まります。今回の標準Cubeは0を使います。別のメッシュでは体と装備などに分かれることもあるため、見た目を変えたい部分の番号を確認します。

今回のCubeではElement 0を使い、複数スロットのメッシュでは部位ごとの番号を確認する例

イベントグラフでは、既存の Event BeginPlay → Set CurrentHealth後ろに処理を追加します。HPを最大値へ戻す初期化は、そのまま残してください。

  1. Componentsの DamageMesh をグラフへドラッグします。このノードは、色を変えるメッシュを指定するための参照です。
  2. 青い出力から線を伸ばして Create Dynamic Material Instance を検索します。Target is Primitive Component と表示されるものを使います。
  3. Element Index0Source MaterialM_Flashable にします。Optional Name はNoneのままで構いません。
  4. Return Value を右クリックして「Promote to Variable」を選び、変数名を DynMat にします。型は Material Instance DynamicのObject Reference になります。
  5. 白い実行線を Set CurrentHealth → Create Dynamic Material Instance → Set DynMat の順につなぎます。
DamageMeshをCreateのTargetへ、Return Valueを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の値を書き換えることだけ。フラッシュ中に作り直す処理は入れません。

BeginPlayでMIDを作って保存し、被弾時は用意したMIDの値を繰り返し変更する分担

数値を変えるのは Set Scalar Parameter Value、色を変えるのは Set Vector Parameter Value です。今回は前者で、DynMatの FlashAmount を動かします。

Timelineで赤みを0へ戻す

FlashAmountを1にすれば赤くなりますが、値を戻さないと赤いままです。そこで Timeline を使います。Timelineは「何秒後に、どんな値にするか」を決め、その間の値も出してくれるノードです。

今回は、0秒で1、0.2秒で0にします。赤みが少しずつ薄まり、最後に元の青へ戻ります。

FloatトラックFlashを0秒で1、0.2秒で0にする直線と赤から青へ戻る対応
  1. BP_Damageable のイベントグラフを右クリックし、「Add Timeline」で FlashTimeline を作ります。
  2. ダブルクリックして開き、Floatトラックを追加して Flash と名付けます。
  3. グラフ上で右クリックしてキーを2個追加します。各キーを選び、TimeとValueを下表に合わせます。
  4. 2個のキーを選択して右クリックし、補間を「Linear」にします。直線に沿って一定の割合で減る設定です。
  5. 「Length」を 0.2 にし、「Loop」と「AutoPlay」はオフにします。コンパイルしてイベントグラフへ戻ります。
キーTime(秒)Value
開始01
終了0.20

トラック名の FlashTimelineが出す数値の名前FlashAmountマテリアルが受け取るパラメータ名です。同じ名前である必要はありません。次の接続で、前者の値を後者へ渡します。

Timelineの編集操作を詳しく知りたい場合は、Timelineで値を変化させる記事も参照してください。

ダメージ処理につなぐ

ここからは、作成済みのFlashTimelineを使います。まず、赤みを毎回書き込む接続を作り、その後に被弾時の入口をつなぎましょう。

Timelineの値をMIDへ渡す

DynMat をグラフへGetで置き、青い出力から Set Scalar Parameter Value を追加します。Target is Material Instance Dynamic と表示されるノードです。Collection を指定する同名ノードは使いません。

TimelineのUpdateをSetの実行入力へ、FlashをValueへ、DynMatをTargetへ渡す3本の接続
接続・設定内容
FlashTimelineの UpdateSet Scalar Parameter Valueの白い実行入力へ
Get DynMatの青い出力Target
Parameter NameFlashAmount と入力
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の白い出力からFlashTimelineのPlay from Startへつなぐ箇所

Set Timer by Eventは「後で無敵を解除する予約」を置くノードです。白い出力は、無敵時間が終わるまで待ちません。 そのため、フラッシュは被弾直後に始まります。

Play from Start は、Timelineを先頭から再生する入力です。普通の Play は現在位置から続けるので、フラッシュの途中で次の被弾が起きても先頭に戻りません。毎回赤みを付け直したい今回は、Play from Startを使います。

無敵中はこの経路まで来ないため、追加のダメージもフラッシュも発生しません。HPが0になったときは別の経路で箱が消えるので、フラッシュせず消滅します。消えた位置に撃破エフェクトも出したい場合は、Niagaraの記事へ進めます。

Sponsored

2個並べて動きを確かめる

コンパイル・保存してPlayします。箱の正面で E を押し、HP表示と色の変化を見てください。

青い人物が箱Aに攻撃��を当て、Aだけ赤くなり箱Bは青のままになる完成イメージ
試すこと期待する結果
1回攻撃するHPが100→80になり、箱が赤くなって約0.2秒で青へ戻る
無敵時間の1秒以内にもう一度押すHPは減らず、フラッシュも追加されない
1秒以上空けて攻撃する次のダメージが入り、再び赤くなる
2個並べ、片方だけに攻撃を当てる当たった箱だけ色が変わる
有効な攻撃を5回当てるHPが0になり、箱が消える

2個とも青で始まり、攻撃された1個だけが赤くなれば成功です。色を混ぜる仕組みは同じでも、それぞれのMIDが別のFlashAmountを持っていると分かります。

変化が速くて追いにくければ、Timelineの終了キーのTimeとLengthを、両方 0.8 にして試します。赤から青へ戻る様子が見やすくなります。確認後は両方0.2へ戻してください。

うまく動かない場合は、症状に合わせて見直します。

症状確認するところ
最初から赤い親のFlashAmountのDefault Valueを0へ戻して保存したか
HPは減るが色が変わらない生存側のTimer出力がPlay from Startへつながっているか。SetのTargetがDynMatで、Parameter NameがFlashAmountか
DynMatがNoneというエラーが出るBeginPlayでCreateとSet DynMatを実行したか。TargetがDamageMeshで、存在するスロット番号を指定したか
赤いまま戻らない終了キーのValueが0か。UpdateとFlashを両方つないだか。Loopはオフか
2個とも色が変わる別々のMIDを各箱に割り当てたか。攻撃処理が実際に両方へダメージを与えていないか

おまけ:先に知っておくと良いこと

  • 色違いを保存するならMIC、ゲーム中に個別調整するならMID:今回のように赤みを変える用途にはMIDが合います。ただし、MaterialやMICでもTimeなどを使ったアニメーションは作れます。「MID以外は見た目が動かない」という意味ではありません。
  • パラメータなら何でも動かせるわけではない:色・数値・テクスチャなどはMIDで変更できますが、Static Switchは実行中に切り替えるためのパラメータではありません。今回のFlashAmountはScalarなので、連続的に変えられます。
  • 体と装備が別スロットなら、それぞれに用意する:Skeletal Meshでも同じ考え方です。全身を変える場合は、必要なスロットごとにMIDを作って保持し、それぞれへ値を渡します。
  • 世界全体の変化には別の選択肢もある:雨に合わせて多くのマテリアルの濡れ具合を変えるなら、共通の値を渡すMaterial Parameter Collectionも使えます。どちらの場合も、その値をどう見た目へ反映するかは親マテリアルに用意します。
  • マルチプレイの同期は別に考える:Event AnyDamageはサーバー側で動き、MIDの値は自動で各プレイヤーへ同期されません。ここで作った例を広げる際は、各クライアントでも演出を再生する処理が必要です。

まとめ

被弾フラッシュは、親マテリアルに「赤を混ぜる割合」を用意し、箱ごとのMIDへその値を渡して作れます。BeginPlayでMIDを作ってDynMatに持ち、ダメージが通ったらTimelineで1から0へ戻す。この分担にしておけば、色を調整するために毎回作り直す必要はありません。

まずは2個の箱で、片方だけ色が変わるところを確かめてください。同じ仕組みで、選択中の建物だけ色を変えたり、残りHPに応じて敵の赤みを増やしたりする表現にも広げられます。

参考:Material Instancesの仕組みPrimitive ComponentのMID作成APIMIDのパラメータ変更APITimelineの再生操作

Unreal Engine このセクションのノート98