この内容は古いバージョンです。最新バージョンを表示するには、戻るボタンを押してください。
バージョン:4
ページ更新者:atom
更新日時:2026-06-12 15:16:36

タイトル: ブループリントで配列からインデックスを指定して取得する方法
SEOタイトル: UE5ブループリントで配列からインデックス指定で要素を取得する方法

Unreal Engine 5(UE5)のブループリントで配列から指定インデックスの要素を取得するには、配列変数から「Get」ノードを引き出し、その「Index」ピンに取り出したい位置の番号を入力します。インデックスは0から始まるため、先頭の要素は「0」、2番目は「1」と数えます。この基本さえ押さえれば、スポーン地点やターゲットのリストなど、複数のデータをまとめた配列から目的の1件を確実に取り出せます。本記事では、Getノードの使い方、Lengthによる範囲確認、範囲外アクセス時の挙動と対策、Get(a ref)とGet(a copy)の違いまでを順に解説します。

この記事の要点
  • 配列変数から「Get」ノードを引き出し、「Index」ピンに番号を指定して要素を取得する。
  • インデックスは0始まり。要素数(Length)がNの配列では、有効な範囲は0からN-1(Last Index = Length - 1)
  • 範囲外のインデックスを指定すると、エディタ上では警告ログが出てその型の既定値(数値なら0、オブジェクトならnull/None)が返る挙動が一般的。返ったnullを参照すると別の場所でクラッシュにつながるため要注意。
  • 事前に「Is Valid Index」ノードや「Length」とBranchで範囲チェックを行うのが安全。
  • Get(a copy)は値のコピー、Get(a ref)は要素への参照を返す。構造体の中身を直接書き換えたい場合は参照が必要。

配列とインデックスの基本

配列(Array)は、同じ型のデータを順番に並べて格納するデータ構造です。UE5のブループリントでは、変数を作成する際に型の横にある「ピン(コンテナ)」アイコンから「Array」を選ぶことで、任意の型の配列を作れます。よく使われる例には次のようなものがあります。

  • 位置情報のリスト(Vector型の配列)
  • スポーン地点として使うアクターのリスト(Actor型の配列)
  • 攻撃対象となるターゲットのリスト(参照型の配列)

配列の中の各要素には、先頭から順にインデックス(添字)と呼ばれる通し番号が割り当てられます。UE5を含む多くのプログラミング環境と同様に、このインデックスは0から始まります。要素が3つある配列なら、それぞれのインデックスは「0」「1」「2」です。「1番目の要素」を取得したいときに「1」を指定すると、実際には2番目(インデックス1)の要素が返ってくる点が、初心者がつまずきやすい部分です。

「Get」ノードで要素を取得する手順

配列から特定の要素を取り出す中心的なノードが「Get」です。基本的な流れは次のとおりです。

  • 1. 配列変数を配置する:イベントグラフ上に、対象の配列変数を「Get」(変数の取得)としてドラッグ&ドロップします。
  • 2. 「Get」ノードを引き出す:配列変数のピンから線を引き出し、検索ボックスに「Get」と入力して、「Get」ノード(カテゴリは Utilities > Array)を選びます。
  • 3. インデックスを指定する:表示された「Get」ノードの「Index」ピンに、取得したい要素の番号を入力、または別のノードから接続します。
  • 4. 出力を利用する:右側の出力ピンから、指定インデックスの要素が取り出されます。たとえば取得したアクターを「Print String」で表示したり、「Get Actor Location」で位置を取得したりできます。

「Get」ノードは純粋関数(Pure)ノードとして表示され、実行ピン(白い三角の流れ)を持ちません。そのため、値が必要になったタイミングで自動的に評価されます。配列変数から線を引き出した際に、UE5のバージョンや配列の型によっては「Get(a copy)」と「Get(a ref)」の2種類が候補に出ることがあります。これらの違いは後述します。

Lengthと有効な範囲(Last Index = Length - 1)

配列に現在いくつの要素が入っているかは、「Length」ノード(または配列ピンから引き出せる Length)で取得できます。Lengthは要素の個数を返すため、インデックスの最大値とは1つずれる点に注意が必要です。

