こんにちは。プログラマーのKです。
最近はUnreal Engine 4(以下UE4)を使用して、AIキャラクターの開発を行っています。UE4はEpic Games様より開発されたゲームエンジンです。国内のゲームタイトルでもエンジンにUE4を採用しているタイトルも多く、トイロジックでもいくつかのタイトルでUE4を利用して開発を行っています。今回は、UEでAIの開発をするうえでのTipsや有用な機能について、いくつか簡単にご紹介していきます。
※エンジンのバージョンによっては内容が異なる可能性があります。ご了承ください。
デバッグ機能
デバッグ機能はゲーム開発においてとても重要です。UE4はデバッグツールが非常に充実していますので、素早くバグを追跡できるようにぜひ活用していきましょう。今回はAI系で特に利用する VisualLogger についてご紹介します。
VisualLogger
AI系のバグは発生条件が複雑だったり、再現も難しく、テキスト出力だけでは追跡が困難…といった場面が多いと思います。VisualLoggerは、ゲーム中のログやデバッグ形状等を記録し、エディタ内でビジュアライズができるツールです。
ビジュアル ロガー | Unreal Engine ドキュメント
タイムライン上から1フレームごとのログ、パラメータのスナップショット、3D上でのデバッグ形状表示、データのグラフ表示などが可能です。記録したデータは後から読み込み・再生が可能なので、チームメンバーからバグ報告があった場合などにVisualLoggerのデータを一緒に提出してもらう…など、デバッグがよりスムーズに行えるようになります。
また、コンソールコマンドにも対応されています。
ToggleAILogging | 記録開始・停止。ネットワークプレイの場合はServerRPCを呼びだし、サーバー上で記録してくれます。 |
vislog | [ビジュアルロガー] ウィンドウを開く |
vislog record | 記録を開始 |
vislog stop | 記録を停止 |
vislog disableallbut <category> | 単一のカテゴリに制限する |
ビヘイビアツリーノードのインスタンス
UE4ではビヘイビアツリーアセットがエンジン機能に組み込まれていますが、メモリ使用量の削減、CPU パフォーマンスの向上といった観点から、同じビヘイビア ツリーを使用するすべてのエージェント内で、ノードのインスタンスのセットが共有される仕組みになっています。このため、ノードクラス内にエージェント固有のデータをメンバ変数などで直接保存できません。固有データを保存する必要がある場合は、以下の3種類の方法が用意されています。
1.ノードをインスタンス化する
- ノード内のbCreateNodeInstance 変数をtrueにすれば、各エージェントごとに一意のインスタンスが割り当てられるようになります。ただし、パフォーマンスとメモリ使用量が犠牲になります。BluePrintのノードクラスはこちらの機能が使用されています。
2.ブラックボードに格納する
- 変数をブラックボードに格納しておき、ノードの初期化時に取得・設定します。
3.ノードのメモリ内にカスタム構造体またはクラスを作成する
- エージェントに割り当てられたメモリのブロック内に格納する方法です。UBTTask_MoveTo など、エンジン側でこちらを使用しているクラスも多くあります。ただし、このメモリはガベージコレクションで認識されないため、UPROPERTYが利用できないという制約があります。カスタム構造体内でUObjectポインタを保持したい場合は、TWeakObjectPtrを利用するようにしましょう。
- ゲームの内容によりますが、AIで動作するキャラクターはゲーム中にたくさん出現する場合が多いと思います。プログラマはパフォーマンス・メモリ使用量には常に気を配れるようにしましょう。
最後に
いかがだったでしょうか。UE4は非常にパワフルなゲームエンジンですので、ぜひ使いこなして面白いゲームを制作していきましょう。
プログラマは最新の技術やゲームの特性に合った技術など、常に技術力を磨き続けることが重要です。
トイロジックでは、日々情報交換や社内勉強会などを通して、技術の共有を活発に行っています。
一緒にスキルアップを目指したい!新しい技術に挑戦したい!という皆さまのエントリーをお待ちしています。