【UE4】エフェクト版のMID(マテリアルインスタンスダイナミック)
タイトル通り、エフェクト版のMIDについて(まだ不完全な部分もあります、ご了承ください)
【MIDについて】
そもそもMID(マテリアルインスタンスダイナミック)というのは
ゲーム中に動的に、マテリアル内のパラメータを変更する事が出来るというもの。
考え方はDynamicParameterと一緒ですが
この変更をBPで行うというもの。
パラメータ数の制限などがなく、BPで数値を制御できるので、自由度が増します
ただし、設定が割と面倒です。
【マテリアル側の設定】
まず、P_Fireを開き、そこに使われているマテリアルに変更を加えます
エミッタのRequiredをクリックしたあと、Materialに入っているマテリアルをダブルクリックして、マテリアルエディタを開きます。
開いたら、オパシティに繋いである部分を、「Multply」に繋いで
Bには「Scalar parameter」(OPとなるノードです)
を接続して
ParameterNameをOP(ここは、BPで数値いじる際に使うので、解りやすい名前を)
DefaultValueを1に
この変更を、ほかのエミッタでも行います
今回は、スターターコンテンツにある、P_Fireを使い
条件を満たしたときに、色が透明になっていって消える処理を作ります。
BPのイベントグラフではこのようになっています。
また、今回はDistortionというエミッターは無効にしておいてください(マテリアルの作りが特殊だったので)
まず、ActorクラスのBPを作り
その中に、P_Fireと、判定用のboxCollisionを追加します(BoxCollsionは、判定用のみなので、ほかの手段でも問題ないです)
【BPによる設定】
今回は、炎に当たった時に、炎が消えていく処理にしたいので
炎より大きめのboxCollsionにします、そして、接触したら判定されるように
OnComponentBiginOverlapを追加します
この判定用から、Create Dynamic Material Instance
のノードを順番に繋げます
今回のP_Fireは、エミッターを無効化したのを除けば、エレメントが5種類あるので
同じノードを複製して。
Element Indexを0~4の順番に設定して、それらを5つ繋げます
ターゲットには、コンポーネントのP_Fire
SourceMaterialには、そのエレメントに登録してあるマテリアルを入れます。
ドラッグ&ドロップしようとすると、このように表示されますが、きちんと登録されます。
その後、タイムラインノードを追加し、トラックを追加します。
F+という、左上のアイコンクリックしてトラックを追加
その後、黄色の部分で時間を指定して、カーブを作ります
このカーブの秒数は任意で構いませんが、今回は2秒かけて1→0になるようにしました。
これにより、タイムラインにfloat型の出力ピンが出てくるはずです。
次に必要なのは、実際に数値をマテリアル側に渡すノードである、この「Set Scalar Parameter Value」というノード
アンダーラインを引いていますが、対象が「Material Instance Dynamic」(MID)です
そして、コンポーネントにMIDは入っていません
この状態で、検索すると、ノードは確かに出てきますが
違うノードが出てきます(これは、マテリアルコレクションに入れてある数値を変更するノード)
なので、このノードを出す方法は
このように、MIDの情報が入っている場所から引っ張ってください。
また、変数として、MIDを新たに作って、Getしてこれば同じノードを出すことも可能ですが。
今回の場合は、既にあるノードから作ったほうが楽です。
この、新しく作ったノードに「Create Dynamic Material Instance」ノードのRetum Valueを全て引っ張ってきます
ParameterNameは、マテリアルに入れた、ScalarParameterの名前を入れます。
この状態で、BoxCollisionに触れると、だんだん透明になっていくのが分かると思います。
このオレンジの部分が見えていますが、これはカスケードにある、lightの影響です
あくまで、マテリアル側の数値にしか変更を加えてないので、この様な例も残ってしまいます。
これで、できたとなりましたが、今のままでは出来てもやや、というかかなり問題が
エレメントの順番が変わると、設定し直さないといけない
あまり、効率的とは言えないと思われます。
マテリアルを直接指定するのではなく
P_Fireから、直接マテリアルの情報を持ってくる方法、これであれば
順番が変わっても対処は必要無しに。
もっと効率化の方法ありそうなので、色々試したのですが、中々上手くは行ってくれませんでした。
自分はまだまだBPはそこまで詳しくないのもありますが...