【Unreal Engine】UE5で被弾フラッシュ:Dynamic Material Instanceで実行中に色を変える

作成: 2026-07-20

実行中にマテリアルの値を変えるにはDynamic Material Instanceが要る。通常のMaterial Instanceとの違い、Create Dynamic Material Instanceの使い方、親側のConvert to Parameter、そして毎フレーム作り直さないための保持まで図解。被弾で赤く光る実践つき。

敵に攻撃を当てても、HPが減るだけで手応えがありません。市販のゲームだと、殴った相手が一瞬白く光ったり赤く点滅したりして、当たったことがはっきり伝わります。同じことをやろうとMaterial Instanceの値をBlueprintから変えようとしたら、そもそもパラメータを変えるノードが見当たりません。

実行中にマテリアルの見た目を変えるには、専用の派生が要ります。 Dynamic Material Instance です。通常のMaterial Instanceは編集時に値を決める固定のもので、実行中には動きません。この記事では、3種類のマテリアルの違いから、Create Dynamic Material Instance の使い方、毎フレーム作り直さないための保持、そしてTimelineと組み合わせて滑らかに戻すところまでを解説します。

殴られた瞬間に赤く光り、0.2秒で元の色へ戻るクレイ人形の3コマのイメージ

この記事でわかること

  • 実行中に値を変えるのは Dynamic Material Instance だけ
  • Material / Material Instance / Dynamic Material Instance の 3層 の違い
  • Create Dynamic Material Instance の引数(対象コンポーネントと Element Index)
  • 光らせるには 親マテリアルをパラメータ化 しておく必要がある
  • 毎フレーム作り直さない (BeginPlayで1回作って保持する)
  • 実践: 被弾した瞬間に赤く光り、0.2秒で元に戻る

Sponsored

実行中に変えられるのは1つだけ

マテリアルには、名前の似た3つの層があります。ここを混同していると、「値を変えても反映されない」「1体を光らせたら全員光った」という事故に必ずぶつかります。

Material・Material Instance Constant・Material Instance Dynamicを、設計図・保存された色違い・実行中に動かせる複製の3段で示した図
正式名いつ値が決まるか実行中に変えられるか
MaterialMaterial作るときいいえ
Material InstanceMaterial Instance Constant編集時(コンテンツブラウザで)いいえ
Dynamic Material InstanceMaterial Instance Dynamic実行中はい

Material は設計図です。ノードを繋いで質感を組み立てるおおもとで、これ自体を実行中に書き換えることはしません(→ 基礎は マテリアル入門の記事)。

Material Instance は、その設計図から作った色違いです。コンテンツブラウザで Create Material Instance すると作られる、正式には Material Instance Constant です。名前のとおり Constant(定数) で、値は編集のときに決めます。ゲーム実行中には変わりません。

そして Dynamic Material Instance だけが、実行中に値を差し替えられます。正式名は Material Instance Dynamic 、略して MID とも呼ばれます。これはコンテンツブラウザには置きません。 実行中にBlueprintで作る ものです。

ここに、もう1つ大事な性質があります。 Create Dynamic Material Instance は、呼んだコンポーネントに新しいMaterial Instance Dynamic(MID)を作って貼り付けます。 個体ごとに呼べば、それぞれが別々のMIDを持ちます。

元のマテリアルを直接触ると全員が変わる図と、個体ごとにDynamic Material Instanceを作れば1体だけ変わる図の対比

同じ敵を10体並べたとき、全員は最初、同じ1つのマテリアルを 共有 しています。だから元のマテリアルを直接触ると、10体すべてが同時に光ります。個体ごとに Create Dynamic Material Instance を1回呼んでおけば、それぞれが別々のMIDを持つので、殴られた1体だけを光らせられます。

逆に、 同じMIDを複数の個体に設定すると、全員が一緒に変化します 。1体だけ光らせたいのに全員光るときは、MIDを共有していないかを疑ってください。

Sponsored

光らせる下ごしらえ:親マテリアルをパラメータ化する

