敵に攻撃を当てても、HPが減るだけで手応えがありません。市販のゲームだと、殴った相手が一瞬白く光ったり赤く点滅したりして、当たったことがはっきり伝わります。同じことをやろうとMaterial Instanceの値をBlueprintから変えようとしたら、そもそもパラメータを変えるノードが見当たりません。
実行中にマテリアルの見た目を変えるには、専用の派生が要ります。 Dynamic Material Instance です。通常のMaterial Instanceは編集時に値を決める固定のもので、実行中には動きません。この記事では、3種類のマテリアルの違いから、Create Dynamic Material Instance の使い方、毎フレーム作り直さないための保持、そしてTimelineと組み合わせて滑らかに戻すところまでを解説します。
この記事でわかること
- 実行中に値を変えるのは Dynamic Material Instance だけ
- Material / Material Instance / Dynamic Material Instance の 3層 の違い
Create Dynamic Material Instanceの引数(対象コンポーネントと Element Index)- 光らせるには 親マテリアルをパラメータ化 しておく必要がある
- 毎フレーム作り直さない (BeginPlayで1回作って保持する)
- 実践: 被弾した瞬間に赤く光り、0.2秒で元に戻る
実行中に変えられるのは1つだけ
マテリアルには、名前の似た3つの層があります。ここを混同していると、「値を変えても反映されない」「1体を光らせたら全員光った」という事故に必ずぶつかります。

| 層 | 正式名 | いつ値が決まるか | 実行中に変えられるか |
|---|---|---|---|
| Material | Material | 作るとき | いいえ |
| Material Instance | Material Instance Constant | 編集時(コンテンツブラウザで) | いいえ |
| Dynamic Material Instance | Material 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を持ちます。

同じ敵を10体並べたとき、全員は最初、同じ1つのマテリアル を 共有 しています。だから元のマテリアルを直接触ると、10体すべてが同時に光ります。個体ごとに Create Dynamic Material Instance を1回呼んでおけば、それぞれが別々のMIDを持つので、殴られた1体だけを光らせられます。
逆に、 同じMIDを複数の個体に設定すると、全員が一緒に変化します 。1体だけ光らせたいのに全員光るときは、MIDを共有していないかを疑ってください。
光らせる下ごしらえ:親マテリアルをパラメータ化する
Dynamic Material Instanceで変えられるのは、 親マテリアルであらかじめパラメータにしておいた値だけ です。ここを飛ばすと、インスタンスを作っても変えるものがありません。
パラメータ化は、固定値のノードを右クリックして Convert to Parameter を選ぶだけです。基礎記事と同じ操作なので、詳しくは マテリアル入門の記事 を参照してください。
被弾フラッシュのために用意するのは、 「元の色」と「白」を混ぜる割合 の1つです。次のように組みます。

| ノード | 役割 | パラメータ化 |
|---|---|---|
Constant3Vector → Convert to Parameter | 元の色 | OriginalColor(Vector Parameter) |
| Constant3Vector(赤 1,0,0) | 光るときの色 | しない(固定でよい) |
Constant → Convert to Parameter | 混ぜる割合 | FlashAmount(Scalar Parameter、既定値 0.0) |
| Lerp(Linear Interpolate) | 2色を混ぜる | ― |
Lerp の A に OriginalColor 、B に 赤(R=1.0 / G=0.0 / B=0.0) 、Alpha に FlashAmount を挿し、出力を 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など)のノード で、対象のメッシュコンポーネントから伸ばします。

| ピン | 型 | 内容 |
|---|---|---|
| Target | Primitive Component | 対象のメッシュコンポーネント |
| Element Index | int | 何番目のマテリアルスロットか(既定 0) |
| Source Material | Material Interface | 元にするマテリアル(空なら今そのスロットに入っているもの) |
| Optional Name | Name | 付けたい名前(省略可) |
| 戻り値 | Material Instance Dynamic | 作られた複製。 これを保持して使う |
やっていることは3つで、これを1ノードでまとめてやってくれます。
- 今そのスロットに入っているマテリアルを元に、複製(Dynamic Material Instance)を作る
- その複製を、同じスロットに 貼り直す
- 作った複製を 戻り値として返す
つまり 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 |
どちらも Target に Dynamic Material Instance (Create の戻り値)を、Parameter Name にパラメータ化した名前を、Value に新しい値を渡します。
毎フレーム作り直さない
ここが、実際に書くときに最もやりがちな失敗です。 Create Dynamic Material Instance を Event Tick や、ダメージを受けるたびに呼んではいけません。
Create は毎回 新しい複製を作る ノードです。フレームごとに呼べば、毎フレーム新品のマテリアルが生まれ、古いものが捨てられ続けます。見た目は動いても、内部では無駄な生成が積み上がっていきます。

正しい形はこうです。
| タイミング | やること |
|---|---|
Event BeginPlay | Create Dynamic Material Instance を 1回だけ 呼び、戻り値を 変数に保存 する |
| 以後(被弾など) | 保存した変数に対して 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で滑らかに戻す
FlashAmount を 1.0 にすれば白くなりますが、そのままでは白いまま固まります。 時間をかけて0へ戻す 必要があります。
Set Timer で少し待ってから 0.0 に戻すだけでも、「パッと光ってパッと消える」表現にはなります。ただ、これだと点滅が硬く見えます。 1.0から0.0へ滑らかに減らす と、じわっと戻る自然なフラッシュになります。この用途にちょうど合うのが Timeline です。

