【UE5】マテリアルパラメータコレクション (MPC) の基本的な使い方

プログラマーの尾関です。

以前「【UE5】マテリアルのパラメータを動的に変更する方法」という記事を書いたのですが、マテリアルパラメータコレクション (MPC) についての説明をしていませんでした。

そこで、この記事で解説しようと思います。

  • 動作確認バージョン:UE 5.5.4

目次

マテリアルパラメータコレクションの概要

マテリアルパラメータコレクション (Material Parameter Collection) は、複数のマテリアル間で共有可能なパラメータです。

この仕組みを使うことで、Blueprintや C++ からマテリアルのパラメータを一括で変更することができます。

具体的な使い道

マテリアルパラメータコレクションの具体的な使い道としては以下のものが考えられます。

  • グローバルな環境パラメータ制御:例えば風の強さパラメータを定義して、草や木、旗が同じ風の揺れ方をする。昼・夜といった時間帯のカラーを一括で変更する
  • ポストプロセスとエフェクトの同期:ポストプロセスでの発光に合わせて、エフェクトの強度を動的に変更するといった使い方
  • デバッグ用途:レベル内の特定情報を可視化するパラメータなど
  • パラメータ更新の高速化:パラメータを共通化することで、CPU→GPUの転送コストを削減する(※同じパラメータを複数のマテリアルで共有する場合のみ有効)

マテリアルパラメータコレクションの作成方法

マテリアルパラメータコレクションを作成するには、コンテンツブラウザで右クリックして「マテリアル > マテリアルパラメータコレクション」から作成できます。

ここでは “MPC_Fog” というアセット名にしてみました。

作成したアセットをダブルクリックして開くとパラメータの設定ができます。

距離フォグを実装したいので、それに使うパラメータとして以下のものを定義しました。

マテリアルパラメータコレクションを使う方法

マテリアル内で MPC を使うには「CollectionParameter」ノードを作成します。

詳細タブから、対象のMPCとパラメータ名を指定します。

すると以下のように MPC のパラメータを取得できるようになりました。

距離フォグ(ベースカラーとエミッシブにフォグの色を混ぜる)のマテリアルとして以下のノードを組んでみました。

フォグの色、フォグ開始位置、フォグの濃度を MPC から取得しています。

レベル内のすべてのメッシュに距離フォグのマテリアルを適用させてこのようになりました。

マテリアルパラメータコレクションをBlueprintから変更する

テスト用にレベルブループリントの Tickで FogColor を変更するようにしてみました。

マテリアルパラメータコレクションの値は「Set Vector Parameter Value」(Scalarの場合は “Set Scalar Parameter Value“) で変更できます。

では実行して動作確認。

距離フォグの色がリアルタイムで変更できるようになりました。

注意点

注意点として、マテリアルパラメータコレクションの値変更は、高頻度で更新するとパフォーマンス上のネックとなる可能性があります。

そのため今回のような Tick での更新は避けて、必要なタイミングだけ更新するといった実装にするのが良さそうです。

おしまい

以上、マテリアルパラメータコレクションの基本的な使い方でした。

今回の記事がマテリアルパラメータコレクションの理解に役立てれば幸いです。

[追記: 2025/7/30] C++からマテリアルパラメータコレクションの値を変更する方法

C++からマテリアルパラメータコレクションの値を変更する場合、UMaterialParameterCollectionInstance経由で行う必要があります。

例えば作成した MPC を共通アセット管理クラスなどで登録できるようにします。

// Unrealエディタで設定できるようにメンバ変数に定義.
UPROPERTY(EditAnywhere)
UMaterialParameterCollection* MaterialParameterCollection;

そして、UWorld::GetParameterCollectionInstance() で UMaterialParameterCollectionInstanceを取得して、SetScalarParameterValue() または SetVectorParameterValue() でパラメータの更新を行います。

// UMaterialParameterCollectionInstanceを取得.
auto* pInst = GetWorld()->GetParameterCollectionInstance(MaterialParameterCollection);
// Scalarパラメータを設定.
pInst->->SetScalarParameterValue(FName("weight"), weight); // weightパラメータを更新.

なお、UWorld::GetParameterCollectionInstance() は内部でキャッシュされているため頻繁に呼び出しても問題なさそうですが、コードを見たところMPCインスタンスの数だけループしているようです。そのためMPCを多く使う場合は、別途キャッシュ処理を行ったほうが良いかもしれません。

\ 最新情報をチェック /