UnityユーザーのためのUEブループリント入門
コードとビジュアル両方のスクリプトを比較してゲームエンジンを学びます

13. 配列

Unreal Engineの配列は多次元配列を組むことができません。ブループリントでなんとか作成したり、C++を使ったりといった方法で実現しているネットでいくつか見かけます。ここでは特殊な方法として実例は紹介しません。リンク先のサイトで確認してみてください。
  • 配列
  • 多次元配列
  • 連想配列

13. 配列

13.1 配列

int型の配列aを作成します。
int[] a = new int[3];
配列内の値の取得
作成した配列から値を取得します。
int[] a = { 1, 2, 3, 4, 5 };
for(int i = 0; i < 5; ++i)
{
    Debug.Log(a[i]);
}
配列の長さの取得
配列の長さを取得します。
int[] a = { 1, 2, 3, 4, 5 };
Debug.Log(a.Length);
配列数の追加と値の代入
配列の数を増やして、値を入れます。
int[] a = { 1, 2, 3, 4, 5 };
Array.Resize(ref a, 5);
numbers[5] = 6;
for(int i = 0; i < a.Length; ++i)
{
    Debug.Log(a[i]);
}
動的配列
配列の数をあらかじめ決めるのではなく、求められた数に応じて配列の数を増減させる動的配列があります。Unityの場合はListコレクションやLinqなどを使います。以下の例は既にあるListコレクションに値を追加するスクリプトです。
List<int> numbers = new List<int> { 1, 2, 3 };
numbers.Add(4);

13.2 多次元配列

例としてint型の三次元配列aを作成します。
int[,,] a = new int[3,4,2];
int[,,] a = new int[3,4,2]; 
for(int i = 0; i < a.GetLength(0); ++i)
{
    for(int j = 0; j < a.GetLength(1); ++j)
    {
        for(int k = 0; k < a.GetLength(2); ++k)
        {
            a[i,j,k] = i + j + k;
        }
    }
}

13.3 連想配列

連想配列はキーに基づいて値を取得する配列です。辞書型配列とも呼ばれます。
Dictionary<string, int> dic = new Dictionary<string, int>(){
    {a, 1},
    {b, 2},
    {c, 3},       
};
foreach(string key in dic.Keys) {
    Debug.Log("キーは" + key + "です。);
}
連想配列dicのキーaの値を出力します。
Debug.Log("キーaの値は" + dic[a] + "です。");

13. 配列

13.1 配列

配列を作成するには、Variable Typeの右側のアイコンをクリックして、二番目のArrayを選択します。
Make Arrayノードから配列を作成する方法もあります。
初期値を設定する場合は、配列の変数を作成してコンパイルしてから初期値を設定します。
配列内の値の取得
まず配列の値を複数作成して初期値をいれます。
以下のブループリントを作成します。
配列の長さの取得
配列の長さをLENGTHノードで取得します。
配列数の追加と値の代入
配列にデータをいれるにはAddノードを使用します。
その他の配列の内容を操作するノードの種類の紹介については、以下のサイトが参考になると思います。
🔗 参考リンク
Unreal Engineデベロッパードキュメント
配列ノード

配列の中身の取得と値型・参照型

前に説明した配列数の追加と値の代入では、ForEachLoopノードのArrayElementデータピンからPrintStringノードに渡していますが、実際には何番目の要素を取得したいといったときに、UE BPではGETノードを使います。このGetノードには値型と参照型の二種類があります。
例えばロールプレイングゲームでチーム内のメンバーのHPを配列で管理した場合、各メンバーのHPを取得する場合など、配列からデータを読み取るだけで、変更したくない場合は、「Get (a copy)」を使います。
チームが敵に遭遇して戦闘シーンになったとき、あるメンバーが敵からのダメージを受けた場合、そのダメージによって失ったHPを反映させる場合など、配列からデータを変更する場合は、「Get (a ref)」ノードを使います。
Get(a copy)ノードとGet(a ref)ノードの違いについて簡単な例を示します。配列aにInteget型の1~5の値をデフォルト値にいれます。
0番目の要素1を30に変更します。Get(a ref)ノードで取得してから値を変更するにはSet(by ref)ノードを使います。
Get(a ref)ノードをGet(a copy)ノードに置き換えると、変更されません。
🔗 参考リンク
Unreal Engine Forum
Difference between get (a ref) and get (a copy)
動的配列
Set Array ElemノードのSize to Fitをチェックすると動的配列的な処理をします。つまり、IndexデータピンまたはIndexの数字の指定した値が配列の数より超えている場合は、その値まで配列の数を拡張してItemで指定した値を追加してくれます。
例えば配列Aと、デフォルトの値のない配列Bを作成します。
配列Aの内容を配列BにSet Array Elemノードを使ってコピーします。Size to Fitをチェックします。
Size to Fitをチェックしないでplayを実行すると、何も表示されません。
Set Array Elemノードについて詳しい説明をしているブログがありますので、参考までに紹介します。
🔗 参考リンク
UE4ゲーム製作事例備忘録ブログ!
Set Array Elemって何よ!?!?!

13.2 多次元配列

UE BPで多次元配列を扱うノードはありません。以下のサイトでUE BPで二次元、三次元の配列を扱う方法を紹介しているので参考にしてください。基本的には多次元配列を扱いたい場合は、UE C++を使うことが望ましいと思います。
🔗 参考リンク
hakobuneworks
BPでn次元配列を扱う
もう一つ別のアプローチとして、構造体と配列を使って、二次元配列を作成する方法がありますが、実際に使用する際には、事前に動作確認やパフォーマンスの検証が必要になると思います。
🔗 参考リンク
GameProgrammar's Night ゲームプログラム系の覚え書き
UE4 BPで2次元配列を実現する

13.3 連想配列

UE BPでも連想配列に対応しています。string型の変数dicを作成します。
Variable TypeはMap(Dictionary)を選択します。
キーの型と値の型を選択します。
一旦コンパイルしてから、初期値を追加します。
連想配列のキーと値を出力します。
連想配列dicのキーaの値を出力します。