Timelineは、時間に沿って動く値を作るノードです。中に Float トラックを1本用意し、 0秒で1.0、0.2秒で0.0 になる曲線を描きます。
| Timelineのピン | 繋ぎ先 |
|---|---|
| Play from Start | 被弾イベントから叩く(毎回先頭から再生) |
| Update | ここから毎フレーム、Set Scalar Parameter Value を呼ぶ |
| (Floatトラックの出力) | Set Scalar Parameter Value の Value へ |
被弾のたびに Play from Start を叩けば、そのつど1.0から0.0へ0.2秒で戻ります。連続で殴られても、そのたびに先頭へ戻るので、常に「殴られた瞬間がいちばん白い」状態になります。
Timelineそのものの作り方や曲線の編集は Timelineノードの記事 にまとめてあります。
実践:被弾した瞬間に赤く光る
2Dアクションの被弾、ARPGの敵ヒット、シューティングの装甲判定。 「当たった」を色で見せる のは、ジャンルを問わず手触りを大きく左右します。ここでは ダメージの記事 で作った受け側に、被弾フラッシュを足します。
完成形
Cubeを殴るたびに、そのCubeが 一瞬赤くなって0.2秒で元の色へ戻ります 。2体並べても、殴った1体だけが光り、もう1体は変わりません。

再現条件
Third Person テンプレート で、ダメージの記事 の BP_Damageable(E キーで殴るとHPが減るCube)が動く状態から始めます。まだ無くても、被弾で反応するActorがあれば同じように組めます。
マテリアルの準備
| 種類 | 名前 | 内容 |
|---|---|---|
| Material | M_Flashable | 前半の「下ごしらえ」で作った、OriginalColor / FlashAmount を持つマテリアル |
M_Flashable を BP_Damageable の StaticMesh の Material Slot 0 に割り当て、マテリアル側は Apply して保存 しておきます。FlashAmount の既定値は 0.0 です。表示に使うスロットが複数ある場合は、スロットごとにMIDが要ります。
変数(BP_Damageable に追加する)
| 変数名 | 型 | 初期値 | 用途 |
|---|---|---|---|
DynMat | Material Instance Dynamic の参照 | None | 作った専用複製を保持する |
Timeline(BP_Damageable に追加する)
| 項目 | 値 |
|---|---|
| Timeline名 | FlashTimeline |
| トラック | Float トラック1本(名前 Flash) |
| キー | 時刻 0.0 で値 1.0 / 時刻 0.2 で値 0.0 |
| Length | 0.2 |
ステップ1:BeginPlayで複製を1回だけ作る
BP_Damageable の Event BeginPlay に足します。 ここで作るのは1回だけ です。

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
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 なら毎回先頭に戻るので、殴られるたびに必ず最も赤い状態から始まります。
注意: 下ごしらえで
LerpのBを赤にしてあれば、追加の設定は要りません。色を実行中に変えたい(炎は赤、氷は青、など)場合は、BをFlashColorという Vector Parameter にして、被弾時にSet Vector Parameter Valueで色を渡します。
確認する
Playして、Cubeの正面で E を押してください。
- 1回押す → Cubeが赤くフラッシュし、 約0.2秒で元の色へ戻る
- 素早く連打する → ダメージの記事 で無敵時間(
InvincibleTime1.0秒)を設定していれば、1秒に1回だけ光る(フラッシュは被弾が通ったときだけ出る) - Cubeを複製して2体並べ、片方だけ殴る → 殴った1体だけが光り、もう1体は変わらない
3つ目が、この記事のいちばん確かめてほしい点です。MIDを個体ごとに持っているからこそ、1体だけを光らせられます。
うまくいかないときの切り分けです。
- 殴っても色が変わらない →
Set Scalar Parameter ValueのTargetがDynMatになっていない。またはParameter NameがFlashAmountと一致していない。あるいは被弾ごとにCreate Dynamic Material Instanceを呼び直していて、古いDynMatへSetしている - 一瞬白く(または元色に)光るだけで赤くならない →
LerpのBが白のまま。混ぜる色を赤にするかSet Vector Parameter Valueで色を渡す - 光ったまま戻らない → Timelineの終点(0.2秒)で値が0.0になっていない。または
Updateではな くFinishedからSetを呼んでいる - 2体並べたのに両方光る →
Create Dynamic Material Instanceを呼ばず、元のマテリアルや Material Instance Constant を直接Setしている - カクつく/だんだん重くなる →
Create Dynamic Material InstanceをEvent Tickや被弾ごとに呼んでいる。BeginPlayで1回だけにする
ポイントは2つです。
- 作るのは1回、変えるのは何度でも:
Create Dynamic Material InstanceはBeginPlayで1回呼んで変数に保持します。フラッシュのたびに呼ぶのは、毎回新品のマテリアルを作って捨てているのと同じです - 個体差はDynamic Material Instanceで出す: 元のマテリアルは全員の共有物です。1体だけを光らせたい、体力に応じて色を変えたい、といった 個体ごとの見た目 は、必ずその個体専用の複製に対して行います
同じ仕組みは、点滅(拾えるアイテム)、選択中の建物を緑にする、体力が減ると赤くにじむ、といった演出にそのまま使えます。フラッシュ・ヒットストップ・カメラシェイクをまとめて「手応え」として設計するなら ヒットフィードバックで手応えを出す へ、エフェクトそのものを足すなら Niagaraの記事 へ進みます。
おまけ:先に知っておくと良いこと
-
この実践はシングルプレイ前提:
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 InstanceはBeginPlayで1回だけ 呼んで変数に保持。毎フレーム・被弾ごとに作らない- 滑らかに戻すのは Timeline 。
Play from Startで毎回先頭から再生する
いま作っているゲームで、プレイヤーに「今のは効いた」と最初に伝えたい瞬間はどこでしょうか。その一瞬に色を1つ足すだけで、手触りは大きく変わります 。