moyasiエフェクト館

主にエフェクト関係の記事を上げていこうかと思います。


エフェクトに関係する記事上げてきます
エフェクト関係の記事の内容は緩く募集中
自分がわかる範囲であれば書いていこうかなと。

【UE4】エフェクト版のMID(マテリアルインスタンスダイナミック)

f:id:tktknkyo:20180104215922p:plain

タイトル通り、エフェクト版のMIDについて(まだ不完全な部分もあります、ご了承ください)

【MIDについて】

そもそもMID(マテリアルインスタンスダイナミック)というのは

ゲーム中に動的に、マテリアル内のパラメータを変更する事が出来るというもの。

f:id:tktknkyo:20180104220237p:plain

考え方はDynamicParameterと一緒ですが

この変更をBPで行うというもの。

パラメータ数の制限などがなく、BPで数値を制御できるので、自由度が増します

ただし、設定が割と面倒です。

 

【マテリアル側の設定】

f:id:tktknkyo:20180104222023p:plain

まず、P_Fireを開き、そこに使われているマテリアルに変更を加えます

エミッタのRequiredをクリックしたあと、Materialに入っているマテリアルをダブルクリックして、マテリアルエディタを開きます。

f:id:tktknkyo:20180104221948p:plain

開いたら、オパシティに繋いである部分を、「Multply」に繋いで

Bには「Scalar parameter」(OPとなるノードです)

を接続して

f:id:tktknkyo:20180104222324p:plain

ParameterNameをOP(ここは、BPで数値いじる際に使うので、解りやすい名前を)

DefaultValueを1に

 

この変更を、ほかのエミッタでも行います

 

f:id:tktknkyo:20180104220438p:plain

今回は、スターターコンテンツにある、P_Fireを使い

条件を満たしたときに、色が透明になっていって消える処理を作ります。

 

f:id:tktknkyo:20180104220552p:plain

BPのイベントグラフではこのようになっています。

 

f:id:tktknkyo:20180104220656p:plain

また、今回はDistortionというエミッターは無効にしておいてください(マテリアルの作りが特殊だったので)

 

 

 

f:id:tktknkyo:20180104220828p:plain

まず、ActorクラスのBPを作り

その中に、P_Fireと、判定用のboxCollisionを追加します(BoxCollsionは、判定用のみなので、ほかの手段でも問題ないです)

 

【BPによる設定】

 

今回は、炎に当たった時に、炎が消えていく処理にしたいので

f:id:tktknkyo:20180104221044p:plain

炎より大きめのboxCollsionにします、そして、接触したら判定されるように

OnComponentBiginOverlapを追加します

 

f:id:tktknkyo:20180104221312p:plain

この判定用から、Create Dynamic Material Instance

のノードを順番に繋げます

今回のP_Fireは、エミッターを無効化したのを除けば、エレメントが5種類あるので

同じノードを複製して。

f:id:tktknkyo:20180104221525p:plain

Element Indexを0~4の順番に設定して、それらを5つ繋げます

ターゲットには、コンポーネントのP_Fire

SourceMaterialには、そのエレメントに登録してあるマテリアルを入れます。

f:id:tktknkyo:20180104221652p:plain

ドラッグ&ドロップしようとすると、このように表示されますが、きちんと登録されます。

 

f:id:tktknkyo:20180104222606p:plain

 

その後、タイムラインノードを追加し、トラックを追加します。

 

f:id:tktknkyo:20180104222854p:plain

F+という、左上のアイコンクリックしてトラックを追加

その後、黄色の部分で時間を指定して、カーブを作ります

このカーブの秒数は任意で構いませんが、今回は2秒かけて1→0になるようにしました。

 

これにより、タイムラインにfloat型の出力ピンが出てくるはずです。

 

f:id:tktknkyo:20180104223230p:plain

次に必要なのは、実際に数値をマテリアル側に渡すノードである、この「Set Scalar Parameter Value」というノード

アンダーラインを引いていますが、対象が「Material Instance Dynamic」(MID)です

そして、コンポーネントにMIDは入っていません

f:id:tktknkyo:20180104223735p:plain

 

この状態で、検索すると、ノードは確かに出てきますが

 

f:id:tktknkyo:20180104223825p:plain

違うノードが出てきます(これは、マテリアルコレクションに入れてある数値を変更するノード)

 

f:id:tktknkyo:20180104224013p:plain

なので、このノードを出す方法は

このように、MIDの情報が入っている場所から引っ張ってください。

 

f:id:tktknkyo:20180104224237p:plain

また、変数として、MIDを新たに作って、Getしてこれば同じノードを出すことも可能ですが。

今回の場合は、既にあるノードから作ったほうが楽です。

 

f:id:tktknkyo:20180104224650p:plain

この、新しく作ったノードに「Create Dynamic Material Instance」ノードのRetum Valueを全て引っ張ってきます

ParameterNameは、マテリアルに入れた、ScalarParameterの名前を入れます。

 

この状態で、BoxCollisionに触れると、だんだん透明になっていくのが分かると思います。

 

f:id:tktknkyo:20180104224959p:plain

このオレンジの部分が見えていますが、これはカスケードにある、lightの影響です

あくまで、マテリアル側の数値にしか変更を加えてないので、この様な例も残ってしまいます。

 

 

これで、できたとなりましたが、今のままでは出来てもやや、というかかなり問題が

エレメントの順番が変わると、設定し直さないといけない

あまり、効率的とは言えないと思われます。

f:id:tktknkyo:20180104230437p:plain

マテリアルを直接指定するのではなく

P_Fireから、直接マテリアルの情報を持ってくる方法、これであれば

順番が変わっても対処は必要無しに。

 

もっと効率化の方法ありそうなので、色々試したのですが、中々上手くは行ってくれませんでした。

自分はまだまだBPはそこまで詳しくないのもありますが...