71.

UE5でキャラクターの外見を動的に変更する方法|メッシュ・マテリアル差し替え

編集

Unreal Engine 5(UE5)では、ゲーム実行中にキャラクターの外見を動的に変更できます。具体的には、スケルタルメッシュ自体を差し替えるマテリアルの色や質感を変えるパーツ単位でメッシュを組み替えるという3系統の手法があり、いずれもブループリント(BP)のノードから実行できます。装備の切り替え、被ダメージ時の発光、スキン変更といった演出を、アセットを焼き直すことなくリアルタイムに反映できます。

この記事の要点
  • 「見た目のうち何を変えたいか」で手法が分かれる。形状=メッシュ色・質感=マテリアル部位の組み合わせ=モジュラー
  • メッシュ全体を差し替えるなら Set Skeletal Mesh Asset ノード(UE5で旧 Set Skeletal Mesh から名称が変更)。
  • 色や質感を実行中に変えるなら Create Dynamic Material Instance で動的マテリアルを生成し、Set Vector Parameter Value / Set Scalar Parameter Value で値を書き換える。
  • 鎧・髪・顔などを部位単位で組み替えるなら、複数のスケルタルメッシュコンポーネントを Set Leader Pose Component で同期させるモジュラー構成。
  • スケルトンの互換性、動的マテリアルの生成タイミング、マテリアルスロット番号の3点でつまずきやすい。

外見変更の主な手法

「外見を変える」と一口に言っても、変えたい対象によって適切なアプローチが異なります。まずは下表で全体像を押さえると、どのノードを使うべきか判断しやすくなります。なお、後述のノード名やコンポーネント名はUE5系で使用されているもので、UE4世代の資料とは一部名称が異なる点に注意してください。

手法変える対象主なノードおおよそのコスト向いている用途
① メッシュ差し替えキャラの形状そのものSet Skeletal Mesh Asset差し替え時に負荷が出やすい別キャラへの変身、全身スキン切替
② 動的マテリアル色・発光・質感Create Dynamic Material Instance + Set Vector / Scalar Parameter Value軽量(毎フレームも可)被ダメージ点滅、チーム色、状態表現
③ スロット指定差し替え特定マテリアルスロットのみSet Material軽量部分的な見た目変更、装備の質感切替
④ モジュラー構成部位(頭・胴・脚など)の組み合わせ複数コンポーネント + Set Leader Pose Component構成・運用次第装備システム、キャラメイク

① メッシュ自体を差し替える(Set Skeletal Mesh Asset)

キャラクターの形状ごと別物に変えたい場合は、スケルタルメッシュコンポーネントが参照するメッシュアセットを Set Skeletal Mesh Asset ノードで差し替えます。UE5ではこのノード名が使われており、UE4世代の「Set Skeletal Mesh」と同じ役割と考えて差し支えありません。

基本的な流れは次のとおりです。

  1. 差し替え先のメッシュを保持する変数を用意する(型は Skeletal Mesh、あるいはアセット参照を非同期で読み込む場合はソフト参照)。
  2. イベントグラフに Set Skeletal Mesh Asset ノードを置く。
  3. Target にキャラクターのメッシュコンポーネント(Character クラスなら標準の Mesh コンポーネントなど)をつなぐ。
  4. New Mesh に差し替えたいスケルタルメッシュを指定する。
  5. キー入力イベントやカスタムイベントなど、任意のトリガーから実行する。

[Event / Custom Event]

  → Set Skeletal Mesh Asset

     Target   = Mesh(キャラのスケルタルメッシュコンポーネント)

     New Mesh = NewMesh(差し替え先のメッシュ)

この方式は見た目を大胆に変えられる反面、メッシュを切り替える瞬間にロードや初期化の負荷が発生しやすい点に留意してください。頻繁に切り替える、あるいは大きなアセットを扱う場合は、対象アセットを事前に読み込んでおく(メモリに載せておく)と切り替え時の引っかかりを抑えやすくなります。読み込み戦略の詳細は公式ドキュメントの確認をおすすめします。

② 色・質感を変える(動的マテリアルインスタンス)

