最終更新:2020 年 1 月(読み終わるまでの時間:10 分)

Unity を使用したコンソールビデオゲームの開発に関するヒント

What you will get from this page: Tips for setting up your development environment to make games for PlayStation, Microsoft Xbox One, and Nintendo Switch. 

Indie teams developing with Unity are behind some of today’s most popular console games. Read on to learn how to set up your development environment, profile and optimize performance, organize and debug your game content, and more.

デスクトップの Xbox コントローラー

プラットフォームホルダーに登録する

コンソールゲームを開発するには、プラットフォームホルダーに開発者として登録する必要があります。Microsoft Xbox OnePlaystationNintendo Switch に登録する方法については、各リンクをクリックして確認してください。

各コンソールごとの提出要件は、登録後にすぐ確認することができます。ゲームの導入を開始する前に目を通し、制作全体にわたって心がけるようにしてください。 

プラットフォームによっては、さまざまなサービスでホワイトリストに登録されたり、ドメイン名や会社を登録したりするのに、静的 IP アドレスが必要になる場合があります。繰り返しになり、恐れ入りますが各種要件を必ず確認するようにしてください。   

Microsoft、Sony、任天堂においては、秘密保持契約に署名するには登録開発者であることが求められることに注意してください。

開発環境をセットアップする

Unity のバージョン
Unity の各バージョンは、特定のバージョンのコンソール SDK と互換性があります。コンソール SDK は、登録後にプラットフォームホルダーからダウンロードできます。プラットフォームホルダーではコンソール SDK を定期的にアップグレードしています。Unity ではそれに合わせて、最新の SDK との互換性を保持するために、現行のバージョンの Unity(LTS バージョンを含む)をすべてアップグレードしています。とはいえ、お使いの Unity のバージョンが対応する SDK のバージョンとペアリングされていることを確認することが重要です。 

登録してコンソール SDK をダウンロードしたら、お使いの現行のバージョンの Unity を使用して、コンソールゲームの開発を開始できます。ただし、提出の準備をするときは、関連する LTS ブランチに移行することを強くお勧めします。これが最も安定したバージョンであり、重要なバグ修正や SDK のアップグレードが含まれているからです。 

その他のハードウェア要件
Visual Studio がインストールされた Windows 10 PC が必要です。Mac OS や Linux での開発はサポートされません。 

Unity の拡張機能
Unity エディターには各コンソール用の拡張機能が用意されているので、シーンを構築して開発キットにゲームをデプロイする方法を Unity に指示することができます。モバイルゲームを構築したことがある方であれば、このワークフローにはなじみがあるのではないでしょうか。

プロジェクトをコンソールのハードウェアで実行する
Unity エディター上でゲームを実行することは、実際のコンソールのハードウェアで実行することと同じではありません。開発用 PC の仕様はそれぞれのコンソールと異なり、コンソール自体、仕様がそれぞれ独自のものがあります。この仕様の違いとは、クロック速度、セーブ時間とロード時間、利用できる RAM の量などがあります。RAM については、Nintendo Switch は 4GB、PS4 は 8GB、Xbox One X は 12GB です。

Unity では開発全体を通して、頻繁に開発キット上でゲームを実行することを推奨しています。具体的には、利用できる機器のうち、最も低い仕様のものでテストします。つまり、Xbox One X の代わりに Xbox One、PS4 Pro の代わりに PS4、Nintendo Switch の場合はドックモードの代わりに携帯モードでテストしてください。これは、基準となるパフォーマンスを特定し、それに合わせてコンテンツをオーサリングするのに役立ちます。

コンソールゲームの開発-Unity CPU プロファイラー

パフォーマンスのプロファイリングと最適化を行う

これについてはすでにご存じかもしれませんが、念のため…。コンテンツを最適化する前には、常に忘れずプロファイリングをするようにしましょう。コード変更を強いられるような実パフォーマンス上での問題をピンポイントに特定することができるようになります。  

ゲームが 60 fps で動作するには、各フレームが 1/16 秒(約 17 ミリ秒)以内で動作するよう準備しておく必要があります。フレームがそれよりも長くかかる場合、何に縛られているか(フレーム時間を最も押し上げている要素は何か)を見つけ出す必要があります。一般的によく注意すべきな領域は 2 つあり、それは CPU と GPU が該当します。 

CPU に縛りがある場合、その原因はスクリプトコード、ディスクの読み取り、UI レイアウトの再構築のほか、物理演算が関与している可能性もあります。GPU に縛りがある場合、そのボトルネックを引き起こしているのがグラフィックスパイプラインのどの部分であるか(パーティクル、ポストプロセッシングエフェクトなど)を特定する必要があります。

パフォーマンスのプロファイリングは、各プラットフォームプロバイダーによって提供されるプロファイリングツールや Unity の組み込みのツールを使用して行うことができます。 

プラットフォーム固有のプロファイリングツールを使用すると、ハードウェアの詳細を掘り下げることができます。ある特定の時点での各 CPU コアの動作や、GPU が個々のフレームをどのように構築しているかを把握できます。

Unity でのプロファイリング
Unity のプロファイリングツールは、あらゆるコンソールにわたって機能するほか、開発ツール上で実行するゲームにも使用できます。これにより、コンソールビルドのテストとイテレーションが効率的になります。たとえば、CPU プロファイラーをお使いのコンソール開発キットに直接アタッチし、エディター内でやっているのと同じように、フレームを解析して CPU のスパイクを特定できます。 

