VFXグラフでアトリビュートオペレータを使ってみました。
VFXグラフを作る
まず、Initialize Particleコンテキストに、「Set Lifetime Random」ブロックと、その下に「Set Color」ブロックを作りました。
これで寿命はパーティクルごとにランダムで決まります。実際の値は「Get Attribute: lifetime」オペレーターで取得できます。
何も無いところで右クリックして、「Create Node」を選択し、検索するとすぐに見つかるのでクリックします。
同様に「float」と「Divide」のノードを作り、ライフタイムが最大のときに、カラーのXが1になるように接続します。
「Get Attribute」では、Locationで「Current」が選択されています。
これで、寿命によって色が変わりました。寿命が長いパーティクルは白く、短いものは青くなっています。
Source
Locationを「Source」にすると前のシステムの値を得られます。システムには、一つのスポーンコンテキストによるスポーンシステムやInitialize、Update、Outputコンテキストを含むパーティクルシステムがあります。
各システムには独自のデータコンテナがあり、アトリビュートはそこに格納されています。Initializeコンテキストでソースアトリビュートを取得すると、その前にあるスポーンコンテキストや、他のパーティクルシステムの値が得られます。
ソースアトリビュートはシステムの最初のコンテキストからのみ取得できます。なので、イベントアトリビュートを読みたいときは、Initializeコンテキストで使う必要があるようです。
スクリプトでイベントアトリビュートに値をセットしてからイベントを送ることができます。
using UnityEngine;
using UnityEngine.VFX;
public class AttributeTest : MonoBehaviour
{
[SerializeField] VisualEffect vfx;
// Start is called before the first frame update
void Start()
{
}
// Update is called once per frame
void Update()
{
if(Input.GetMouseButtonDown(0))
{
VFXEventAttribute attr = vfx.CreateVFXEventAttribute();
attr.SetFloat("lifetime", 5f);
vfx.Play(attr);
//vfx.SendEvent("OnPlay",attr);
}
}
}
色を設定するブロックをUpdateコンテキストに移動すると、Sourceからの値はランダムな値に変わり、Outputコンテキストだとデフォルトの値になっていました。
ブロックの順番を変える
ロケーションを「Current」に戻して、ライフタイムと色のブロックの並び順を変えるとどうなるでしょうか。
この場合、アトリビュートを取得するときに、寿命の計算がまだ行われていないので、デフォルト値になってしまいます。