形状はそのままに、色・発光・質感だけを変えたい場合はマテリアルを操作します。マテリアルアセットそのものは実行中に直接編集できないため、マテリアルインスタンスダイナミック(MID)と呼ばれる「実行中に値を書き換えられる複製」を生成し、それをコンポーネントへ適用するのが基本です。

準備:パラメータ化したマテリアル

動的に変えたい値は、あらかじめマテリアル側でパラメータ化しておく必要があります。色なら Vector Parameter、発光の強さやブレンド率などの数値なら Scalar Parameter をマテリアルグラフに作成しておきます。パラメータ化されていない固定値は、実行中に書き換えできません。

生成と書き換えの流れ

  1. Create Dynamic Material Instance ノードで、対象コンポーネントの指定スロット(Element Index)に対する動的マテリアルを生成する。
  2. 生成された Dynamic Material Instance(戻り値)を変数に保存しておく。毎回作り直すのは無駄なので、最初に一度だけ生成して使い回すのが定石。
  3. 変更したいタイミングで、保存した参照に対して Set Vector Parameter Value(色)や Set Scalar Parameter Value(数値)を呼び、パラメータ名と値を渡す。

// 初期化時(BeginPlay など)に一度だけ

[Begin Play]

  → Create Dynamic Material Instance(Target = Mesh, Element Index = 0)

     Return Value → 変数 MID_Body に保存

 

// 値を変えたいとき

[On Damaged]

  → MID_Body . Set Vector Parameter Value(Name = "EmissiveColor", Value = 赤)

MIDは生成後も同じ参照を保持していれば何度でも書き換えられるため、毎フレーム値を補間してフェードさせるといった表現にも向いています。負荷も比較的軽く、状態表現の定番手段です。

③ スロットを指定してマテリアルを差し替える(Set Material)

パラメータ調整ではなく「マテリアルそのものを別のものに置き換えたい」場合は Set Material を使います。スケルタルメッシュは複数のマテリアルスロット(Element)を持つことがあり、たとえば「肌=Element 0、服=Element 1」のように分かれています。Set Material は対象の Element Index を指定して、そのスロットだけを別マテリアルへ差し替えます。

スロット番号は、メッシュアセットやコンポーネントの詳細(Details)パネルにある Materials の項目で、Element 0、Element 1… と並ぶ順序に対応します。意図しない部位が変わってしまう場合、たいていは番号の指定間違いです。動的マテリアルを別マテリアルから作りたいときも、いったん適用したうえで Create Dynamic Material Instance で生成する、という順序が必要になります。

④ パーツ単位で組み替える(モジュラーキャラクター)

頭・胴・腕・脚などを別々のスケルタルメッシュとして用意し、それらを組み合わせて1体のキャラクターを構成する方式がモジュラーキャラクターです。装備の付け替えやキャラメイクのように「部位ごとに見た目を差し替えたい」ケースで威力を発揮します。

UE5では、複数のスケルタルメッシュコンポーネントを1つの親(リーダー)に同期させる Set Leader Pose Component を用いるのが代表的です(UE4世代の Set Master Pose Component に相当)。リーダーとなるコンポーネントでアニメーションを再生し、子のパーツはリーダーのポーズに追従します。これにより、複数パーツがバラバラに動かず、1体のキャラクターとして一貫して動きます。

パーツを差し替えたいときは、各コンポーネントに対して前述の Set Skeletal Mesh Asset で別パーツのメッシュを適用すれば、リーダーのポーズに追従したまま見た目だけが変わります。ただし、この方式では子パーツが独立したアニメーションを再生しない、構成によって描画負荷が増えうるといった制約があるため、用途に応じて選択してください。

具体例:被ダメージ時に赤く点滅させる

動的マテリアルの典型的な活用が、ダメージを受けた瞬間にキャラを赤く光らせる演出です。手順の例は次のとおりです。

  1. キャラのマテリアルに、発光色用の Vector Parameter(例:EmissiveColor)と発光強度用の Scalar Parameter(例:EmissiveIntensity)を用意しておく。
  2. BeginPlay で対象スロットの動的マテリアルを生成し、変数に保存しておく。
  3. 被ダメージイベントで Set Scalar Parameter Value により発光強度を一気に上げ、Set Vector Parameter Value で発光色を赤に設定する。
  4. タイムラインなどで発光強度を時間とともに0へ戻し、点滅が収まる挙動にする。

