Open 3D Engine 101 - 主な特徴と始め方

こちらは [AWS & Game Advent Calendar 2022](https://qiita.com/advent-calendar/2022/aws-for-games) の 10 日目の記事です。
今回は 2021 年に発表されていたオープンソースの 3D エンジンである [Open 3D Engine](https://www.o3de.org/) について、その主な特徴と始め方について執筆したいと思います。

# Open 3D Engine(O3DE) とは？
![Open 3D Engine](https://github.com/o3de/artwork/raw/main/o3de/01_O3DE_Color%20Logo%20with%20Wordmark/O3DE%20Color%20Logo.png)
Open 3D Engine（O3DE） は、Apache 2.0 ライセンスとして提供される、オープンソースのマルチプラットフォーム 3D エンジンです。O3DE を活用することで、ゲームやシミュレーションなど 3D 空間上でインタラクティブな体験を提供するプロダクトを開発することができます。オープンソースであるため無料で利用できます。

AWS では従来 Amazon Lumberyard というクロスプラットフォーム 3D ゲームエンジンを提供していましたが、Open 3D Engine はその後継に相当する 3D エンジンになります。Amazon Lumberyard の最も多く気に入れられていた機能以外は大幅に刷新され、新しいプレハブシステム、新しいビルドシステム、拡張可能な UI、多くの新しいクラウド機能、数式ライブラリの最適化、新しいネットワーク機能、その他パフォーマンスに関する多くの改善が施されています。

O3DE は、2021年7月にその立ち上げ組織である [Open 3D Foundation](https://o3d.foundation/) とともに発表され、Developer Preview として利用が開始されていました。この Developer Preview 以降で、幅広い業界から 250 人以上の開発者が 2,182 件以上のプルリクエストと 1,801 件の問題に貢献されました。そうした Open 3D Foundation とそのコミュニティメンバーの支援によって、最初の安定版 “O3DE Stable 21.11” が、re:Invent 2021 の際にリリースされました[^1]。

本記事の執筆時点（2022.12.10）では、Version 22.10.0 が最新バージョンとなっており、プロジェクトテンプレートの生成や O3DE プロジェクトの URL 共有機能の追加によりチームメンバーの立ち上げおよびコラボレーションを行いやすくなった点や、マルチプレイ機能の開発におけるクライアント・サーバー間の通信、デバッグ、ネットワーク生成の処理の改善などが施されています[^2]。

[^1]:https://www.o3de.org/blog/posts/o3de-2111-announcement/
[^2]:https://www.o3de.org/blog/posts/o3de-22-10-release/ 

# O3DE の主要な理念: モジュール性
O3DE は主要な理念として、モジュール性が意識されたエンジンである点が挙げられます。

O3DE では、ツールや機能を提供するソースコードとアセットが入ったパッケージを **Gems** と呼んでおり、この Gems が O3DE を実現している構成要素となっています。
プロジェクトを開発する際に、その成果物に必要な Gems を取り込むことだけで、求めている特徴や機能を追加することができます。不要な Gems を取り外すことも可能なため、プロジェクトに使用しないアセットやライブラリを提供する Gems を外すことで、プロジェクトファイルおよび成果物の軽量化が期待できます。

Gem の例としては、マテリアルやテクスチャ、モデルなどのアセットから、後述する **Atom Renderer** や **Script Canvas** といった開発ツール、AI や Physics などランタイムシステムに関わる機能が挙げられ、エンジンのあらゆる構成要素を担っています。

Gems は O3DE に標準で備わっている Gems 以外にも、チームや他の O3DE ユーザーが独自に開発し共有された Gems を自身の O3DE に取り込むことができます。また、自身で開発した Gems を他の O3DE ユーザーに共有することも可能です。全ての Gems はモジュール性を担保しているが故に Gems 単体で機能が完結するため、開発中のプロジェクトファイルへの影響を抑えながら、Gems によって提供される様々な機能を試すことができます。
なお、一部の必要不可欠なコアシステムを実現する Gem は **O3DE Core (LmbrCentral) Gem** と呼ばれており、この Gem は全ての O3DE プロジェクトで必要な Gem になります。その他の Gem は既存の Gem の拡張されたものとなります。

このように、O3DE は自身の構成要素である Gems によってモジュール性が意識されたエンジンであるといえます。

# O3DE の主な機能
O3DE には 3D プロダクトを開発するための多くの機能が備わっていますが、ここではそのいくつかを取り上げたいと思います。
ここで紹介する機能についても、前述した Gems によって提供されている機能になります。

## Open 3D Engine Editor
![O3DEEditor.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/911060/5f22dad9-46da-9528-a241-7ddf367efcc3.png)
O3DE で開発をする際に使用する主要なワークスペースです。この Editor を通じて各種ツールを使用しプロジェクトの設計や構築を進めます。
搭載されているツールとしては例えば、構築中のレベルやエンティティをすぐに確認できる **3D Viewport**、現在のレベルに存在しているエンティティの一覧を表示する **Entity Outliner**、各エンティティにアタッチされているコンポーネントを確認する **Entity Inspector**、編集中やプロジェクトの実行中に出力されるログを確認する **Console** などがあります。
過去に他のゲームエンジンや 3D アニメーションソフトの利用経験がある方は、直感的にイメージがつきやすいツールとなっていると思います。

## Gems
![O3DEGems.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/911060/67c0099b-e20f-580a-76e8-9cf808e1de5c.png)
前述の通り、Gems は O3DE の主要な理念であるモジュール性を実現しているパッケージです。プロジェクト毎に必要な Gems を追加したり、不要な Gems を外すことができます。

### [AWS Gems](https://www.o3de.org/docs/user-guide/gems/reference/aws/)
Gems の中には、AWS サービスを使用して O3DE の機能を拡張できる AWS Gems が提供されています。AWS Gems は [AWS Cloud Development Kit(CDK)](https://aws.amazon.com/jp/cdk/) を使用しており、各 Gem 毎にその機能を提供するための AWS リソースを定義している CDK アプリケーションが含まれています。
執筆時点では、下記 4 種類の AWS Gems が提供されています。

- [AWS Core](https://www.o3de.org/docs/user-guide/gems/reference/aws/aws-core/)
    - 認証情報管理、リソース共有、AWS サービスへの呼び出し処理など、他の全ての AWS Gems に共通のメカニズムと基本的な設定を提供します。また、O3DE から AWS SDK for C++ が 利用できる拡張も含んでいます。
- [AWS Client Auth](https://www.o3de.org/docs/user-guide/gems/reference/aws/aws-client-auth/)
    - 認証ユーザーもしくはゲストユーザーに対し、O3DE 製のクライアントから AWS サービスへのアクセスを許可する仕組みを提供します。AWS リソースとして [Amazon Cognito](https://aws.amazon.com/jp/cognito/) が使用されます。
- [AWS GameLift](https://www.o3de.org/docs/user-guide/gems/reference/aws/aws-gamelift/)
    - 専用ゲームサーバーをホスティングするマネージドサービス [Amazon GameLift](https://aws.amazon.com/jp/gamelift/) と統合し、O3DE に元々備わっているネットワーキングレイヤーの機能を拡張して、GameLift を活用したマルチプレイヤーゲームを実現するフレームワークを提供します。
- [AWS Metrics](https://www.o3de.org/docs/user-guide/gems/reference/aws/aws-metrics/)
    - AWS の分析ソリューションである[ゲーム分析パイプライン](https://aws.amazon.com/jp/solutions/implementations/game-analytics-pipeline/)を構築し、O3DE 製のクライアントから必要なメトリクスをリアルタイムに AWS バックエンドに送信する仕組みを提供します。

## Atom Renderer
![image](https://www.o3de.org/images/atom-guide/intro-to-atom.jpg)
Atom Renderer は O3DE に組み込まれている独自のレンダリングエンジンです。
Forward+[^3] や Deferred Rendering[^4] といった最新のレンダリングパイプラインのサポート、DX12 や Metal, Vulkan などの業界標準の低レベル 3D Graphics API に直接触れずラッピングされた高レベルな API の提供による機能追加のしやすさやカスタマイズ性の向上、マルチスレッドサポートによる CPU と GPU の両方で並行して実行される高パフォーマンスなレンダリング処理、といった特徴があります。

Atom Renderer そのものも Gems によってモジュール性が意識された設計となっており、かつほぼ全ての機能と構成が JSON ファイルで定義および管理される、いわゆるデータ駆動型の設計にもなっています。そのため、レンダラーの構築や改良に対しても、複雑なソースコードの改変無しに特定のコンポーネントやアセットの一部プロパティを修正するのみで済み、コンパイル時間の短縮にもつながります。

[^3]:https://www.gdcvault.com/play/1016435/Forward-Rendering-Pipeline-for-Modern
[^4]:https://ja.wikipedia.org/wiki/%E9%81%85%E5%BB%B6%E3%82%B7%E3%82%A7%E3%83%BC%E3%83%87%E3%82%A3%E3%83%B3%E3%82%B0

## Script Canvas
![O3DEScriptCanvas.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/911060/f3474263-d05b-57f2-66b0-b3708c51c838.png)
O3DE ではアプリケーションロジックの実装として C++ および Lua の利用が可能ですが、これらのプログラミング言語を使用せずに、ロジックを視覚的に実装することができるようになるのが、この Script Canvas です。
コーディングの知識を要せずに、画面に表示させているボタンを押下した際の処理、ユーザーからの入力に対してエンティティを移動させる処理、エンティティ間が衝突した際の処理、といったイベント駆動型のロジックを、ノードと呼ばれる関数に近い処理単位をキャンバス上に設置し、そのノード間を線で繋いでいく流れでシンプルに実現できます。

# O3DE を触ってみたいと感じた方へ
ここまで本記事をお読みいただきありがとうございます。
O3DE を試しに触ってみたいと感じていただけた方へ、最後に私からおすすめの始め方をお話しさせてください。

これはあくまで私の個人的な見解になるのですが、3D エンジンの操作方法や挙動を学ぶには、**球体を転がすゲームを試しに作ってみる**のがうってつけだと強く感じています。
ドキュメントを熟読し理解を深めることも重要な一方で、せっかくゲームが開発できるソフトウェアなので、まずはゲームを試作し、その過程でエディターの操作方法やエンティティの配置、ユーザー入力の受け付け方法や受け取った後のロジックの実装などを、手を動かして具体的に学んでみようとします。そうすることで、ゲームの開発の過程そのものを楽しみつつモチベーションを維持しながら学ぶことができるからです。また、球体は転がしやすいオブジェクトなので、エンジン上で物理的な力を加えたり物体同士を衝突させたりするオブジェクトとして扱いやすく、ゲームの中でインタラクティブ性を高めてくれる要素になり楽しさにつながると考えています。

## おすすめのチュートリアル: Pong Game
O3DE では球体を転がすゲームとして "Pong Game" を開発するチュートリアルが公開されています。
まずはお手元の Windows PC に O3DE をインストールし、"Pong Game" の開発に取り組んでみることが、O3DE の始め方として最適です。

Windows におけるインストール方法は下記の動画で解説されています。公式サイトから、インストールを実行する exe ファイルをダウンロードして実行し、表示されるウィザード画面の指示に従う流れとなります。

https://www.youtube.com/watch?v=_BhkXOBDYGA

O3DE チュートリアル "Pong Game" の解説は、下記のドキュメントに記載されています。章ごとに 10 分前後の動画が設置されているので、それを視聴しながら開発を進めていきます。過去に 3D エンジンを使用したことのない方でも、英語ですが字幕表示ができ、操作方法も含め丁寧に解説されているので、動画を止めながらじっくり学習できます。

https://www.o3de.org/docs/learning-guide/tutorials/first-project/

## O3DE に対応するプラットフォーム
執筆時点では、O3DE でゲームやシミュレーションを開発可能なプラットフォームとして、Windows と Linux に対応しています。macOS については Experimental Stage となっています。

O3DE から出力した成果物が実行可能なプラットフォームとして、Windows, Linux, Android に対応しています。macOS および iOS については Experimental Stage となっています。

詳細は下記リンクからご参照ください。

https://www.o3de.org/docs/welcome-guide/supported-platforms/

また、開発を行うマシンのシステム要件については下記リンクからご参照ください。

https://www.o3de.org/docs/welcome-guide/requirements/

# まとめ
O3DE について主な特徴と始め方について執筆しました。本記事が O3DE を試しに触ってみたいと感じるきっかけとなりましたら幸いです。
来年は O3DE が備える各機能に深掘りした記事の執筆に挑戦したいと思います。


(免責) 本記事の内容はあくまでも個人の意見であり、所属する企業や団体とは関係がございません。