【UE4】Custom Data Valueを利用してブループリントからマテリアルにランダム値を渡したい
先週に紹介したBlueprintでInstanced Static MeshのTransformのいち部分に値を仕込んでマテリアル側にランダム値を渡す方法・・・この話には実は続きがありまして。
Twitter上でナスヴィッチ様から情報をいただいたのですが、先日紹介した回避的な方法を採らなくても、Unreal Engine 4.25からはカスタム値をシェーダーに渡すことが正式に出来るようになっているとのことです。
具体的なノード名で言うと、Blueprint側は「Set Custom Data Value」。Material Editor側は「PerInstanceCustomData」です。
ナスヴィッチさん本当にありがとうございました。UE4がより楽しくなっていきますね!
はじめまして、いつもWebサイトの記事拝見させていただいております
ISMのインスタンスごとマテリアルにランダムな数値を与えたい時、PerInstanceCustomDataを使う方法もありかもしれません (4.25から追加の機能) pic.twitter.com/W9lwDQLOIF— ナスヴィッチ (@nasuvic) April 12, 2021
やってみよう
4.25から利用可能です。
動画版
ブループリント側
[Set Custom Data Value]というノードに値をセットします。inの[Custom Data Index]にユニークなインデックスをセットして、[Custom Data Value]に例えばランダム値を渡します。
[For Loop]と[Get Instance Count]で回すのも同じ。
ちなみにブループリント内の「110」という定数は、Cubeの配置間隔です。
画像を等倍で見たい場合はこちら
で、すごい重要なのが、Instanced Static Meshが何個のカスタムデータを参照するか宣言しておかねばなりません。(私はこれで小一時間ハマってしまった。)
[コンポーネント]で[Instanced Static Mesh]を選択して、
[詳細]の[インスタンス]項目にある[Num Custom Data Floats]の値をセットします。
今回の私の例だと「3」になります。
マテリアルエディタ側
[PerInstanceCustomdata]というノードを使います。PerInstanceCustomdata[2]のような[]括弧の数字は、ブループリント側でセットした[Custom Data Index]と一致します。
3つ受け取れるはずなので、PerInstanceCustomdata[0]、PerInstanceCustomdata[1]、PerInstanceCustomdata[2]と3つ作ります。
完成
おおーできてる! グーだね。
FPSもほぼ落ちていません。確認したPCがGPU非搭載なのですが、10,000個のCubeを置いて3fps落ちた程度。
回避策を見つけて道を切り開いてくれた先輩もすごいが、リリース後すぐ対応されているナスヴィッチさんもすごい。UE4はユーザーサイドもレベル高い方が多いので私ももっと情報を得て勉強して適用をスピード感持ってやっていきたいです。