# リスト(配列)

Arborのデータフローはリスト(配列)に対応しております。
アクセスには各演算ノードやステートの挙動を利用してください。

## リストを使った例

ParameterContainerに設定したリストからランダムで要素を取り出す例を紹介します。

### GetParameter

- グラフのパラメータにStringListパラメータを追加。
- GetParameterで取得します。

### List.Count

- List.Count演算ノードを追加し、string型リストの要素数を取得します。

### Random.RangeInt

- 取得したリストの要素数を使用してランダムなインデックスを求めます。

### List.GetElement

- ランダムなインデックスからリストの要素を取得します。

### SetParameter

- グラフのパラメータにSelectStringパラメータを追加。
- 取得したランダムな要素をSelectStringパラメータに設定。
- ランダムに変わることを確認するために、TimeTransitionで1秒間隔で繰り返します。

## 演算ノード

Listの要素を変更しない各種データを取得するには演算ノードを使用します。

- List.Contains
- List.Count
- List.GetElement
- List.IndexOf
- List.LastIndexOf
- List.ToArrayList
- NewArrayList

## ステートの挙動

Listの要素を変更するにはステートの挙動を使用します。

- List.AddElement
- List.Clear
- List.InsertElement
- List.RemoveAtIndex
- List.RemoveElement
- List.SetElement

## 事前コンパイル(AOT)での制限

IL2CPPビルドなど事前コンパイル環境での制限により、コードから参照されていないList<T>を使用した場合に例外が発生します。

事前コンパイルでの制限についての詳細は スクリプトの制限 - Unity マニュアル を参照してください。

Arborで問題が発生する使用方法は以下の通りです。

- Parameter
  - AssetObjectList
  - ComponentList
  - EnumList
- List関連の組み込みスクリプト

このようなAOT問題を避けるには、以下のようなスクリプトを追加してください。

    1
    2
    3
    4
    5
    6
    7
    using System.Collections.Generic;

    public class AOTCodeGeneration
    {
    	// 例えばFoo型を作成してもList<Foo>はコードから使用していなかった場合。
    	public List<Foo> myStructList = new List<Foo>();
    }

AOTCodeGenerationクラスを使用する必要はありません。
このようにスクリプトに記述することで、コンパイラーが適切なコードを生成するようになります。