項目意味要素が5個の配列の例
Length(Num)配列に入っている要素の総数5
先頭のインデックス常に00
末尾のインデックス(Last Index)Length - 14
有効なインデックスの範囲0 以上 Length 未満0〜4

このように、要素が5個ある配列で有効なインデックスは0から4までです。「5」を指定すると範囲外になります。UE5には末尾のインデックスを直接返す「Last Index」ノードも用意されており、これは内部的に「Length - 1」を返します(空の配列では-1になります)。ループや末尾要素の取得では、自分で引き算するよりこのノードを使うと間違いが減ります。

範囲外アクセスの挙動と対策

指定したインデックスが有効範囲(0以上Length未満)の外にあると、意図しない結果やエラーが発生します。挙動は実行環境によって異なります。

環境範囲外アクセス時の挙動
エディタ上のブループリント実行「Attempted to access index X from array … of length Y!」といった警告がログ(出力ログ)に表示され、処理は止まらずにその型の既定値が返ることが一般的です。数値なら0、ベクターならゼロベクター、オブジェクト参照ならnull(None)になります。
C++のTArrayへの直接アクセスArray[Index] での範囲外アクセスはアサーション(チェック)に引っかかり、クラッシュします。ブループリントのGetとは挙動が異なります。

ここで特に危険なのは、既定値として返ったnull(None)を、そのまま関数呼び出しなどで参照してしまうケースです。Getノード自体は警告で済んでも、返ってきたnullのアクターに対して「Get Actor Location」などを呼ぶと、その先で「Accessed None」エラーやクラッシュにつながります。「Getは落ちないから大丈夫」と考えるのではなく、取得前に範囲とnullの両方をチェックするのが安全です。

対策1:Is Valid Indexで事前チェック

最も簡潔なのが「Is Valid Index」ノード(Utilities > Array)です。配列とインデックスを渡すと、そのインデックスが有効範囲内なら true、範囲外なら false を返します。これをBranchの条件に使えば、安全なときだけGetを実行できます。

配列 ──> [Is Valid Index] ──(Bool)──> [Branch]

      Index ↑        True ──> [Get] ──> 要素を使用

                 False ─> (何もしない/別処理)

対策2:LengthとBranchで比較

「Is Valid Index」を使わず、自分で範囲を比較する方法もあります。インデックスが「0以上」かつ「Length未満」であることを確認します。

条件: Index >= 0  AND  Index < Length

この条件が True のときだけ [Get] を実行する

比較演算子に「<= Length」と書いてしまうと末尾を1つ超えてしまうため、「< Length」(Length未満)とするのが正解です。Last Indexノードを使う場合は「Index <= Last Index」となります。

Get(a ref)とGet(a copy)の違い

配列のGetには「Get(a copy)」「Get(a ref)」の2種類があり、返ってくるものの性質が異なります。

ノード返すもの編集の反映主な用途
Get(a copy)その要素の値のコピー取得結果を変更しても元の配列には反映されない値を読み取って使うだけのとき
Get(a ref)その要素への参照取得結果を変更すると元の配列の要素にも反映される配列内の構造体メンバーなどを直接書き換えたいとき

違いが顕著に現れるのは構造体(Struct)の配列です。Get(a copy)で取り出した構造体の中身を書き換えても、それはコピーへの変更にすぎず、配列内の元データは変わりません。配列内の要素そのものを更新したい場合は、Get(a ref)で参照を取り出して書き換えるか、「Set Array Elem」ノードで該当インデックスに値を入れ直す必要があります。

一方、アクターなどのオブジェクト参照の配列では事情が少し異なります。オブジェクト参照型では、コピーされるのは「参照(ポインタ)」であり、指し示すアクターの実体は同じです。そのため、コピーで取得したアクターに対して「Set」系のノードでプロパティを変更すれば、その変更は実体に反映されます。なお、オブジェクト参照の配列ではGet(a ref)を選んでも、内部的にGet(a copy)として扱われる場合があります。「参照(ref)か値(copy)か」の区別が本質的に効くのは、主に構造体のように値型として扱われるデータだと理解しておくとよいでしょう。

