rn.log

備忘録など

【UE4】マテリアルのUVスケールをランダム変更するブループリントを組んでみた

最近、UE4をまじめに勉強し始めました。
ぷちこん提出したい。

マテリアルをコンパイルせずに変えたい

ここからが本題ですが、マテリアルを触っていた時の疑問
「マテリアルをコンパイルせずにテクスチャUVスケールを変えるにはどうすればいいんだろう?」

これを解決するために調べながら作ったものをまとめてみます。

今回作ったもの

今回は勉強がてら、マテリアルのテクスチャUVスケールをランダムに変えるブループリントを組んでみました。

f:id:r-ngtm:20180206113424g:plain

環境

UE4.18.3
テンプレート : Twin Stick Shooter

作成手順

STEP1. UVスケールのfloat値を持ったマテリアルコレクションを用意

STEP2. マテリアル内部でマテリアルコレクションのUVスケールを取得してテクスチャに適用

STEP3. ブループリント側からマテリアルコレクションのUVスケール値をランダムに変更

STEP1. マテリアルコレクションの用意

マテリアルに外部からパラメータを渡すにはマテリアルコレクションを使います。

まずは右クリックからマテリアルコレクションを作成。
f:id:r-ngtm:20180206111744p:plain

マテリアルコレクションの名前はMC_Floorとしておきます。
f:id:r-ngtm:20180206111820p:plain

マテリアルコレクションの設定

マテリアルコレクションにはUVスケール値として2つのfloat値 ScaleXScaleYを追加しておきます。

f:id:r-ngtm:20180206112202p:plain

STEP2. マテリアルの作成

右クリックメニューからマテリアルを作成します。
f:id:r-ngtm:20180206121209p:plain

以下のようなマテリアルを組みました。
f:id:r-ngtm:20180206112322p:plain

マテリアルコレクションのScaleXとScaleYを使ってテクスチャをUVスケールしています。

マテリアル解説

左端にある緑色のノードはCollectionParameterノードです。
STEP1で作成したマテリアルコレクションからfloat値を取得しています。

f:id:r-ngtm:20180206121828p:plain

MakeFloat2ノードを使い、取得したScaleXとScaleYからfloat2を作成しています。
f:id:r-ngtm:20180206112607p:plain

テクスチャのスケールを変更するにはTextureCoordinateノードを使用します。
f:id:r-ngtm:20180206114649p:plain

今回は、マテリアルコレクションを使ってスケール値を変更したいので、ScaleUVsByCenterノードを使って 乗算したものをTextureSampleノードのUVsに入力しています。

STEP3. ブループリントを組む

以下のようなイベントグラフを組みました。
f:id:r-ngtm:20180206115409p:plain
1秒ごとにマテリアルコレクションのScaleXとScaleYを 1~2間のランダムなfloatに設定するイベントグラフです。

ブループリント解説

イベントTickノードにDelayノードをつなげることで1秒ごとにイベントが発火するようにしています。
f:id:r-ngtm:20180206115539p:plain

RandomノードにLerpノードをつなげることで、1-2の間のランダムなfloat値を取得しています。
f:id:r-ngtm:20180206115841p:plain

SetScalarParameterValueノードを使い、マテリアルコレクションMC_Floor内部の変数の値を変更しています。
f:id:r-ngtm:20180206120029p:plain

まとめ

・マテリアルをコンパイルせずにパラメータを変更するにはマテリアルコレクションを使う。
マテリアル内部でマテリアルコレクションにアクセスするにはCollectionParameterノードを使う
・TextureCoordinateノードの出力をパラメータで乗算するにはScaleUVsByCenterノードを使う
ブループリントからマテリアルコレクションを変更するときはSetScalarParameterValueノードを使う。