同じ仕組みで、チームカラーの反映(味方=青/敵=赤)、毒や凍結などの状態異常表現、選択中ユニットのハイライトなども実装できます。いずれも「パラメータ化したマテリアル+MID」の応用です。

落とし穴と注意点

スケルトンの互換性
メッシュを差し替えても、参照しているスケルトン(ボーン構造)が想定と合っていないと、ポーズが崩れたり正しくアニメーションしないことがあります。とくにモジュラー構成では、各パーツが互換性のあるスケルタル階層に基づいてリグされている必要があります。差し替え候補のメッシュは同系統のスケルトンで用意するのが基本です。
動的マテリアルの生成タイミング
Create Dynamic Material Instance を値変更のたびに呼ぶと、毎回新しいインスタンスが作られて無駄が生じます。生成は初期化時に一度だけ行い、戻り値を変数に保存して使い回すのが原則です。また、生成した参照を保持し忘れると、後から Set Parameter で値を書き換える対象を見失います。
マテリアルスロット番号の取り違え
Set Material や Create Dynamic Material Instance で指定する Element Index を間違えると、意図しない部位のマテリアルが変わってしまいます。詳細パネルの Materials 欄に並ぶ Element の順序(0始まり)を確認し、対象スロットの番号を正しく指定してください。メッシュごとにスロット構成は異なります。
コンストラクションスクリプトでの設定制限
バージョンによっては、スケルタルメッシュアセットの設定をコンストラクションスクリプトから行えない場合が報告されています。実行中の差し替えはイベントグラフ側で行うのが無難です。挙動はUEのバージョンで差が出うるため、不確実な場合は使用中バージョンの公式ドキュメントで確認することをおすすめします。

よくある質問(FAQ)

Q. メッシュを差し替えたのに見た目が変わりません。

Target に正しいスケルタルメッシュコンポーネントがつながっているか、差し替え先メッシュが正しく指定されているかをまず確認してください。コンストラクションスクリプトで設定しようとしている場合は、イベントグラフでの実行に切り替えると改善することがあります。また、差し替え後にアニメーションが崩れる場合は、スケルトンの互換性を疑ってください。

Q. 色を変えたいのに Set Vector Parameter Value が効きません。

多くの場合、原因は「マテリアル側でパラメータ化していない」か「動的マテリアル(MID)ではなく元のマテリアルアセットに対して呼んでいる」かのどちらかです。変えたい値を Vector / Scalar Parameter としてマテリアルに用意し、Create Dynamic Material Instance で生成した参照に対して Set Parameter を呼んでいるか確認してください。パラメータ名のスペルミスもよくある原因です。

Q. メッシュ全体の差し替えとモジュラー構成、どちらを使うべきですか。

「別キャラに丸ごと変身する」ならメッシュ全体の差し替え(①)が単純で扱いやすいです。一方、「鎧だけ・髪型だけを付け替える」など部位ごとに自由に組み合わせたいなら、モジュラー構成(④)が適しています。装備システムやキャラメイクを作るなら、最初からモジュラー前提で設計しておくと拡張が楽になります。

編集
Post Share
子ページ

子ページはありません

