# データフロー

# 出力スロット

OutpotSlotIntなどの出力スロットを宣言することでデータ出力ができます。

## スクリプト例

TestOutputSlotBehaviourスクリプトファイルを作成し、以下のコードを記述してください。

     1
     2
     3
     4
     5
     6
     7
     8
     9
    10
    11
    12
    13
    using UnityEngine;
    using Arbor;

    [AddComponentMenu("")]
    public class TestOutputSlotBehaviour : StateBehaviour
    {
    	public OutputSlotInt outputSlot;

    	public override void OnStateBegin()
    	{
    		outputSlot.SetValue(Random.Range(100, 200));
    	}
    }

このスクリプトをArborFSMのステートに追加すると以下のようになります。

## 出力スロットクラス

- OutputSlotInt
- OutputSlotFloat
- OutputSlotBool
- OutputSlotGameObject
- OutputSlotString
- OutputSlotVector2
- OutputSlotVector3
- OutputSlotQuaternion
- OutputSlotRect
- OutputSlotBounds
- OutputSlotColor
- OutputSlotTransform
- OutputSlotRectTransform
- OutputSlotRigidbody
- OutputSlotRigidbody2D
- OutputSlotComponent
- OutputSlotLong
- OutputSlotCollider
- OutputSlotCollider2D
- OutputSlotCollision
- OutputSlotCollision2D
- OutputSlotRaycastHit
- OutputSlotRaycastHit2D
- OutputSlotUnityObject
- OutputSlotAny

# 入力スロット

InputSlotIntなどの入力スロットを宣言することでデータ出力ができます。

## スクリプト例

TestInputSlotBehaviourスクリプトファイルを作成し、以下のコードを記述してください。

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

    [AddComponentMenu("")]
    public class TestInputSlotBehaviour : StateBehaviour
    {
    	public InputSlotInt inputSlot;

    	public override void OnStateBegin()
    	{
    		int intValue = 0;
    		if (inputSlot.GetValue(ref intValue))
    		{
    			Debug.Log("inputSlot : " + intValue);
    		}
    		else
    		{
    			Debug.LogWarning("inputSlot : not connected.");
    		}
    	}
    }

このスクリプトをArborFSMのステートに追加すると以下のようになります。

## 入力スロットクラス

- InputSlotInt
- InputSlotFloat
- InputSlotBool
- InputSlotGameObject
- InputSlotString
- InputSlotVector2
- InputSlotVector3
- InputSlotQuaternion
- InputSlotRect
- InputSlotBounds
- InputSlotColor
- InputSlotTransform
- InputSlotRectTransform
- InputSlotRigidbody
- InputSlotRigidbody2D
- InputSlotComponent
- InputSlotLong
- InputSlotCollider
- InputSlotCollider2D
- InputSlotCollision
- InputSlotCollision2D
- InputSlotRaycastHit
- InputSlotRaycastHit2D
- InputSlotUnityObject
- InputSlotAny

# FlexibleField

入力スロットだけでなく、固定値やパラメータも扱いたい場合はFlexibleFieldが便利です。

## スクリプト例

TestFlexibleFieldBehaviourスクリプトファイルを作成し、以下のコードを記述してください。

     1
     2
     3
     4
     5
     6
     7
     8
     9
    10
    11
    12
    13
    using UnityEngine;
    using Arbor;

    [AddComponentMenu("")]
    public class TestFlexibleFieldBehaviour : StateBehaviour
    {
    	public FlexibleInt flexibleInt;

    	public override void OnStateBegin()
    	{
    		Debug.Log("flexibleInt : " + flexibleInt.value);
    	}
    }

このスクリプトをArborFSMのステートに追加すると以下のようになります。

## FlexibleField関連クラス

- FlexibleInt
- FlexibleFloat
- FlexibleBool
- FlexibleGameObject
- FlexibleString
- FlexibleEnumAny
- FlexibleVector2
- FlexibleVector3
- FlexibleQuaternion
- FlexibleRect
- FlexibleBounds
- FlexibleColor
- FlexibleTransform
- FlexibleRectTransform
- FlexibleRigidbody
- FlexibleRigidbody2D
- FlexibleComponent
- FlexibleLong
- FlexibleField
  (継承して使用します)

