Unity を初めて使用するプログラマー向け
Unity では、スクリプトを使用してゲームやその他リアルタイムインタラクティブコンテンツのほとんどの部分を開発できます。Unity では C# でのスクリプティングに対応しており、Unity で C# スクリプトを設計する方法は主に 2 つです。1 つは、最も幅広く採用されている従来型のオブジェクト指向設計です。もう 1 つはデータ指向設計で、Unity では特定のユースケースにおいて、高パフォーマンスでマルチスレッドに対応した新しい Data-Oriented Technology Stack(DOTS)を介して設計できるようになりました。
Unity は業界標準の言語である C# をサポートしています。C# は Java や C++ と似ているところがあります。
C++ と比べて、C# は簡単に習得できます。また、C# は「マネージド言語」、つまり、メモリの割り当てと割り当て解除やメモリリークの解消などのメモリ管理を自動的に行ってくれます。
一般に、先にゲームを制作してから、後でプログラミングの高度な側面を扱う場合は、C++ よりも C# が推奨されます。
Unity で開発されたすべてのゲームプレイとインタラクション機能は、次の 3 つの基本的な構成要素に基づいて構築されています。ゲームオブジェクト、コンポーネント、変数。
ゲームのあらゆるオブジェクトは、ゲームオブジェクトから始まります。キャラクター、ライト、特殊効果、小道具など、ゲーム内のすべてのオブジェクトはゲームオブジェクトです。
コンポーネント
ゲームオブジェクトはそれ単独では何もできません。実際に何か意味のあるものにするには、ゲームオブジェクトにプロパティーを指定する必要があります。そのためには、コンポーネントを追加します。
コンポーネントには、Unity エディターのインスペクター ウィンドウやスクリプトを介して調整できる、 編集可能なプロパティまたは変数がいくつもあります。上記の例では、ライトのプロパティーとして範囲、色、輝度があります。
Unity の組み込みのコンポーネントは非常に汎用的ですが、独自のゲームプレイロジックを実装するには、組み込みのコンポーネントが提供するものだけでは物足りないことに気付きます。これを行うには、スクリプトを使用して独自のゲームロジックと動作を実装し、その後それらのスクリプトをコンポーネントとしてゲームオブジェクトに追加します。各スクリプトは、組み込みのクラスから派生する MonoBehaviour と呼ばれるクラスを実装することで、Unity の内部の動作と結び付けます。
スクリプトコンポーネントを使うと、ゲームイベントのトリガー、衝突のチェック、物理演算の適用、ユーザー入力への反応など、非常に多くの事柄を実行できます。詳細については、Unity のスクリプティング API を参照してください。
従来のゲームオブジェクトとコンポーネントの概念は、プログラマーでもプログラマー以外でも理解しやすく、直感的な UI を簡単に作ることができるため、引き続きうまく機能します。ゲームオブジェクトに Rigidbody コンポーネントを追加するとオブジェクトが落下するようになり、Light コンポーネントを追加すると光が放出されるようになります。他にもいろいろなことができます。
ただし、コンポーネントシステムはオブジェクト指向フレームワークをベースに設計されており、開発者にとって進化し続けるハードウェアのキャッシュやメモリを管理するうえで課題が生じます。
コンポーネントもゲームオブジェクトも、「重い C++」オブジェクトです。すべてのゲームオブジェクトには名前があります。それらのコンポーネントは、C++ コンポーネントをベースとする C# ラッパーです。これにより取り扱いが簡単になりますが、最終的に構造化されていない方法で格納されてしまう可能性があるため、パフォーマンスが犠牲になることがあります。その C# オブジェクトは、メモリ内であればどこでも存在する可能性があります。また、C++ オブジェクトもメモリ内であればどこでも存在する可能性があります。連続したメモリ領域でグループ化されていません。処理のために CPU で読み込まれるたびに、すべてを複数の場所からフェッチする必要があります。低速で非効率になる可能性があるため、ワークアラウンドのためにさまざまな最適化を必要とします。
DOTS により、最新のマルチコアプロセッサーをゲームに効率的かつフルに活用できます。次の機能で構成されています。
- マルチスレッドコードを効率的に実行する C# Job System。
- 高パフォーマンスのコードをデフォルトで記述する Entity Component System(ECS)。
- 高度に最適化されたネイティブコードを生成する Burst コンパイラー。
DOTS における新しいコンポーネントシステムは ECS です。従来のオブジェクト指向においてゲームオブジェクトでやっていたことを、この新しいシステムではエンティティを使用して行いいます。コンポーネントは引き続きコンポーネントと呼びます。最大の違いはデータレイアウトにあります。詳細については、ブログ記事「DOTS について:エンティティコンポーネントシステム」。
ECS の使用は、設計の面からより優れたゲームプログラミングへのアプローチとなる以外に、Unity の C# Job System と Burst コンパイラーを生かす理想的な立場に置かれるため、最新のハードウェアを最大限に活用することができます。
DOTS のマルチスレッドシステムを使用すると、さまざまなハードウェアで実行されるゲームを作成できます。また、これまでより多くの要素やより複雑なシミュレーションを導入して、さらに素晴らしいゲームの世界を構築できます。代わりに、高性能なコードによってプレイヤーのモバイルデバイスの温度コントロールとバッテリ寿命を最適化できます。オブジェクト指向のアプローチからデータ指向の設計に移行することで、コードを再利用したり、他の人がコードを理解して変更を加えたりすることが簡単になります。
DOTS の一部のテクノロジはプレビュー中であるため、開発者の方には、プロジェクト全体を構築するためではなく、プロジェクト内のパフォーマンスに関連する具体的な課題を解決するために DOTS を使用することをお勧めします。このページ下部の「その他のリソース」セクションから DOTS の主なリソースにアクセスできます。
Unity では、コードを 1 行も書くことなく、その場で変更を加えられるように、開発者のプレイ中にすべてのゲームプレイ変数がただちに表示されるため、調整とデバッグを効率的に行えます。ゲームを任意のタイミングで一時停止することも、コードを 1 行ずつステップ実行することもできます。
Unity での最適化についてより詳しく学べる便利なリソースをいくつか紹介します。
収益.NET:Unity では、スクリプティングのために、C# をネイティブでサポートする標準的な Mono ランタイムを実装しています。Unity では現在、macOS については MonoDevelop-Unity の代わりに Visual Studio for Mac を配布しています。Windows 版の Unity では、Visual Studio を配布しています。
Unity の .NET 4.6 スクリプティングランタイムでは、C# 6.0 以降で利用できる、数多くのエキサイティングな C# の新機能とデバッグ機能がサポートされています。また、C# の新機能に伴い、素晴らしい C# IDE 体験が得られます。
IL2CPP:IL2CPP:Unity が開発したスクリプティングバックエンドで、一部のプラットフォームのプロジェクトを作成するときに、Mono の代わりに使用できます。IL2CPP を使ってプロジェクトを作成する場合、Unity は選択したプラットフォームのネイティブバイナリファイル(.exe、apk、.xap など)を作成する前に、スクリプトからの IL コードを変換し、C++ コードに組み立てます。
IL2CPP は、iOS と WebGL 用にビルドするときに唯一利用できるスクリプティングバックエンドであることに注意してください。