# Variable

ここでは、自作パラメータをParameterContainerに登録する方法を説明します。

## Variableスクリプトファイルの作成

### Variable Generatorによるスクリプトの生成

自作パラメータ用スクリプトを作成します。

- Projectウィンドウの右クリックメニューから「Create > Arbor > Variable C# Script」を選択。
- Variale Generatorウィンドウの「Variable Name」フィールドにパラメータクラス名を入力 「Create」ボタンを押してスクリプト作成。
  - 使用できない名前の場合はエラーボックスが表示されるため、Variable Nameを修正してください。
  - OpenEditorチェックボックスがチェックされていると、「Create」ボタン押下後にスクリプトエディタが開きます。

### 作成例

「Variable Name」にEnemyInfoと入力し、「Create」ボタンを押して作成されたスクリプト例

#### EnemyInfoVariable.cs

     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
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    using UnityEngine;
    using System.Collections;
    using System.Collections.Generic;
    using Arbor;

    [System.Serializable]
    public class EnemyInfo
    {
    	// Declare Serialize Fields
    }

    [System.Serializable]
    public class FlexibleEnemyInfo : FlexibleField<EnemyInfo>
    {
    	public FlexibleEnemyInfo(EnemyInfo value) : base(value)
    	{
    	}

    	public FlexibleEnemyInfo(AnyParameterReference parameter) : base(parameter)
    	{
    	}

    	public FlexibleEnemyInfo(InputSlotAny slot) : base(slot)
    	{
    	}

    	public static explicit operator EnemyInfo(FlexibleEnemyInfo flexible)
    	{
    		return flexible.value;
    	}

    	public static explicit operator FlexibleEnemyInfo(EnemyInfo value)
    	{
    		return new FlexibleEnemyInfo(value);
    	}
    }

    [System.Serializable]
    public class InputSlotEnemyInfo : InputSlot<EnemyInfo>
    {
    }

    [System.Serializable]
    public class OutputSlotEnemyInfo : OutputSlot<EnemyInfo>
    {
    }

    [AddComponentMenu("")]
    public class EnemyInfoVariable : Variable<EnemyInfo>
    {
    }

#### EnemyInfoListVariable.cs

    1
    2
    3
    4
    5
    6
    7
    8
    9
    using UnityEngine;
    using System.Collections;
    using System.Collections.Generic;
    using Arbor;

    [AddComponentMenu("")]
    public class EnemyInfoListVariable : VariableList<EnemyInfo>
    {
    }

#### 解説

- EnemyInfo
  自作するパラメータのクラス。
  シリアライズ用フィールドを追加することで、ParameterContainerで自作パラメータを設定できるようになります。
- FlexibleEnemyInfo
  Constant、Parameter、Calculatorを切り替えて参照できるようにするためのクラス。
- InputSlotEnemyInfo
  EnemyInfoの入力スロット用クラス。
- OutputSlotEnemyInfo
  EnemyInfoの出力スロット用クラス。
- EnemyInfoVariable
  ParameterContainerへ登録するためのVariableクラス。
  クラス名とスクリプトファイル名が一致している必要があります。
- EnemyInfoListVariable
  ParameterContainerへ登録するためのVariableListクラス。
  クラスメイトスクリプトファイル名が一致している必要があります。

### フィールドの追加

生成したスクリプトにフィールドを追加します。

例として、EnemyInfoにいくつかフィールドを追加してみます。

    1
    2
    3
    4
    5
    6
    7
    [System.Serializable]
    public class EnemyInfo
    {
    	// Declare Serialize Fields
    	public string displayName;
    	public Sprite icon;
    }

## ParameterContainerへの追加

作成したVariableをParameterContainerへ追加します。

- あらかじめParameterContainerを作成しておいてください。
- 「＋」ボタンを押し、「Variable > 作成したVariable名」を選択。
- パラメータが追加される

## Variableパラメータへの参照

### FlexibleField

生成したスクリプトファイルに定義されているFlexible+Variable NameのクラスをStateBehaviourなどに持たせることで参照できます。

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

    [AddComponentMenu("")]
    public class EnemyInfoBehaviour : StateBehaviour {

    	public FlexibleEnemyInfo enemyInfo;

    	// Use this for enter state
    	public override void OnStateBegin()
    	{
    		EnemyInfo value = enemyInfo.value;
    		Debug.Log(value.displayName);
    	}
    }

### AnyParameterReference

Parameterを直接参照する場合はAnyParameterReferenceを使用します。

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

    [AddComponentMenu("")]
    public class EnemyInfoBehaviour2 : StateBehaviour {

    	[ClassExtends(typeof(EnemyInfo))]
    	public AnyParameterReference enemyInfo = new AnyParameterReference();

    	// Use this for enter state
    	public override void OnStateBegin()
    	{
    		Parameter enemyInfoParameter = enemyInfo.parameter;
    		if (enemyInfoParameter != null)
    		{
    			EnemyInfo value = enemyInfoParameter.value as EnemyInfo;
    			Debug.Log(value.displayName);
    		}
    	}
    }