# スロットの型制約

InputSlotAnyやInputSlotComponentなどでは型制約を属性で指定できます。

## スクリプト例

TestConstraintSlotBehaviourスクリプトファイルを作成し、以下のコードを記述してください。

     1
     2
     3
     4
     5
     6
     7
     8
     9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    using UnityEngine;
    using Arbor;

    [AddComponentMenu("")]
    public class TestConstraintSlotBehaviour : StateBehaviour
    {
    	[ClassExtends(typeof(AudioSource))]
    	public InputSlotComponent audioSource = new InputSlotComponent();

    	[ClassExtends(typeof(AudioClip))]
    	public InputSlotUnityObject audioClip = new InputSlotUnityObject();

    	[ClassExtends(typeof(AudioSourceCurveType))]
    	public InputSlotAny audioSourceCurveType = new InputSlotAny();

    	public FlexibleAnimationCurve curve = new FlexibleAnimationCurve(AnimationCurve.Linear(0, 0, 1, 1));

    	public override void OnStateBegin()
    	{
    		AudioSource source_ = audioSource.GetValue<AudioSource>();
    		AudioClip clip_ = audioClip.GetValue<AudioClip>();
    		AudioSourceCurveType curveType_ = AudioSourceCurveType.CustomRolloff;
    		audioSourceCurveType.GetValue<AudioSourceCurveType>(ref curveType_);

    		AnimationCurve curve_ = curve.value;

    		if (source_ == null || clip_ == null)
    		{
    			return;
    		}

    		source_.clip = clip_;
    		source_.SetCustomCurve(curveType_, curve_);
    	}
    }

## 使用できる属性

クラス | 属性
--- | ---
OutputSlotAny | SlotTypeAttribute
InputSlotAny | ClassTypeConstraintAttributeから派生したクラス SlotTypeAttribute
InputSlotComponent | ClassTypeConstraintAttributeから派生したクラス SlotTypeAttribute 指定の他、Componentクラスに制約される。
InputSlotUnityObject | ClassTypeConstraintAttributeから派生したクラス SlotTypeAttribute 指定の他、UnityEngine.Objectクラスに制約される。
FlexibleComponent | ClassTypeConstraintAttributeから派生したクラス SlotTypeAttribute 指定の他、Componentクラスに制約される。

# DataLink属性

DataLink属性を使用することで、対応している型のInputSlotやFlexibleFieldがない場合でも、定数もしくはデータフローからの入力を受け付けられるようになります。

スクリプトリファレンス : DataLink

## スクリプト例

ExampleDataLinkBehaviourスクリプトファイルを作成し、以下のコードを記述してください。

     1
     2
     3
     4
     5
     6
     7
     8
     9
    10
    11
    12
    13
    14
    15
    16
    17
    using UnityEngine;
    using Arbor;

    [AddComponentMenu("")]
    public class ExampleDataLinkBehaviour : StateBehaviour
    {
    	[System.Serializable]
    	public class ExampleData
    	{
    		public string name = "Test";
    		public float power = 100f;
    	}

    	[DataLink]
    	public ExampleData exampleData;
    }

## 注意点

- NodeBehaviourを継承したクラス(StateBehaviourやActionBehaviourなど)のフィールドでのみ使用できます。
- 配列やリストには使用できません。

# カスタマイズ

## データスロットの作成

自作したクラスのデータスロットも作成できます。

詳しくは、「スクリプティング : データスロット」を参照してください。

スクリプティング : データスロット

## Variable

パラメータも作成する場合は、Variable Generatorを使用すると楽に作成できます。

詳しくは、「スクリプティング : Variable」を参照してください。

スクリプティング : Variable

## 演算ノード

演算ノードに使用するスクリプトも作成できます。

詳しくは、「スクリプティング : 演算ノード」を参照してください。

スクリプティング : 演算ノード