2014年4月4日

知っておくべき UE4 のライブラリ

作成 Billy Bramer

UE4 には、ゲーム開発に使用できる優れた C++ ライブラリが豊富に用意されています。ただし、大規模なコードプロジェクトの場合、いつも簡単に見つかるとは限りません。この記事では、特に便利で確認する価値のあるライブラリをいくつか集めてみたいと思います。詳しい情報については、このページで API ドキュメントの「Core」のセクションを読んでください。

コンテナ

ユーザーの格納に関するニーズに対応するために、UE4 では多様なコンテナ クラスが利用できます。その多くは、従来から C++ の標準ライブラリに入っている基本的な機能に非常に似ています。本当のところは、格納し切れないものがただ 1 つあります。それは、これらクラスに対するあなたの感動です!失礼...。

一般的なコンテナ

TARRAY

(Engine\Source\Runtime\Core\Public\Containers\Array.h)

TArray は、動的サイズのテンプレート配列です。UE4 のコンテナの中で最も一般的に使用されるものです。これには、動的配列や完全な UPROPERTY のサポートに含まれている機能と同じものが含まれています。TArray の API では、TArray をスタック構造またはヒープ構造として扱うことができる追加機能が提供されています。

TArray は UPROPERTY として宣言されているため、エディタ プロパティ ウィンドウで簡単に表示できます。また、ネットワークのレプリケーションや、自動的な UPROPERTY のシリアライゼーションに使用するのに適しています。この機能があるため、TArray は、しばしばゲームプレイのコードを実装する場合に好まれて使われるコンテナとなります。

これまでに C++ STL (標準テンプレートライブラリ) の ベクター クラスを使用した方ならば、TArray はうってつけです。

TSET

(Engine\Source\Runtime\Core\Public\Containers\Set.h)

TSet は、数学的集合概念のテンプレート実装です。Intersect (交わり)、Union (和集合)、Difference (差集合) といった拡張された集合演算を扱うことができます。また、ある要素がある集合に属しているか否かを素早く判定することができます (PeopleWhoLoveTSet.Contains(Me); // 常に真と判定される)。

注意: TSets (および TMaps) は、TArray とは異なり、UPROPERTY として直接サポートされているわけではありません。そのため、自動的なレプリケーションやシリアライゼーションなどはできません。TSet (または TMap) が、ハードな UObject 参照とともに使用される場合 (例: TSet<UObject*>)、ユーザーが、それらの参照をガーベジコレクションのために適切にシリアライズするようにしなければなりません。だれかがゴミを捨てなければならないのです...

TSet は、C++ の STL set クラスと似ています。ただし、UE4 の実装は、ハッシュ法に基づいています。新たな型を作り、それを TSet (または TMap) で使用しなければならない場合は、この型をハッシュする簡単な関数を実装する必要があります。: uint32 GetTypeHash(const YourType& TypeVar) コードベースには豊富な例があるので、確認してみてください。

TMAP

(Engine\Source\Runtime\Core\Public\Containers\Map.h)

TMap は、ある型から別の型へのマッピング (キー値のペア) を可能にするテンプレートデータ構造体です。これには、高速な要素の追加、削除、探索がともないます。他のプログラミング言語を扱ったことがある方ならば、TMap が dictionary として表現する構造体をご存知かもしれません。

TMap は、TSet のように、UPROPERTY として宣言できません。

TMap は、C++ の STL map クラスと似ていますが、UE4 の実装はハッシュ法に基づいています。

イテレータ

UE4 のコンテナにはイテレータがサポートされています。ただし、その使い方は C++ の STL とまったく同じというわけではありません。各コンテナの型にサポートされているイテレータを調べることができます。ただし、たいていは const イテレータと非 const イテレータが利用できます。

例:

// エンジンのソースから直接抜き出した例。:

// 使われている配列 (InPackages) からイテレータを初期化する。

for (TArray<UPackage*>::TConstIterator PkgIter(InPackages); PkgIter; ++PkgIter)

{

// * 演算子を使って、イテレータの現在の位置の要素にアクセスする。

UPackage* CurPackage = *PkgIter;

C++11 のファンなら (そして、怠け者なら)、イテレータに auto キーワードを使用することもできます。

for (auto FileIt = Files.CreateConstIterator(); FileIt; ++FileIt)

{

const FString FileExtension = FPaths::GetExtension(*FileIt);

ソーティング

デフォルトのソーティング オプション以外にも、ソーティングをサポートしている UE4 のコンテナでは、述語オブジェクトを使ったカスタムのソーティングが可能です。

例:

//ソーティングのための述語として機能するために書かれたカスタムの構造体。

// データ構造体 (アニメーション通知イベント) の要素への 2 つの const 参照が与えられ、トリガーの時間にしたがってソートする。

struct FCompareFAnimNotifyEvent

{

FORCEINLINE bool operator()(const FAnimNotifyEvent& A, const FAnimNotifyEvent& B) const

{

return A.GetTriggerTime() < B.GetTriggerTime();

}

};

 

// カスタムの述語を使って通知配列 (TArray<FAnimNotifyEvent>) をソートする。

Notifies.Sort(FCompareFAnimNotifyEvent());

その他のコンテナ

TArray、TSet、それに TMap は、最もよく使用される UE4 のコンテナです。ただし、それだけではありません。これら 3 つのコンテナやその他のコンテナをソースコードで探すには、Engine\Source\Runtime\Core\Public\Containers ディレクトリを調べてみてください。

文字列の操作

(Engine\Source\Runtime\Core\Public\Containers\UnrealString.h)

(Engine\Source\Runtime\Core\Public\UObject\NameTypes.h)

(Engine\Source\Runtime\Core\Public\Internationalization\Text.h)

UE4 では、文字列を操作するための 3 種類のクラス (FString、FName、FText) があります。これらについては、ぜひ知っておくべきです。それぞれのクラスには、それ独自の目的があり、最適な使用方法があります。それらに関しては、こちらのページのドキュメンテーション (およびそのページからリンクされている参考ガイド) に非常に詳しく説明されています。

数学

(Engine\Source\Runtime\Core\Public\Math\UnrealMathUtility.h)

(Engine\Source\Runtime\Core\Public\GenericPlatform\GenericPlatformMath.h)

数学がないゲームとはどのようなものでしょうか?!幸運なことに、UE4 には大変堅牢でクロスプラットフォームな数学ライブラリが備わっています。これらは通常、FMath の中で静的関数として実装されています。FMath には、非常に単純なものから複雑なものまで大量の数学演算が含まれています。数学を扱う前に、すでに作られていて使用できるものを完全に理解するために両方のヘッダファイルに目を通すことは非常に大切です!

最後に

UE4 で知っておくべき重要なライブラリを紹介するこのミニツアーは、お役に立てたでしょうか。でも、まだほんの手始めにすぎません。エンジンは、あらゆる目的に役立つコードが満載されているのですから。

できればこの記事に対する感想を送ってください!大まかすぎるでしょうか?それとも分かりづらかったですか?ジョークが寒かった?質問は?コメントは?UE4 のフォーラムのコミュニティに参加してみませんか?Twitter で @EpicIrascible をフォローして私をどうぞいじめてください。