また、スクリプトで作成されるガベージコレクションの分散の量を確認することもできます。メモリフットプリントを減らし、ガベージコレクターを実行するときの CPU のスパイクを防ぐのに役立つため、分散を追跡することは重要です。 

ディーププロファイリングとプロファイラーマーカー 
ディーププロファイリングではコードの各行を丹念に調べてくれるので、見逃しやすい分散を特定するのに役立ちます。しかし、収集する際に必要となるデータの量によっては低速になってしまうことも多いので、パフォーマンスのスパイクが発生している部分など、分離しているコードの一部の領域のプロファイリングにのみ使用してください。 

ディーププロファイリングではなくとも、効果的な代替案として、カスタム ProfilerMarker があります。操作は簡単で、profiler.beginsample を配置し、サンプリングしてスクリプトコード内の任意の部分(基本的には疑わしいとされる部分)を論理的にグループ化するだけです。さらに、ProfilerMarker をネストすることで、ゲーム内で何が起こっているかについてより詳しく理解することもできます。これは、すべての beginsample と一致する endsample があることを確認するようにするだけで問題ありません。 

こうすることで、使用しているサンプル名が Unity プロファイラーに表示され、そのブロックの正確なタイミングを確認できるほか、その中のあらゆる分散も表示できます。プロファイラーマーカーはリリースビルドのコンパイルからは除外されるため、後で削除する必要はありません。

プラットフォーム固有のネイティブな API にアクセスする

Unity には、お使いの C# スクリプトからプラットフォーム固有のネイティブな API と直接やり取りするプラグインのセットが備わっています。これにより、コンソール固有の機能にサポートを簡単に追加できます。プラグインには独自のドキュメントとソースコードが備わっています。 

たとえば、Xbox One のすべてのゲーマーは、ゲームのアチーブメントを解放したときに表示されるポップアップに見覚えがあります。このポップアップをトリガーし、その表示方法を制御するには、Xbox One または PS4 固有の API を呼び出す必要があります。

これは、お使いの C# スクリプトコードから、ネイティブプラグインを使用して行うことができます。現在アクティブなプレイヤーをしっかりと把握し、ポップアップの配置をカスタマイズする必要があります。1 回のシンプルな呼び出しで、プレイヤーの正しいアチーブメントを解放できます(以下のコード例を参照)。 

さらに、プラグインにはコンソールの機能と Unity の機能の間のインターフェースが備わっています。プラグイン自体はマネージド C# とネイティブ C++ コードの境界に位置し、ネイティブライブラリとマネージドライブラリのペアで提供されます。ライブラリをプロジェクトの Plugins フォルダーにコピーするだけで使用できます。 

Achievements.cs (C#)
CurrentUser = UsersManager.Users[0];

NotificationManager.SetNotificationPositionHint(
UnityPlugin.NotificationPositionHint.BottomRight);

AchievementsManager.UpdateAchievementAsync(
CurrentUser.Id, Current.UID, “2”, 100, UpdateAchievementCallback);

コンテンツとコードを整理する

Organize game content to ensure small install size and efficient patching

Ask yourself these two questions early on to get a head start on organizing your game content efficiently:  

  • What features of your game are platform-specific? These can include texture resolution, iconography and native plug-in libraries. With the latter, you’ll want to ship them on the relevant platforms only, to ensure a reasonable install size.  
  • How will you patch game content? Be prepared to ship bug fixes and additional content to users once your game is live. 

Use Unity Addressables to support dynamic game content 
Asset Bundles were introduced in Unity 4 as a low-level mechanism for building assets into discrete units for dynamic loading at runtime. Asset Bundles enabled developers to separate content from the app install, so they could deliver regular content updates to live apps with a small initial download size, while staying below the over-the-air install limit as additional app content is added.

However, using Asset Bundles in a real production turned out to be cumbersome for many Unity developers. Therefore, in 2019, we introduced the Addressable Asset System (Addressables for short), which provides an easy way to load assets by “address.” It handles asset management overhead by simplifying content pack creation and deployment.

Addressables use asynchronous loading to support loading from any location with any collection of dependencies. Whether you use direct references, traditional asset bundles,or Resource folders for asset management, Addressables provide a simpler way to make your game more dynamic.

Learn more about Addressables from the manual

Prepare for limitations: Only Ahead-of-Time compilation works
Developing console games in Unity requires the IL2CPP scripting back end. With IL2CPP your C# script code is compiled into Intermediate Language code (IL) using Microsoft’s .NET Compiler Platform (Roslyn). Next, Unity’s IL2CPP converter translates the IL output into native C++ code which in turn is compiled, using each console platform’s C++ compiler, into a native library that the Player (the executable that runs on the hardware and runs your game) imports and executes. This execution does not use resources to interpret your code at runtime. It's already compiled, ready for the CPU to execute directly, ensuring the best performance. 

However, the IL2CPP back end comes with a constraint: you can perform only ahead-of-time AOT compilation, as all the code must be compiled and ready at runtime. Certain C# code patterns that rely on just-in-time JIT compilation won’t work. Such code patterns are typically found in places that require runtime code generation, such as in the reflection library, and in the special dynamic type. They might also be used in Asset Store packages, so be sure to check with the publisher if a package has been tested on the relevant consoles before downloading it. 

This constraint can be a challenge for serialization; however, there are AOT-friendly ways for performing serialization.

弊社のウェブサイトは最善のユーザー体験をお届けするためにクッキーを使用しています。詳細については、クッキーポリシーのページをご覧ください。

OK