ブループリントの基本的な構成要素⑧ 配列

ビデオの内容紹介 
ビデオの前半では、ブループリントで配列 (Array) とはどのようなものであるかを説明しています。後半では実際に配列を作ったり、配列を出力する関数を使ってみます。

原題 Blueprint Essentials – 8 – Arrays

ブループリントの配列とは (0:04)

まとめ 
① 配列とは、1 つの変数というよりも、リストのようなもの。

② 配列には、同じ型の値を入れなければならない。

③ 配列は動的である。

④ 配列にはインデックス (添字) があり、0 から始まる。

メモ 
上記のことを補足します。(丸数字は対応します)
① a という配列変数があるとします。a には複数のデータを入れることができます。それらの複数のデータには番号を付けます (これは④のことです)。このことを模式的に表すと次のようになります。








変数名インデックスデータ
a060
a184
a271
a396
a454



なぜ配列が便利かを考えてみます。データはテストの成績で、これらの合計点を求めてみる場合を考えてみます。まず、配列変数を使用しないと次のようになります。








変数名データ
a60
b84
c71
d96
e54



言葉で表すと、「a と b と c と d と e に入っている値をすべて足せ」となります。

ところが配列変数の方は、「a の 0 から 4 までに入っている値をすべて足せ」となります。

大して違わないじゃないか、と思われるかもしれませんが、データの数が30 個くらいになると、「a と b と c と d と e と f と g と h と i と j と (以下略)」のようにものすごく手間がかかります。しかも変数名はこのような 1 文字ではないのが普通です。

ところが配列変数の方は、「a の 0 から 29 までに入っている値をすべて足せ」という実に単純な形式で命令できます。つまり配列は数字とともにデータを扱うことができるため、番号の始まりと終わりを指定するだけで (あるいは特定の番号を指定するだけで) 一気にデータにアクセスできるのです。

数字 (インデックス) でアクセスできるということは、そのインデックス自体を演算的に操作して配列をものすごく便利に使うことも可能となります。

② 同じ型とは、たとえば int (整数) 型なら int 型だけ。string (文字列) 型なら string 型しか値として要素に入れることができないということです。int 型の値と string 型の値を混ぜて 1 つの配列に入れることはできません。

③ 配列の要素数を増やしたり減らしたりできます (後で実験してみます)。配列が動的ではないコンピュータ言語の場合は、配列の要素数を宣言した後に「気軽に」増やしたり減らしたりはできません。

④ 先の②で触れたとおりです。上記例の配列は 0 から始まって 4 までなので、配列の長さは 5 です (要素数が 5 )。このあたりが混同しやすいので注意したいところです。

配列変数を作る方法 (2:57)
スロー 
Event Graph を開く → +Variable → 変数に名前をつける (ビデオでは MyStringArray) → Valuable Type から変数の種類を選択 (string) → Valuable Type の右側にあるグリッドのアイコンをクリック (これによって配列となる) → コンパイル → Default Value で + マークをクリックしながら配列のエントリを増やしていく (適当な文字列を入力していく)

メモ 
配列となった変数は、その先頭にグリッドのアイコンが付きます。

配列の特定のエントリをゲーム中に表示させる方法 (4:12)
スロー 
上で作った配列変数をマイブループリントから Event Graph 内にドラッグアンドドロップして Get (取得) を選択 → 「デフォルト」をクリック → Input/Auto Receive Input が Player0 になっていることを確認 → Event Graph に戻る → Key Event F を設置 → f Print String を設置 → F の Pressed ピンと f Print String の exec ピンをつなぐ → 配列変数からワイヤをドラッグしてリリース → Actions taking a(n) array [string] が表示されるのでそこから Call Function/Utilities/Array とたどって Get を選択 → 配列変数と Get をつなぐ → Get の中の index (四角の中) に表示したい文字が入っているインデックスを指定する (ビデオでは 3 ) → Get と f Print String をつなぐ → コンパイル

no insertion

