目次
※この記事で使用しているUnrealのVersionは04.26.0です。
※この記事のサンプルプロジェクトは以下URLにアップされています。
今回は、Unrealの連想配列(Map)と集合(Set)についてのお話です。
その前に前置き。
Blueprintの配列(Array)について レベル【★★】
みなさんブループリントで「配列(Array)」は使ったことあるでしょうか?
配列とは、簡単に言うと同じ型の変数を任意の数格納しておける箱のようなものです。
例えば数字を保持する「Integer」という型のArrayですが、通常の場合は保持できる数字の数は1つになります。
ですが、配列になると、同じIntegerをいくつも保持することができます。
作成する際は、変数の型を指定するプルダウンの横のマークをクリックして、上から2個目の四角がいっぱいあるマークを選択します。
この配列の要素を取り出す際は、「Get」関数にて「Index」という0から始まる自然数を指定することで、そのIndexに対応した要素を取り出すことができます。
余談ですが、配列ってなんで「0」から始まるんでしょうね?
それは、配列が割り当てられた変数のアドレスの開始位置からの距離によって取得するかららしいですよ。
↓みたいなイメージ。
その他、要素を追加、削除したり順番を入れ替えたり、要素を上から処理していく「For」文を使えたりなどいろいろありますが、今回は配列はメインでないので飛ばします(以下に配列系のノードが乗ってます)
とりあえず前置きはこれぐらいで、次はメインとなるMap(連想配列)とSet(集合)についてです。
連想配列(Map)型について レベル【★★】
まずは連想配列(Map)についてです。
非プログラマの人はもしかしたら、この連想配列を使ったことがないって人が多いのかなって思います。
通常の配列は、必ず「Index」という添え数字が要素ごとについていましたが、連想配列はそのIndex部分を任意の型にすることができます。
この時配列でいうIndex部分の事を「Key」、要素の事を「Value」と言います。
公式の説明:
作成する際は、変数の型を指定するプルダウンの横のマークをクリックして、一番下の四角のマークを選択します。
すると、型を選択するプルダウンが1つ増えるので、KeyとValueのそれぞれの型を設定します。
以下は簡単な用途例になります。
Keyに「String」Valueに「Integer」を選択しています。
要素を取り出す際は、Map変数に対して「Find」という関数をつなげてあげます。
こうすることで、文字と数字のセットを簡単に取り扱うこともできます。
ちなみにこの処理のイメージはエクセルで言えば「VLOOKUP」関数みたいなものです。
一つ注意なのは、「Key」の要素は全く同じ要素を複数持ったりできません。
↑の例でいうなら、「キンアジ」という要素を2つ以上追加はできません
使いどころがわからない…と思うかもしれませんが意外と便利なので是非活用してほしいところです。
以下使用例のイメージ(お魚の値段を瞬時に調べる)
ちなみに「DataTable」も連想配列になっています(Keyが「Name」でValueが指定した構造体の型のMap)
また、配列であるような「Add,Find,Contains,Clear,Length,Remove」はMapにもあります。
そして、MapのKeyとValueは、「Keys」と「Values」という関数でそれぞれを分けて配列にすることも可能です。
次に集合についてのお話です。
集合(Set)について レベル【★★】
集合とは、配列と連想配列を足して2で割ったようなものです。
というのは、連想配列の「Key」部分のみのような変数の事を「集合」と言います。
公式の説明:
作成する際は、変数の型を指定するプルダウンの横のマークをクリックして、下から2番目の中括弧のマークを選択します。
選択すると、配列と同じように要素を追加していくことができます。
さて、配列と何が違うの?というところですが、基本的には、集合はその中にある特定の要素を取り出して扱う、というような使い方はしません(Blueprintではできません)
どういうことかというと、イメージとしては以下のような感じになります。
特定の要素を取り出すノードはありませんが、それ以外は配列でできるようなことが一通りできます。
Set特有の機能として、「Intersection,Difference,Union」という関数があります。
Intersection:2つのSet引数で共通するもののみが入ったSetを返す。
Difference:引数1と引数2で共通しない要素で引数1の中にあるものを返す。
Union:2つのSetの中身を合わせたSetを返す(ユニークな要素は一つ)
ちなみにSetノードのままだと、中の要素を取り出すことはできないので、要素を取り出したい場合は「ToArray」ノードで配列に変換します。
ぶっちゃけて言えば集合でできることは配列でもできます。
じゃあ何のために存在しているのかというと、公式の説明にはこうあります。
TSet
は、順序が重要ではないユニークな要素を格納する高速のコンテナクラスです
どういうこと?となるかもしれませんが、要は順番を気にしないでそのグループの中にあるかないかを判定する場合は扱いやすいし処理が速いよってことです。
じゃあどんな時使うの?っていうので一つ思いついたツールが「アセットの参照リストの作成」です。
アセットの依存関係を取得していくのにSetは割と便利だと思います。
以下Blueprintの処理(Editor Utility Widgetで作成)
GetAllDependenciesの中身
GetAllReferencersの中身
こんな感じでうまく使えば、集合も割と便利な型なんです!
皆さんも連想配列や集合を是非使ってみてください!!
ちなみに…
オンラインゲームなどで使う「Remote Procedure Call」でカスタムイベントなどで引数に連想配列や集合を使うことはできません(配列は使うことができます)
使おうとすると、
LogProperty: Error: Replicated TSets are not supported.
LogProperty: Error: Replicated TMaps are not supported.
と、SetやMapはサポートしてないよっていうログが表示されて、イベントを受け取った側の引数部分には空っぽの要素が返ってきます。
また、変数の型をMapやSetにした場合に「Replicated」や「RepNotify」などの設定にはできません。
Remote Procedure Callを行う場合は配列で行う必要があります。
以上!
※この記事のサンプルプロジェクトは以下URLにアップされています。