ページの作成
親となるページを選択してください。
親ページに紐づくページを子ページといいます。
例: 親=スポーツ, 子1=サッカー, 子2=野球
子ページを親ページとして更に子ページを作成することも可能です。
例: 親=サッカー, 子=サッカーのルール
親ページはいつでも変更することが可能なのでとりあえず作ってみましょう!
Unreal Engine 5(UE5)のブループリントで配列から指定インデックスの要素を取得するには、配列変数から「Get」ノードを引き出し、その「Index」ピンに取り出したい位置の番号を入力します。インデックスは0から始まるため、先頭の要素は「0」、2番目は「1」と数えます。この基本さえ押さえれば、スポーン地点やターゲットのリストなど、複数のデータをまとめた配列から目的の1件を確実に取り出せます。本記事では、Getノードの使い方、Lengthによる範囲確認、範囲外アクセス時の挙動と対策、Get(a ref)とGet(a copy)の違いまでを順に解説します。
| この記事の要点 |
|---|
|
配列とインデックスの基本
配列(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 |
| 先頭のインデックス | 常に0 | 0 |
| 末尾のインデックス(Last Index) | Length - 1 | 4 |
| 有効なインデックスの範囲 | 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点を押さえれば、配列を安全かつ柔軟に扱えるようになります。
ページの作成
親となるページを選択してください。
親ページに紐づくページを子ページといいます。
例: 親=スポーツ, 子1=サッカー, 子2=野球
子ページを親ページとして更に子ページを作成することも可能です。
例: 親=サッカー, 子=サッカーのルール
親ページはいつでも変更することが可能なのでとりあえず作ってみましょう!
子ページはありません
人気ページ
- 1 Eclipseで「サーバーに追加または除去できるリソースがありません。」の原因と対処法
- 2 tomcat の起動 / 停止ログと catalina.log・catalina.out の違い
- 3 JavaScript base URL 取得方法|window.location.origin と SSR/Node.js 対応
- 4 YouTube Data API v3 エラー一覧|403/400/404 の主要原因と切り分け
- 5 Spring Frameworkのアノテーション一覧
- 6 Laravel エラー一覧|500/Blade/DB 接続/ルーティングの代表エラー
- 7 3Dグラフィックスとは|モデリング/レンダリング/主要ソフトウェア (Blender / Maya)
- 8 【Spring】@Valueアノテーションとは
- 9 CATALINA_HOME の確認方法 (Linux / Mac)
- 10 【Spring】@Autowiredアノテーションとは
最近更新/作成されたページ
- IPv6とは|128bitアドレス・コロン16進表記/::省略・リンクローカル・SLAAC・デュアルスタック NEW 2026-06-22 12:34:44
- VPNとは|暗号トンネル・サイト間/リモートアクセス・IPsec/SSL-VPN/WireGuardを解説 NEW 2026-06-22 12:19:10
- MAC アドレスフィルタリングの仕組みと限界 | ネットワーク入門 NEW 2026-06-22 12:19:10
- gRPC とは HTTP/2 + Protocol Buffers の高速 RPC | ネットワーク入門 NEW 2026-06-22 12:17:25
- HTTP/3 (QUIC) とは UDP ベースの低遅延 Web 通信 | ネットワーク入門 NEW 2026-06-22 12:17:25
- HTTP/2 とは 多重化・HPACK・バイナリフレーム | ネットワーク入門 NEW 2026-06-22 12:17:25
- Web通信プロトコル入門 HTTP/2・HTTP/3・WebSocket・gRPC・WebRTC | ネットワーク入門 NEW 2026-06-22 12:17:25
- WebSocket とは 全二重リアルタイム通信 ws/wss | ネットワーク入門 NEW 2026-06-22 12:17:25
- WebRTC とは ブラウザ間 P2P の音声・映像・データ通信 | ネットワーク入門 NEW 2026-06-22 12:17:25
- ファイアウォールとは|パケットフィルタ・ステートフル・DMZ・次世代FW(L4/L7)を解説 NEW 2026-06-22 12:17:24
- iptables/nftablesとは|テーブル・チェーン・ルール例・永続化をLinux視点で解説 NEW 2026-06-22 12:17:24
- HAProxy とは frontend/backend と設定例 | ネットワーク入門 NEW 2026-06-22 12:17:24
- 証明書と認証局(CA)とは|X.509・信頼チェーン・DV/OV/EV・失効(CRL/OCSP)を解説 NEW 2026-06-22 12:17:24
- CDN とは エッジキャッシュ・TTL・Cloudflare/CloudFront | ネットワーク入門 NEW 2026-06-22 12:17:24
- TLS/SSLの仕組み|ハンドシェイク・暗号スイート・前方秘匿性・証明書検証をわかりやすく解説 NEW 2026-06-22 12:17:24
コメントを削除してもよろしいでしょうか?