メモ 
① このグラフの意味をまとめておきます。M のキー (ビデオでは F) を押すと f Print String が発動し、そのために (その瞬間に) My String Array の 3 番目の要素が Get されて In String のピンに供給されます。(この辺りの実行の順番については前回の 「ブループリントの基本的な構成要素⑦ ブループリントの実行順序」を参照してください。

② f Print String は右クリックメニューの検索欄で log と入力すると一発で選択状態になります。

③ Actions taking a(n) array [string] (配列または文字列を使うアクション) で、f の色が青の場合は、配列そのものに変化を加えますが、緑の場合は、配列自体に影響はありません。

④ 配列変数と f Print String を直接接続していない理由は、配列変数が要素の集合であるため、どの要素を print すべきか指定してやらなければならないからです。

配列を出力する関数の例 (8:17)
ここでは、スタティックメッシュを複数個レベルに配置して、それらを一括して呼び出して操作することを例にしています。

スロー 
コンテンツブラウザの Game/Props から SM_MatPreviewMesh_02 をレベルにドラッグアンドドロップ → 複写して全部で 6 個にする → これらすべてを選択状態にして、詳細パネル/Transform/可動性で「ムーバブル」を選択 → MyCharacter の EventGraph で Key Event F を設置 → f Get All Actors of Class (クラスの全てのアクタを取得する) を設置 → Key Event F の Pressed ピンから f Get All Actors of Class の実行ピンにつなげる → f Get All Actors of Class の Actor Class の下で StaticMeshActor を選択する → f Add Actor LocalRotation (アクタのローカル座標回転を加える) を設置→ f Get All Actors of Class の右側実行ピンから f Add Actor LocalRotation につなげる → さらに f Get All Actors of Class の Out Actors から f Add Actor LocalRotation の Target につなぐ → f Random Rotator を設置して、その Return Value から f Add Actor LocalRotation の Daita Rotation (差分の回転) につなぐ → コンパイル

random rotation

メモ 
①メッシュを宙に浮かせて実行すると回転していることがよく分かります。

②このグラフの意味をまとめておきます。
F キーを押すと f Get All Actors of Class が発動して、指定したクラス (StaticMeshActor) のアクタすべてを取得します。それが配列に入れられて出力します (Out Actors にグリッドが付いていることからも分かります)。それが f Add Actor LocalRotation の対象 (Target) になっています (回転を足す対象になっています)。どのくらいの回転量 (差分) を足すかは、f Random Rotator によってランダムに決定されます。それが f Add Actor LocalRotation に供給されて実際のアクタの回転に加わります。

③ビデオでは、f Get All Actors of Class の Out Actors からあえてワイヤをスペースにドラッグアンドドロップして、「Actions taking a(n) array[object Actor]」を表示させて、Out Actors から出るものが配列であることを示しています。

配列に要素を挿入する方法

Insertion

メモ 
上記の意味を記しておきます。

L キーを押すと、Insert 関数が発動するため、それにつながっている My Insertion という string 型変数 (配列ではない。値は peach) から値が供給されます。

Insert 関数では My String Array が挿入の対象となっています。また 緑のピンの横の四角には 2 が入っています。これは、My String Array のうちインデックスが 2 の要素に挿入せよという意味です。

Insert 関数の右側の実行ピンから伸びているワイヤによって f Print String が発動します。そのため In String につながっている一連の My String Array → Get が実行されて値が供給されます。この場合は、Get に 2 が入っているので、My String Array のインデックス 2 の要素に入っている文字列が表示されることになります。

もともと My String Array のインデックス 2 の要素には Kiwi が入っていたのですが、そこには peach が挿入されたため、表示されるのは peach となります。

このようにコンパイル後にも配列のサイズを変えることができるので、ブループリントの配列は動的配列と言えます。(なお、L を押すたびに挿入されていくので配列のサイズはどんどん増えていきます。)

今回はこれでお終いです。お疲れさまでした!



About なつのや

アンリアル・エンジン 4 を基礎から勉強するためのサイト「UE4 の学び部屋」を開いています。どうぞよろしくお願いいたします。
ブループリント

2 responses to ブループリントの基本的な構成要素⑧ 配列


  1. HAL

    以前からBP動画は眺めていたのですが、結構理解していない部分があって非常に助かりました。
    今回からBluePrintがクリックして拡大できるようになって小さいモニタモニタでも非常に見やすくなりました。感謝です!!

    • なつのや

      貴重なコメントをいただきまして、ありがとうございます。すごく嬉しいです。

      他のページも画像を拡大できるように順次直していきますね。ご不便おかけしました m(__)m

      今後ともどうぞよろしくお願いいたします!

コメントを残す

メールアドレスが公開されることはありません。

次のHTML タグと属性が使えます: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>