レベルアップ!

備忘録として綴ります。

UE4の配列が思ってたのと違った

ここ最近UE4を触っているのですが、配列で躓いたので備忘録として綴ります。

UE4に限らず知識も浅く勉強がてら記事にしていますので、おかしいところあればご指摘頂けると欣喜雀躍です。

 

DirectXやUnityでゲームを作ったことはあったのと、UE4C++ベースなので配列も同じような感じでいけるっしょと思ってたけど意外と違いました。思考が違ったので変なところに躓きました。

分かりやすいよう整数型配列を用意するとします。

 

C++の場合

ぱっと思い浮かんだものは

int hoge;

int* hoge;

std::vector<int> hoge;

std::list<int> hoge;

また調べていて見つけたものは

std::array<int> hoge;

std::deque<int> hoge;

arrayやdequeはこの記事を書かなければ知らなかったです。何て便利な配列なんだ…。それぞれの機能やら意味やらは今回の記事と趣旨が異なるので書きません。

 

C#の場合

C#と言ってもUnityで触ったことのある配列です。

int hoge;

Array<int> hoge;

List<int> hoge;

Arrayは知ってはいましたが基本Listばかり使っていました。もっと色々考えて適切な宣言しないといけないんですよね、ゴメンナサイ。

プログラム初めて一年も経っていない時にXNAでゲームを作ったことがありますが、その時はListなどは知らなかったので只管にint[] hoge;のやり方でやってました。

 

UnrealC++

UEで使うC++のことをUnrealC++と呼ぶと解釈してます。これで合ってるのかな。

TArray<int> hoge;

何とこれだけらしい。一種類しかないのは、他の配列と比較しなくていいとポジティブにとらえるべきなのかどうなのか…。

 

UnrealC++の配列、ここが違った!

ここ数日無駄に悩んだ部分だけ載せました。

尚、TArray(UnrealC++)とList(C#)はstd::vectorと近いということなので、この三つで比較していきます。

 

素数の取得

C++             std::vector.size();

C#               List.Count;

UnrealC++ TArray.Num();

何が分からなかったって、TArray.Max()の存在ですよ。最初これかと思いました。Num()は現在の要素数、Max()は確保された要素数という違いがあるんですね。どうりで数が合わないと思ったんですよ!

Max()はstd::vectorだとcapacity()、C#だとCapacity(実は存在知らなかったです…)

 

配列が空かどうか(bool)

C++             std::vector.empty();

C#               

UnrealC++

書いていないんじゃないんです。C#もUnrealC++も空かどうかの取得関数が無いみたいです。

CountやNum()で返って来た値が0かどうかで判断するしかなさそうです。

 

全ての要素を削除する

C++            std::vector.clear();

C#              List.Clear();

UnrealC++ TArray.Empty();

Emptyまさかのここで登場。C++C#もclearなのに…UnrealC++…ここでEmptyとは…。

 

 

 

UnrealC++の配列TArray。リファレンス見た感じだとC++C#の両方を兼ね備えた便利配列っぽいです。

TArrayの存在を知って三日目でこの記事を書いていますが、関数を理解できれば効率の良い処理ができるんだろうなと思います。

「UEはC++ベースだしC++調べれば作れる」と思ってましたが、UnrealC++を理解しないといけないのですね。

 

 

参考

C++ std::vector

vector - cpprefjp C++日本語リファレンス

C++ 動的配列クラス std::vector 入門

C# List

List(T) クラス (System.Collections.Generic)

C# 動的配列 List 入門

UnrealC++ TArray

TArray | Unreal Engine

[UE4] TArrayについて|株式会社ヒストリア