Dynamic Material Instanceで変えられるのは、 親マテリアルであらかじめパラメータにしておいた値だけ です。ここを飛ばすと、インスタンスを作っても変えるものがありません。

パラメータ化は、固定値のノードを右クリックして Convert to Parameter を選ぶだけです。基礎記事と同じ操作なので、詳しくは マテリアル入門の記事 を参照してください。

被弾フラッシュのために用意するのは、 「元の色」と「白」を混ぜる割合 の1つです。次のように組みます。

Base ColorへLerpをつなぎ、AにOriginalColor、Bに赤、AlphaにFlashAmountパラメータを挿したマテリアルグラフの図
ノード役割パラメータ化
Constant3VectorConvert to Parameter元の色OriginalColor(Vector Parameter)
Constant3Vector(赤 1,0,0)光るときの色しない(固定でよい)
ConstantConvert to Parameter混ぜる割合FlashAmount(Scalar Parameter、既定値 0.0
Lerp(Linear Interpolate)2色を混ぜる

LerpAOriginalColorB赤(R=1.0 / G=0.0 / B=0.0)AlphaFlashAmount を挿し、出力を Base Color へ繋ぎます。

  • FlashAmount = 0 → 元の色そのまま
  • FlashAmount = 1 → 真っ赤

この FlashAmount を実行中に0から1へ動かせば、それが「光る」です。 Convert to Parameter した名前は、あとでBlueprintから指定する名前と完全に一致している必要があります 。ここのタイプミスは、動かない原因の定番です。

補足: 暗い場所でも光って見せたいなら、Base Colorだけでは足りません(着色されるだけで、自己発光にはなりません)。その場合は FlashColor × FlashAmount × 発光強度Emissive Color に繋ぎます。FlashAmount が0のときに発光が0になるよう、必ず FlashAmount を掛けてから繋ぐのがポイントです。発光面が十分に大きく明るければ、UE5のLumen環境では周囲にも色がにじみます(→ ライティングの記事)。

Create Dynamic Material Instanceで複製を作る

下ごしらえができたら、実行中に専用の複製を作ります。使うのは Create Dynamic Material Instance です。これは プリミティブコンポーネント(Static MeshやSkeletal Meshなど)のノード で、対象のメッシュコンポーネントから伸ばします。

Static Mesh ComponentからCreate Dynamic Material Instanceを呼び、戻り値を変数に保存する流れの図。Element Indexが0であることを示す
ピン内容
TargetPrimitive Component対象のメッシュコンポーネント
Element Indexint何番目のマテリアルスロットか(既定 0
Source MaterialMaterial Interface元にするマテリアル(空なら今そのスロットに入っているもの)
Optional NameName付けたい名前(省略可)
戻り値Material Instance Dynamic作られた複製。 これを保持して使う

やっていることは3つで、これを1ノードでまとめてやってくれます。

  1. 今そのスロットに入っているマテリアルを元に、複製(Dynamic Material Instance)を作る
  2. その複製を、同じスロットに 貼り直す
  3. 作った複製を 戻り値として返す

つまり Create Dynamic Material Instance を呼んだ時点で、そのメッシュの見た目は複製に置き換わっています。あとは戻り値に対して値を書き込むだけで、そのメッシュだけが変わります。

Element Index は、複数のマテリアルスロットを持つメッシュで効いてきます。キャラクターが「体」と「装備」で2スロットに分かれているなら、体は 0 、装備は 1 です。光らせたいスロットの番号を指定してください。全部のスロットを光らせたいなら、スロットの数だけ Create Dynamic Material Instance を呼びます。

値を書き込むノードは2つです。

ノード変える対象Value の型
Set Scalar Parameter Value数値1つ(FlashAmount など)float
Set Vector Parameter Value色(OriginalColor など)Linear Color

どちらも TargetDynamic Material InstanceCreate の戻り値)を、Parameter Name にパラメータ化した名前を、Value に新しい値を渡します。

Sponsored

毎フレーム作り直さない

ここが、実際に書くときに最もやりがちな失敗です。 Create Dynamic Material InstanceEvent Tick や、ダメージを受けるたびに呼んではいけません。

Create は毎回 新しい複製を作る ノードです。フレームごとに呼べば、毎フレーム新品のマテリアルが生まれ、古いものが捨てられ続けます。見た目は動いても、内部では無駄な生成が積み上がっていきます。

上段は被弾のたびにCreateを呼んで複製が増えていく図、下段はBeginPlayで1回だけ作り、以後はSetだけを呼ぶ図の対比

正しい形はこうです。

タイミングやること
Event BeginPlayCreate Dynamic Material Instance1回だけ 呼び、戻り値を 変数に保存 する
以後(被弾など)保存した変数に対して Set Scalar Parameter Value を呼ぶだけ
Event BeginPlay
  → (Mesh)Create Dynamic Material Instance(Element Index: 0)
  → Set DynMat(戻り値を変数 DynMat に保存)

(被弾時)
  → Set Scalar Parameter Value(Target: DynMat, Parameter Name: FlashAmount, Value: 1.0)

作るのは1回、変えるのは何度でも。 この分担さえ守れば、あとは Set Scalar Parameter Value を好きなだけ呼べます。 ただし、作り直したあと古い DynMat 変数へSetしても見た目は変わりません 。そのMIDはもうメッシュに貼られていないためです。作るのは初期化時の1回だけにします。

Timelineで滑らかに戻す

FlashAmount1.0 にすれば白くなりますが、そのままでは白いまま固まります。 時間をかけて0へ戻す 必要があります。

Set Timer で少し待ってから 0.0 に戻すだけでも、「パッと光ってパッと消える」表現にはなります。ただ、これだと点滅が硬く見えます。 1.0から0.0へ滑らかに減らす と、じわっと戻る自然なフラッシュになります。この用途にちょうど合うのが Timeline です。

Timelineの曲線が1.0から0.0へ0.2秒で下がり、その値がUpdateから毎フレームSet Scalar Parameter Valueへ渡る図

Timelineは、時間に沿って動く値を作るノードです。中に Float トラックを1本用意し、 0秒で1.0、0.2秒で0.0 になる曲線を描きます。

Timelineのピン繋ぎ先
Play from Start被弾イベントから叩く(毎回先頭から再生)
Updateここから毎フレーム、Set Scalar Parameter Value を呼ぶ
(Floatトラックの出力)Set Scalar Parameter ValueValue

被弾のたびに Play from Start を叩けば、そのつど1.0から0.0へ0.2秒で戻ります。連続で殴られても、そのたびに先頭へ戻るので、常に「殴られた瞬間がいちばん白い」状態になります。

Timelineそのものの作り方や曲線の編集は Timelineノードの記事 にまとめてあります。

Sponsored

実践:被弾した瞬間に赤く光る

2Dアクションの被弾、ARPGの敵ヒット、シューティングの装甲判定。 「当たった」を色で見せる のは、ジャンルを問わず手触りを大きく左右します。ここでは ダメージの記事 で作った受け側に、被弾フラッシュを足します。

完成形

Cubeを殴るたびに、そのCubeが 一瞬赤くなって0.2秒で元の色へ戻ります 。2体並べても、殴った1体だけが光り、もう1体は変わりません。

Cubeを殴ると赤くフラッシュして戻る様子と、2体並べても殴った1体だけが光る様子を示した図

再現条件

Third Person テンプレート で、ダメージの記事BP_DamageableE キーで殴るとHPが減るCube)が動く状態から始めます。まだ無くても、被弾で反応するActorがあれば同じように組めます。

