1
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

Unity Visual Scripting 自作ユニット内に変数をつくる (IGraphElementData)

Last updated at Posted at 2023-07-17

導入

Visual Scripting で変数を扱うときはグラフ変数やオブジェクト変数を利用する。自作ユニット内のみで使用する変数が欲しいときに共有のものを使うわけにはいかないので、 IGraphElementData という形で扱うことができる。

public interface IGraphElementWithData {
    IGraphElementData CreateData();
}
public interface IGraphElementData { }

自作ユニットに IGraphElementWithData を実装して、自作 IGraphElementData クラスを変数のように扱うことができる。GraphReferenceGraphStack もしくは FlowUnit のインスタンスがあればアクセスすることができる。

テスト

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");
    }
}

graph.png
テストとして上記のようなグラフを作成して、シーンにキューブ、スフィアを設置してそれぞれにグラフを取り付ける。実行して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 のインスタンスはグラフに配置された数だけ存在する。

1
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?