# データフロー

データフローに関するコードの記述方法について説明します。

## データの入出力

データの値を入力するには、`InputDataPort<T>`を使用します。
データの値を出力するには、`OutputDataPort<T>`を使用します。

### スクリプトの書き方

- publicもしくは`UnityEngine.SerializeField`を適用した`InputDataPort<T>`型のフィールドでデータを入力したい要素を宣言します。
- publicもしくは`UnityEngine.SerializeField`を適用した`OutputDataPort<T>`型のフィールドでデータを出力したい要素を宣言します。
- `InputDataPort<T>.GetValue()`を使用してデータを入力します。
- `OutputDataPort<T>.SetValue(T value)`を使用してデータを出力します。

### コード例

     1
     2
     3
     4
     5
     6
     7
     8
     9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    using System.Collections;
    using System.Collections.Generic;
    using UnityEngine;
    using LogicToolkit;

    [System.Serializable]
    public class DataFlowExample : ActionComponent
    {
        public InputDataPort<int> min;
        public InputDataPort<int> max;
        public OutputDataPort<int> output;

        // OnAction is called when the node is executed.
        protected override void OnAction()
        {
            var minValue = min.GetValue();
            var maxValue = max.GetValue();
            var result = Random.Range(minValue, maxValue);
            output.SetValue(result);
        }
    }

この例では、アクションが実行されるたびに、minポートで受け取った値からmaxポートで受け取った値-1までのいずれかの整数値をランダムに出力します。

なお、スクリプトの生成で`Random.Range(int, int)`を選択することで同様のスクリプトが作成可能です。

## InputField

データの入力については、InputFieldを使用することで、ノード内のフィールドに直接固定値も設定できるようになります。

### スクリプトの書き方

- publicもしくは`UnityEngine.SerializeField`を適用した`InputField<T>`型のフィールドを宣言します。
- `InputField<T>.value`を使用してデータを入力します。

### コード例

     1
     2
     3
     4
     5
     6
     7
     8
     9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    using System.Collections;
    using System.Collections.Generic;
    using UnityEngine;
    using LogicToolkit;

    [System.Serializable]
    public class InputFieldExample : ActionComponent
    {
        public InputField<int> min;
        public InputField<int> max;
        public OutputDataPort<int> output;

        // OnAction is called when the node is executed.
        protected override void OnAction()
        {
            var minValue = min.value;
            var maxValue = max.value;
            var result = Random.Range(minValue, maxValue);
            output.SetValue(result);
        }
    }

先ほどの例をInputFieldに置き換えた例です。
minフィールドとmaxフィールドは、固定値で設定する方法と入力ポートから受け取る方法を選択できます。

### InputFieldの種類

- InputField<T>
  通常の入力用フィールドです。
  固定値を設定するか、`InputDataPort<T>`から受け取るかを選択できます。
- InputGameObject
  GameObjectの入力フィールドです。
  固定値や`InputDataPort<GameObject>`以外にも、自グラフを実行しているGameObjectを取得する`Self`設定があります。
- InputComponent<T>
  Componentの入力フィールドです。
  固定値や`InputDataPort<T>`以外にも、自グラフを実行しているGameObjectのコンポーネントを取得する`Self`設定と指定したGameObjectからGetComponentする`GameObject`設定があります。
- InputQuaternion
  Quaternionの入力フィールドです。
  固定値や`InputDataPort<Quaternion>`以外にも、オイラー角指定でクォータニオンを取得する`Euler`設定があります。
- InputSystemType
  `System.Type`の入力フィールドです。
  型名を内部的にシリアライズすることで`System.Type`の固定値設定に対応しています。