# Variable

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

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

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

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

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

## 作成例

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

     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>
    {
    }

### 解説

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

## フィールドの追加

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

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

    1
    2
    3
    4
    5
    6
    7
    8
    [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);
    		}
    	}
    }