同階層のページ
  1. 床の上に乗ったらイベントを発生させる方法
  2. OverlapAllDynamicとOverlapAllの違い
  3. タイトル画面を作る方法
  4. サードパーソンテンプレートでのキャラクター表示の仕組みと非表示にする方法
  5. ボタンに文字を記載する方法
  6. Event ActorBeginOverlapとOn Component Begin Overlapの違い
  7. キャラクターに特定のオブジェクトとの当たり判定を付ける
  8. 特定のオブジェクトに触れたとき、キャラクターが倒れるようにする
  9. 動いているオブジェクトに静止しているキャラクターが当たり判定を持たない原因と解決方法
  10. 「On Component Hit」に「Cast To ~」で複数のクラスを指定する方法
  11. Blenderファイルをインポートする方法
  12. 鏡を作成する方法
  13. レベルブループリントでキャラクターの出現を設定する方法
  14. サードパーソンテンプレートにおけるキャラクター出現の定義
  15. アイテムに近づいたらボタンを押してイベントを発火させる方法
  16. 画面の中央にメッセージを表示する方法
  17. どこからでも呼び出せるカスタムイベントを作成する方法
  18. カスタムイベントに引数を追加する方法
  19. 「Get Overlapping Actors」から特定のクラスの場合のみ処理を実行する方法
  20. オブジェクトに近づいている間だけメッセージを表示する方法
  21. PCの画面を操作するUIを作る方法
  22. コンテンツブラウザに画像を追加する方法
  23. SetInputMode_UIOnlyを取り消す方法
  24. 特定の画像の上にマウスカーソルを置いたら手マークにする方法
  25. オブジェクトがアウトライナーで選択できない原因と解決策
  26. PlayerStartを作成する方法
  27. メニュー画面を作成して開く方法
  28. 「Esc」キーを押してメニュー画面を開く方法
  29. イベントの「On Clicked」と「On Pressed」の違い
  30. 「Set Input Mode」の種類と使い方
  31. 「Set Game Paused」の使い方と詳細解説
  32. Motion Matchingとは?
  33. 「GameMode」と「GameModeBase」の違い
  34. マップに配置したTargetPointを取得する方法
  35. TargetPointにタグをつけて取得する方法
  36. Spawnしたインスタンスがイベントを実行する方法
  37. 特定の時間ごとに処理を実行する方法
  38. 数値をランダムで出力する方法
  39. ThirdPersonテンプレートでキャラクターの移動を歩くように変更する方法
  40. MaxWalkSpeedを変更する方法
  41. しゃがむ動作を導入する方法
  42. キャラクターのアニメーションを設定する方法
  43. 導入済みのプラグインを確認する方法
  44. Motion Matchingの導入と必要なプラグイン
  45. プレイヤーを非表示にする方法
  46. カメラを傾ける角度を制限させる方法
  47. 配列からランダムに重ならない要素を特定の数取得する方法
  48. カメラの映す画面に文字やエフェクトを付ける方法
  49. キャラクターやメッシュを非表示にした際にカメラが移動しなくなる問題の解決方法
  50. プライマリーデータアセットを活用する方法
  51. プレイヤーのHPといった変数を定義する最適な場所
  52. カメラに映った画面をスクリーンショットとして保存する方法
  53. ゲーム内のカメラ映像を保存して再表示する方法
  54. HighResShot を使って高解像度の画像を保存する方法(UE5)
  55. HighResShotで保存した画像のファイル名を取得する方法
  56. SceneCapture2DとFrameGrabberの画像保存方法の比較
  57. SceneCapture2Dを使用して画像を保存・取得する方法
  58. HighResShotとTake High Res Screenshotの違い
  59. ゲーム終了ボタンを作成する方法
  60. 「Save Game To Slot」の戻り値がfalseになる問題の解決方法
  61. 画面上にメッセージを指定された時間表示させる方法
  62. シェーダコンパイル時間を短縮する方法
  63. 「Take High Res Screenshot」実行時に「シェーダをコンパイル」に長時間待たされる問題とその解決策
  64. データベースを活用する方法
  65. UE5.5がインストールされた環境にUE5.4を追加で導入する方法
  66. World PartitionとWorld Compositionの違い
  67. オープンワールドテンプレートとは?
  68. ポーンをスポーンさせても視点を切り替えない方法
  69. キャラクター同士がすり抜けてしまう問題の解決方法
  70. キャラクターの外見を動的に変更
  71. World Partitionでインスタンスが「アンロード済み」になる問題
  72. データ アセットとデータ テーブルの違い
  73. コンポーネントイベントグラフ内で親クラスの変数にアクセスする方
  74. エディターのソースコードの自動保存の頻度を高める方法
  75. SpawnActorでSpawn Transform Rotationが反映されない理由
  76. ミニマップを表示しポーンの位置を反映する方法
  77. RInterp ToとVInterp Toの違い
  78. 毎秒実行するイベントの定義方法
  79. Niagara のエフェクトにコリジョンを持たせる方法
  80. 「Overlap」と「Hit」の違い
  81. OverlapはあるがHitがない原因
  82. Overlapした位置の座標を取得する方法
  83. ブループリントでレベル間のパラメータを受け渡す方法

最近更新/作成されたページ