導入
Visual Scripting で変数を扱うときはグラフ変数やオブジェクト変数を利用する。自作ユニット内のみで使用する変数が欲しいときに共有のものを使うわけにはいかないので、 IGraphElementData
という形で扱うことができる。
public interface IGraphElementWithData {
IGraphElementData CreateData();
}
public interface IGraphElementData { }
自作ユニットに IGraphElementWithData
を実装して、自作 IGraphElementData
クラスを変数のように扱うことができる。GraphReference
、GraphStack
もしくは Flow
と Unit
のインスタンスがあればアクセスすることができる。
テスト
public class MyUnit : Unit, IGraphElementWithData {
[DoNotSerialize]
public ControlOutput Output;
[DoNotSerialize]
public ControlInput Input;
[DoNotSerialize]
public int count = 0;
public string unitid { get; } = Guid.NewGuid().ToString().Substring(0, 5);
public class Data : IGraphElementData {
public int count = 0;
}
public IGraphElementData CreateData() {
Debug.Log($"{unitid}: CreateData()");
return new Data();
}
protected override void Definition() {
Input = ControlInput("Input", f => {
// ここで変数を取得、インスタンスは勝手に作ってくれる
var data = f.stack.ToReference().GetElementData<Data>(this);
data.count++;
this.count++;
Debug.Log($"{unitid}: Instance ({count}), GraphElementData ({data.count})");
return Output;
});
Output = ControlOutput("Output");
}
}
テストとして上記のようなグラフを作成して、シーンにキューブ、スフィアを設置してそれぞれにグラフを取り付ける。実行して2回ずつクリックした結果が以下。
// Run
b73b3: CreateData()
0d8a5: CreateData()
b73b3: CreateData()
0d8a5: CreateData()
// Click Cube
b73b3: Instance (1), GraphElementData (1)
0d8a5: Instance (1), GraphElementData (1)
// Click Cube
b73b3: Instance (2), GraphElementData (2)
0d8a5: Instance (2), GraphElementData (2)
// Click Sphere
b73b3: Instance (3), GraphElementData (1)
0d8a5: Instance (3), GraphElementData (1)
// Click Sphere
b73b3: Instance (4), GraphElementData (2)
0d8a5: Instance (4), GraphElementData (2)
GraphElementData
のスコープ範囲はグラフ変数かつユニットごとになる。
Unit
のインスタンスはグラフに配置された数だけ存在する。