Unityでインディゲームを作る!

Unityでのゲーム制作を目指し、それに関わる話題についてのブログ

VFX Graphのシード値について [Per VFX Component]

VFX Graphでのシード値の設定について簡単にまとめます。

 コンピュータによる乱数生成において、シード値は重要です。疑似乱数ではシード値が同じだと出力される乱数が同じになります。これは乱数としては弱点であると同時に、決定論的に不特定の数値を出力したい時には便利です。

 

Reseed on Play

VFX_Graph_ReseedOnPlay

 まずはReseed on Playという設定です。これはVisual Effectコンポーネントのインスペクター最上部のGeneralカテゴリにあります。VFXを再生するたびにシード値を変更するか?という設定で、デフォルトでは有効になっています。

 しかし、効果や挙動を常に一定にしたい時や、VFX Graphをメッシュレンダラー的に使うが何らかのランダム処理をしている時などには、見た目が変化しないようにチェックを外してシード値を一定にします。

 

みっつのモード

VFX_Graph_RandomMode

 グラフ内で乱数オペレータを使う際には、全部で三つのモードがあります。パーティクルごと、コンポーネントごと、そしてストリップごと、です。

  • Per Particle
  • Per VFX Component
  • Per Particle Strip

 多くの場合、パーティクルごとに乱数を出力して各パーティクルに異なる挙動を加えるPer Particleか、ストリップを使う際にはPer Particle Stripを選択することになると思います。

 

VFX_Graph_PerVFXComponent

 ここで抑えておきたいのは Per VFX Componentモードです。これはインスタンスごと、つまり同じVFXアセットを持つゲームオブジェクトごとに乱数を生成するということですが、『決まった入力に対して必ず同じ乱数を出力する』という使い方ができます。

VFX_Graph_SameSeedPerVFXComponent

 例としてTex Indexをランダム設定するVFXを作りましたが、Per VFX componentモードだとコンポーネント全体でシードが一定なのでこのようにひとつのシード値に対して、必ずし同じ乱数が生成されます。(この例だとオペレータのシード値"0"が全てのパーティクルに適用され、全て同じテクスチャになっている)

 

 これを応用するとパーティクルをグループ分けした際に、それぞれにグループ事に同じ乱数を振り分ける、ということが可能になります。つまり、グループの通し番号(インデックス)をシード値として使うことで、同グループ内のパーティクルが同じ乱数を得ることができます。

VFX_Graph_GroupIndexSeed

 この画像は縦の列が同じグループであり、同じ数字になっています。これはまさにPer VFX Componentモードを使って得られた効果です。

VFX_Graph_TexIndexToRandomSeed

 この例だとTex Indexにグループ番号を記録しておき、それをシードとして使うことで各グループの乱数を統一しています。

 

 シード値をインスペクター上のRandom Seedで手動変更すれば、Per VFX Componentの出力も変わるので、それで結果を調整することもできます。

 

Constantについて

VFX_Graph_RandomOperator_Constant

 各RandomオペレータにあるConstantはデフォルトで有効になっていますが、特にシード値を指定しない場合はConstantのチェックを外してもいいと思います。

 

まとめ

 というわけで、VFX Graphのシード値について簡単にまとめてみました。ランダムにしたい、ほどよくランダムにしたい、使い方はどうあれシード値を上手くコントロールいきたいですね!