最近、UE4をまじめに勉強し始めました。
ぷちこん提出したい。
マテリアルをコンパイルせずに変えたい
ここからが本題ですが、マテリアルを触っていた時の疑問
「マテリアルをコンパイルせずにテクスチャUVスケールを変えるにはどうすればいいんだろう?」
これを解決するために調べながら作ったものをまとめてみます。
今回作ったもの
今回は勉強がてら、マテリアルのテクスチャUVスケールをランダムに変えるブループリントを組んでみました。
環境
UE4.18.3
テンプレート : Twin Stick Shooter
作成手順
STEP1. UVスケールのfloat値を持ったマテリアルコレクションを用意
STEP2. マテリアル内部でマテリアルコレクションのUVスケールを取得してテクスチャに適用
STEP3. ブループリント側からマテリアルコレクションのUVスケール値をランダムに変更
STEP1. マテリアルコレクションの用意
マテリアルに外部からパラメータを渡すにはマテリアルコレクションを使います。
まずは右クリックからマテリアルコレクションを作成。
マテリアルコレクションの名前はMC_Floorとしておきます。
マテリアルコレクションの設定
マテリアルコレクションにはUVスケール値として2つのfloat値 ScaleXとScaleYを追加しておきます。
STEP2. マテリアルの作成
右クリックメニューからマテリアルを作成します。
以下のようなマテリアルを組みました。
マテリアルコレクションのScaleXとScaleYを使ってテクスチャをUVスケールしています。
マテリアル解説
左端にある緑色のノードはCollectionParameterノードです。
STEP1で作成したマテリアルコレクションからfloat値を取得しています。
MakeFloat2ノードを使い、取得したScaleXとScaleYからfloat2を作成しています。
テクスチャのスケールを変更するにはTextureCoordinateノードを使用します。
今回は、マテリアルコレクションを使ってスケール値を変更したいので、ScaleUVsByCenterノードを使って
乗算したものをTextureSampleノードのUVsに入力しています。
STEP3. ブループリントを組む
以下のようなイベントグラフを組みました。
1秒ごとにマテリアルコレクションのScaleXとScaleYを 1~2間のランダムなfloatに設定するイベントグラフです。
ブループリント解説
イベントTickノードにDelayノードをつなげることで1秒ごとにイベントが発火するようにしています。
RandomノードにLerpノードをつなげることで、1-2の間のランダムなfloat値を取得しています。
SetScalarParameterValueノードを使い、マテリアルコレクションMC_Floor内部の変数の値を変更しています。
まとめ
・マテリアルをコンパイルせずにパラメータを変更するにはマテリアルコレクションを使う。
・マテリアル内部でマテリアルコレクションにアクセスするにはCollectionParameterノードを使う
・TextureCoordinateノードの出力をパラメータで乗算するにはScaleUVsByCenterノードを使う
・ブループリントからマテリアルコレクションを変更するときはSetScalarParameterValueノードを使う。