マテリアルの準備

種類名前内容
MaterialM_Flashable前半の「下ごしらえ」で作った、OriginalColor / FlashAmount を持つマテリアル

M_FlashableBP_DamageableStaticMeshMaterial Slot 0 に割り当て、マテリアル側は Apply して保存 しておきます。FlashAmount の既定値は 0.0 です。表示に使うスロットが複数ある場合は、スロットごとにMIDが要ります。

変数(BP_Damageable に追加する)

変数名初期値用途
DynMatMaterial Instance Dynamic の参照None作った専用複製を保持する

Timeline(BP_Damageable に追加する)

項目
Timeline名FlashTimeline
トラックFloat トラック1本(名前 Flash
キー時刻 0.0 で値 1.0 / 時刻 0.2 で値 0.0
Length0.2

ステップ1:BeginPlayで複製を1回だけ作る

BP_DamageableEvent BeginPlay に足します。 ここで作るのは1回だけ です。

BeginPlayからStatic MeshのCreate Dynamic Material Instanceを呼び、戻り値をDynMatに保存する短いノードグラフ図
Event BeginPlay
  → StaticMesh(コンポーネント参照)
  → Create Dynamic Material Instance
        Element Index : 0
        Source Material : (空でよい。今スロットにあるM_Flashableが使われる)
  → Set DynMat(戻り値を保存)

これで、このCube専用のMIDができ、メッシュに貼り付きました。以後は DynMat を通してだけ色をいじります。

ステップ2:被弾でTimelineを回す

ダメージの記事Event AnyDamage で、HPを減らした直後に FlashTimeline を叩きます。

Event AnyDamageのHP減算の後からFlashTimelineのPlay from Startを叩き、UpdateからSet Scalar Parameter Valueへ、TrackのFlash値がValueへ入るノードグラフ図
Event AnyDamage
  → (HPを減らす処理。ダメージの記事のとおり)
  → FlashTimeline ▷ Play from Start

FlashTimeline
  Update ─────────────────┐
  Flash(Floatトラック出力)─┤
                            ↓
  → Set Scalar Parameter Value
        Target         : DynMat
        Parameter Name : FlashAmount
        Value          : ← Flash(トラックの値)

Update から毎フレーム Set Scalar Parameter Value を呼び、Timelineの Flash の値をそのまま FlashAmount へ渡します。0.2秒かけて1.0から0.0へ下がるので、赤みがじわっと引いていきます。

Play from Start を選んでいるのが要点です。 単なる Play だと、途中まで再生したところで2発目を受けると続きから再生され、光り直しません。 Play from Start なら毎回先頭に戻るので、殴られるたびに必ず最も赤い状態から始まります。

注意: 下ごしらえで LerpB を赤にしてあれば、追加の設定は要りません。色を実行中に変えたい(炎は赤、氷は青、など)場合は、BFlashColor という Vector Parameter にして、被弾時に Set Vector Parameter Value で色を渡します。

確認する

Playして、Cubeの正面で E を押してください。

  • 1回押す → Cubeが赤くフラッシュし、 約0.2秒で元の色へ戻る
  • 素早く連打するダメージの記事 で無敵時間(InvincibleTime 1.0秒)を設定していれば、1秒に1回だけ光る(フラッシュは被弾が通ったときだけ出る)
  • Cubeを複製して2体並べ、片方だけ殴る殴った1体だけが光り、もう1体は変わらない

3つ目が、この記事のいちばん確かめてほしい点です。MIDを個体ごとに持っているからこそ、1体だけを光らせられます。

うまくいかないときの切り分けです。

  • 殴っても色が変わらないSet Scalar Parameter ValueTargetDynMat になっていない。または Parameter NameFlashAmount と一致していない。あるいは被弾ごとに Create Dynamic Material Instance を呼び直していて、古い DynMat へSetしている
  • 一瞬白く(または元色に)光るだけで赤くならないLerpB が白のまま。混ぜる色を赤にするか Set Vector Parameter Value で色を渡す
  • 光ったまま戻らない → Timelineの終点(0.2秒)で値が0.0になっていない。または Update ではなく Finished から Set を呼んでいる
  • 2体並べたのに両方光るCreate Dynamic Material Instance を呼ばず、元のマテリアルや Material Instance Constant を直接 Set している
  • カクつく/だんだん重くなるCreate Dynamic Material InstanceEvent Tick や被弾ごとに呼んでいる。 BeginPlay で1回だけにする

ポイントは2つです。

  • 作るのは1回、変えるのは何度でも: Create Dynamic Material InstanceBeginPlay で1回呼んで変数に保持します。フラッシュのたびに呼ぶのは、毎回新品のマテリアルを作って捨てているのと同じです
  • 個体差はDynamic Material Instanceで出す: 元のマテリアルは全員の共有物です。1体だけを光らせたい、体力に応じて色を変えたい、といった 個体ごとの見た目 は、必ずその個体専用の複製に対して行います

同じ仕組みは、点滅(拾えるアイテム)、選択中の建物を緑にする、体力が減ると赤くにじむ、といった演出にそのまま使えます。フラッシュ・ヒットストップ・カメラシェイクをまとめて「手応え」として設計するなら ヒットフィードバックで手応えを出す へ、エフェクトそのものを足すなら Niagaraの記事 へ進みます。

Sponsored

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

  • この実践はシングルプレイ前提: Event AnyDamage はサーバー側でのみ発火し、MIDの変更も自動では同期されません。マルチプレイに広げるときは、フラッシュを各クライアントで再生する仕組みが別途要ります

  • Skeletal Meshも同じノードで作れる: キャラクターのSkeletal Mesh Componentからも Create Dynamic Material Instance を呼べます。ただしマテリアルスロットが複数に分かれていることが多いので、Element Index を確認してください。全身を光らせるなら、スロットの数だけ作って配列で保持します

  • Set Vector Parameter Valueの色は Linear Color: Set Vector Parameter Value に渡す色は、ガンマではなくリニアの色空間です。UIで選んだ色をそのまま渡すと、思ったより明るく(または暗く)見えることがあります

  • 体力バーの色替えにも使える: FlashAmount のように「割合を1つ渡すと見た目が変わる」構造にしておくと、体力が減るほど赤くする、といった連続的な変化も同じ仕組みで作れます。たとえば Map Range Clamped(HP割合 0.3〜0.0 → 出力 0.0〜1.0)を挟めば、HPが30%を切ってから赤みが増していきます。HPの通知は Event Dispatcher から受けると、受け側を触らずに足せます

  • 全体を一括で変えるならMaterial Parameter Collection: 「昼夜で世界全体の色味を変える」のように、多数のマテリアルへ同時に効かせたいときは、個体ごとのDynamic Material Instanceでは数が多すぎます。その用途には Material Parameter Collection という別の仕組みがあります。個体差はDynamic、全体はCollection、と使い分けます

  • 溶ける・凍る・濡れるも同じ発想: マテリアル側にパラメータを足して、FlashAmount を動かしたのと同じ要領でそのパラメータを時間変化させれば、溶けるマスクや氷の厚み、濡れの強さといった表現になります。変えるものを増やすだけで、仕組みは同じです

  • 色が変わらないときは名前を疑う: Set Scalar / Vector Parameter Value は、指定した名前のパラメータが無くても エラーを出さずに黙って無視 します。「動かない」の多くは、親マテリアルでのパラメータ名と、Blueprintで打った名前のわずかな違いです

まとめ

  • 実行中にマテリアルの値を変えられるのは Dynamic Material Instance だけ 。通常のMaterial Instance(Constant)は編集時に値が固定される
  • Dynamic Material Instanceは そのコンポーネント専用の複製 。だから1体だけを光らせられる
  • 変えたい値は、親マテリアルで Convert to Parameter しておく。名前は完全一致で指定する
  • Create Dynamic Material InstanceBeginPlay で1回だけ 呼んで変数に保持。毎フレーム・被弾ごとに作らない
  • 滑らかに戻すのは TimelinePlay from Start で毎回先頭から再生する

いま作っているゲームで、プレイヤーに「今のは効いた」と最初に伝えたい瞬間はどこでしょうか。その一瞬に色を1つ足すだけで、手触りは大きく変わります。