ForEachLoopとの関係

配列のすべての要素を順番に処理したい場合は、インデックスを1つずつ指定するより「ForEachLoop」ノードを使うのが定石です。ForEachLoopは配列をつなぐだけで、内部で先頭(インデックス0)から末尾(Last Index)まで自動的に回り、各回の「Array Element」(現在の要素)と「Array Index」(現在のインデックス)を出力します。

配列 ──> [ForEachLoop]

     ├─ Loop Body ─> Array Element(その回の要素)/ Array Index(その回の番号)

     └─ Completed ─> ループ終了後の処理

ForEachLoopは範囲を自動管理するため、手動Getのような範囲外アクセスの心配がありません。「全要素を処理したい」ならForEachLoop、「特定の1件だけを取りたい」ならインデックス指定のGet、と使い分けるのが基本です。ただしForEachLoopが各回で渡すのは要素のコピーに相当するため、ループ内で配列の中身を直接書き換えたい場合は、ForEachLoopの「Array Index」を使ってGet(a ref)や「Set Array Elem」を組み合わせます。なお、ループ中に配列へ要素を追加・削除すると挙動が不安定になることがあるため、避けるのが無難です。

つまずきやすい落とし穴

落とし穴原因と対策
範囲外アクセスで予期せぬ結果・クラッシュ指定インデックスがLength以上、または負の値になっている。Getで既定値(null等)が返り、その先で参照してクラッシュすることも。Is Valid IndexやLengthとの比較で事前にチェックする。
「N番目」とインデックスを取り違えるインデックスは0始まり。先頭は0、末尾はLength-1。「3番目」が欲しいときに指定するのは「2」。
空の配列にアクセスしてしまう要素が0個の配列ではどんなインデックスも無効(Last Indexは-1)。アクセス前にLengthが0でないか確認する。
コピーを書き換えても元配列が変わらない構造体配列でGet(a copy)の結果を変更しても元には反映されない。Get(a ref)または「Set Array Elem」を使う。

よくある質問(FAQ)

Q1. 配列の最後の要素を取りたいときは、どう指定すればよいですか?

「Last Index」ノードをGetの「Index」ピンに接続するのが確実です。Last Indexは「Length - 1」を返すため、要素を追加・削除して長さが変わっても、常に末尾を指せます。自分で「Length」から1を引いて指定することもできますが、空の配列ではLast Indexが-1になり範囲外となる点に注意してください。

Q2. Getノードを使ったのにクラッシュしました。Getは落ちないのではないですか?

Getノード自体は、エディタ上では範囲外でも警告ログと既定値の返却で済むことが一般的です。クラッシュの多くは、返ってきたnull(None)のオブジェクトをその後のノードで参照したときに発生します。つまり原因はGetではなく、その先の処理です。Is Valid Indexでの範囲チェックに加え、「Is Valid」ノードで取得した参照がnullでないかも確認すると安全です。

Q3. 配列の中の構造体メンバーだけを書き換えたいのですが、変更が反映されません。

Get(a copy)で取り出した構造体はコピーのため、メンバーを変更しても元の配列には反映されません。Get(a ref)で参照を取得して書き換えるか、変更後の構造体を「Set Array Elem」ノードで同じインデックスにセットし直してください。どちらの方法でも、対象インデックスが有効範囲内であることを事前に確認しておくと安心です。

まとめ

UE5のブループリントで配列から指定インデックスの要素を取得するには、配列変数から「Get」ノードを引き出し、「Index」ピンに0始まりの番号を指定します。有効な範囲は0からLength-1(Last Index)までで、範囲外を指定すると警告とともに既定値が返り、その値を参照すると別の箇所でクラッシュする恐れがあります。「Is Valid Index」やLengthとの比較で事前にチェックすること、用途に応じてGet(a copy)とGet(a ref)を使い分けること、全要素処理にはForEachLoopを使うこと、この3点を押さえれば、配列を安全かつ柔軟に扱えるようになります。