Hero background image

プログラミング経験がある方の Unity でのスクリプティング

Unity を初めて使用するプログラマー向け

Unity では、スクリプトを使用してゲームやその他リアルタイムインタラクティブコンテンツのほとんどの部分を開発できます。Unity では C# でのスクリプティングに対応しており、Unity で C# スクリプトを設計する方法は主に 2 つです。1 つは、最も幅広く採用されている従来型のオブジェクト指向設計です。もう 1 つはデータ指向設計で、Unity では特定のユースケースにおいて、高パフォーマンスでマルチスレッドに対応した新しい Data-Oriented Technology Stack(DOTS)を介して設計できるようになりました。

C++ での開発経験があり Unity を使い始めた方

Unity は業界標準の言語である C# をサポートしています。C# は Java や C++ と似ているところがあります。

C++ と比べて、C# は簡単に習得できます。また、C# は「マネージド言語」、つまり、メモリの割り当てと割り当て解除やメモリリークの解消などのメモリ管理を自動的に行ってくれます。

一般に、先にゲームを制作してから、後でプログラミングの高度な側面を扱う場合は、C++ よりも C# が推奨されます。

Unity のゲームオブジェクトとコンポーネント
Unity のゲームオブジェクトとコンポーネント

Unity で開発されたすべてのゲームプレイとインタラクション機能は、次の 3 つの基本的な構成要素に基づいて構築されています。ゲームオブジェクト、コンポーネント、変数。

ゲームのあらゆるオブジェクトは、ゲームオブジェクトから始まります。キャラクター、ライト、特殊効果、小道具など、ゲーム内のすべてのオブジェクトはゲームオブジェクトです。

コンポーネント
ゲームオブジェクトはそれ単独では何もできません。実際に何か意味のあるものにするには、ゲームオブジェクトにプロパティーを指定する必要があります。そのためには、コンポーネントを追加します。

コンポーネントは、それがアタッチされているゲームオブジェクトの動作を定義して制御します。簡単な例として、ライトの作成が挙げられます。ライトを作成する際には、ゲームオブジェクトに Light コンポーネントをアタッチします(以下参照)。また、Rigidbody コンポーネントを追加すると、オブジェクトが落下するようになります。

コンポーネントには、Unity エディターのインスペクター ウィンドウやスクリプトを介して調整できる、 編集可能なプロパティまたは変数がいくつもあります。上記の例では、ライトのプロパティーとして範囲、色、輝度があります。

Unity でのコンポーネントのスクリプティング
DOTS で構築された『Megacity』のデモ
DOTS によるデータ指向設計の利点

従来のゲームオブジェクトとコンポーネントの概念は、プログラマーでもプログラマー以外でも理解しやすく、直感的な UI を簡単に作ることができるため、引き続きうまく機能します。ゲームオブジェクトに Rigidbody コンポーネントを追加するとオブジェクトが落下するようになり、Light コンポーネントを追加すると光が放出されるようになります。他にもいろいろなことができます。

ただし、コンポーネントシステムはオブジェクト指向フレームワークをベースに設計されており、開発者にとって進化し続けるハードウェアのキャッシュやメモリを管理するうえで課題が生じます。

コンポーネントもゲームオブジェクトも、「重い C++」オブジェクトです。すべてのゲームオブジェクトには名前があります。それらのコンポーネントは、C++ コンポーネントをベースとする C# ラッパーです。これにより取り扱いが簡単になりますが、最終的に構造化されていない方法で格納されてしまう可能性があるため、パフォーマンスが犠牲になることがあります。その C# オブジェクトは、メモリ内であればどこでも存在する可能性があります。また、C++ オブジェクトもメモリ内であればどこでも存在する可能性があります。連続したメモリ領域でグループ化されていません。処理のために CPU で読み込まれるたびに、すべてを複数の場所からフェッチする必要があります。低速で非効率になる可能性があるため、ワークアラウンドのためにさまざまな最適化を必要とします。

これらのパフォーマンスの問題に対処するために、私たちは高パフォーマンスでマルチスレッドに対応した Data-Oriented Technology Stack(DOTS)(現在プレビュー中)により、Unity のコア基盤を再構築しています。

DOTS により、最新のマルチコアプロセッサーをゲームに効率的かつフルに活用できます。次の機能で構成されています。

DOTS における新しいコンポーネントシステムは ECS です。従来のオブジェクト指向においてゲームオブジェクトでやっていたことを、この新しいシステムではエンティティを使用して行いいます。コンポーネントは引き続きコンポーネントと呼びます。最大の違いはデータレイアウトにあります。詳細については、ブログ記事「DOTS について:エンティティコンポーネントシステム」。

DOTS で構築された『Megacity』のデモ
最新ハードウェアを最大限活用する

ECS の使用は、設計の面からより優れたゲームプログラミングへのアプローチとなる以外に、Unity の C# Job System と Burst コンパイラーを生かす理想的な立場に置かれるため、最新のハードウェアを最大限に活用することができます。

DOTS のマルチスレッドシステムを使用すると、さまざまなハードウェアで実行されるゲームを作成できます。また、これまでより多くの要素やより複雑なシミュレーションを導入して、さらに素晴らしいゲームの世界を構築できます。代わりに、高性能なコードによってプレイヤーのモバイルデバイスの温度コントロールとバッテリ寿命を最適化できます。オブジェクト指向のアプローチからデータ指向の設計に移行することで、コードを再利用したり、他の人がコードを理解して変更を加えたりすることが簡単になります。

DOTS の一部のテクノロジはプレビュー中であるため、開発者の方には、プロジェクト全体を構築するためではなく、プロジェクト内のパフォーマンスに関連する具体的な課題を解決するために DOTS を使用することをお勧めします。このページ下部の「その他のリソース」セクションから DOTS の主なリソースにアクセスできます。

パフォーマンスを最適化するための Unity プロファイラ―
Unity でのデバッグ

Unity では、コードを 1 行も書くことなく、その場で変更を加えられるように、開発者のプレイ中にすべてのゲームプレイ変数がただちに表示されるため、調整とデバッグを効率的に行えます。ゲームを任意のタイミングで一時停止することも、コードを 1 行ずつステップ実行することもできます。

Unity での最適化についてより詳しく学べる便利なリソースをいくつか紹介します。

Profiler

Profiler Analyzer

Memory Profiler

Unity における最適化

グラフィックパフォーマンスの最適化

一般的なベストプラクティス(Unity の UI システムの最適化に関する幅広いヒントを含む)

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 用にビルドするときに唯一利用できるスクリプティングバックエンドであることに注意してください。

エディターの拡張による Unity のカスタマイズ

その他のリソース

ゲームを DOTS に変換する
ゲームを DOTS に変換する
DOTS で構築された『Megacity』のデモ
DOTS に関するドキュメント
Unity 開発プラットフォームに含まれるツールとサービス
Unity のリアルタイム 3D プラットフォームの概要