パブリッシュ

ゲーム開発中には、現状でスタンドアロンやウェブプレーヤー上でどのように動作するのか一旦ビルドしてみて確認したくなることがあるでしょう。
このセクションではビルド設定へのアクセスのしかたと、各種ビルドの作成のしかたについて解説します。

メニューの FileBuild Settings... を選択すると、ビルド設定のウィンドウが開きます。
ビルドの際に含めるシーンの編集リストがポップアップ表示されます。

ビルド設定ウィンドウ

初期状態では、このウィンドウには何も表示されておらず空欄になっています。
このリストが空欄のままゲームをビルドすると、そのとき開いていたシーンだけがビルドされます。
テスト用にそのシーンだけをビルドしたいのであれば、シーンリストは空欄のままビルドするとよいでしょう。

複数のシーンを含んだビルドを作るのも簡単です。
シーン追加の方法は 2 つ。
まず「Add Current」というボタンを押して、現在開いているシーンをリストに追加します。
それ以外はプロジェクトビューからドラッグしてきてリストに入れます。

シーンのインデックス値を見ると、それぞれ違った値になっているのが確認できるでしょうか。
Scene 0 となっているものが、ビルドしたゲームを起動したときに最初にロードされるシーンです。
新しいシーンをロードしたい場合は、スクリプト中でApplication.LoadLevel()を使用してください。

複数のシーンファイルがある場合、リスト上でドラッグしてシーンを上下に移動し、好きな順序に並び替えることが可能です。

リストからシーンを削除するには、そのシーンをクリックし、ハイライトされた状態で Delete キーを押してください。
シーンがリストから消えてビルドされなくなります。

ビルドをパブリッシュする準備が整ったら、次はプラットフォームの選択です。
プラットフォームの横に Unity のロゴがあることを確認してください。
無い場合は「Switch Platform」のボタンを押して、どのプラットフォーム用にビルドするのかを設定します。
完了したら「Build」のボタンを押しましょう。
通常の保存ダイアログで、保存先と名称の設定をしてください。
保存ボタンを押せば Unity がたちまちゲームをビルドします。
簡単ですね。
ゲームをどこに保存したらいいか決めかねる場合は、プロジェクトのルートフォルダーにするといいでしょう。
アセットフォルダーには保存できません。

「Development Build」のチェックボックスをオンにすると、プロファイラーの機能が有効になり、合わせて「Autoconnect Profiler」と「ScriptDebugging」のオプションも利用可能となります。

デスクトップ

ウェブプレーヤーのストリーミングとは

ストリーミング化したウェブプレーヤーでは、ゲームのシーン 0 のロード完了と同時にゲームプレイを開始することが可能となります。
たとえば 10 個レベルがあったとして、すぐに使用しない 2 ~ 10 レベルのアセットが全部ロードされるまでプレイヤーを待たせることには意味がありません。
ストリーミングウェブプレーヤーでパブリッシュした場合、必要なアセットのダウンロードはシーンファイルの使用順に応じて行われます。
シーン 0 に必要なアセットが全てダウンロード完了した時点で、ウェブプレーヤーでプレイ開始となります。

簡単に言えば、ストリーミングウェブプレーヤーでこれまで以上に迅速にゲームを開始できる、ということです。

次のレベルがロードされる前にデータの転送が完了しているかどうか、ということだけは注意しておきましょう。

ストリーミングしないプレーヤーの場合では、レベルのロードは以下のようなコードとなります。

Application.LoadLevel("levelName");

ストリーミングするウェブプレーヤーでは、まずレベルで必要になるデータの転送が完了していることを確認する必要があります。
確認には CanStreamedLevelBeLoaded() の関数を使用します。
以下を参考にしてください。

var levelToLoad = 1;
function LoadNewLevel () {
  if (Application.CanStreamedLevelBeLoaded (levelToLoad)) {
    Application.LoadLevel (levelToLoad);
  }
}

レベルの転送状況をローディングバーなどでプレイヤーに見せたい場合には、 GetStreamProgressForLevel() で進行状況を取得することができます。

ウェブプレーヤーのオフライン対応

ウェブプレーヤーの「Offline Deployment」のオプションをオンにすると、UnityObject.js というファイル (ホストページとの連動に使用) がビルドと共に配置され、ネットワーク接続が無い場合にもローカルスクリプトファイルでの動作が可能となります。UnityObject.js は通常、Unity のウェブサーバーから最新のバージョンがダウンロードされます。

スタンドアロンプレーヤーをビルドする

Unity はスタンドアロンのアプリケーションを Windows と Mac (Intel、PowerPC、Universal) 向けにビルドすることができます。
ビルドの設定のダイアログで用途を選び、「Build」のボタンを押すだけの簡単操作です。
スタンドアロンのプレーヤーをビルドした場合、対象によってファイル構成が異なります。
Windows 用の場合は実行可能ファイル (.exe) とアプリケーションのリソース入りデータフォルダーが。
Mac 用の場合は、アプリケーションの動作に必要なファイルやリソースが、アプリケーションバンドルとして生成されます。

Mac 向けのスタンドアロンを配布するには、アプリケーションバンドルを提供します (バンドルの中にすべて含まれています)。
Windows 向けは .exe ファイルとデータフォルダーがセットで必要となります。
言うなれば、他の人も同じファイルを持っているだろうから、ゲームの動作に必要なファイルだけを Unity がビルドした結果そうなった、ということになります。

ビルドの内部工程について

ビルドプロセスではまず、指定された場所にゲームアプリケーションの空のコピーを置きます。
次にビルド設定にあるシーンリストを順にたどりながら、エディターで一旦ひとつずつ開き、最適化し、アプリケーションパッケージとして統合していきます。
そして、シーンごとに必要なアセットを算出し、パッケージにそれぞれ格納していくわけです。

シーンにあるゲームオブジェクトで「EditorOnly」のタグがついたものは、パブリッシュされるビルドの中には含まれません。
最終版に含める必要のないデバッグ用スクリプトなどに有用です。
新しいレベルのロード時には、前のレベルのオブジェクトはすべて破棄されます。
これを回避するには DontDestroyOnLoad() を破棄したくないオブジェクトに使用します。
これの最も一般的な使用用途は、音楽をレベルロード中に流しておく場合や、ゲームの進行状況やステータスを保持するゲームコントローラースクリプトです。
新しいレベルのロードが完了したら、OnLevelWasLoaded() がすべてのアクティブなゲームオブジェクトにメッセージとして送信されます。

iOS

iOS 用ビルドの内部工程について

iPhone/iPad 用のアプリケーションビルド工程には 2 ステップあります。

  1. 必要なライブラリ、プリコンパイルされた .NET コード、シリアル化されたアセットなどと共に XCode プロジェクトが生成される
  2. XCode プロジェクトがビルドされ、実際のデバイス上に配置される

ビルド設定のダイアログで「Build」のボタンが押されたときには、最初のステップだけ実行されます。
「Build and Run」のボタンを押すと両方のステップが実行されます。
プロジェクト保存ダイアログで指定する際に既に存在するフォルダーを選択した場合には、アラートが表示されます。
これに対して現在は 2 種類の XCode プロジェクト生成モードから選択できます。

Replace 指定先のフォルダーの中身をすべて取り除いて新しいコンテンツが生成されます。
Append プロジェクトのルートフォルダーと「Data」「Libraries」の中身が一掃され、
新しく生成したデータが入ります。

XCode プロジェクトファイルは Unity で施した最新の変更に合わせて更新されます。
XCode プロジェクトの「Classes」サブフォルダーが、カスタムのネイティブコードを格納するのに安全な場所かもしれません。
ですが、定期的なバックアップは忘れずに。
Append モードは、同じバージョンの Unity iOS で生成された、既に存在する XCode プロジェクトのみをサポートしています。
Cmd+B を使用した場合は、自動的に「Build and Run」が実行され、その際には最後に使用したフォルダーがビルドの指定先となります。
この場合にはデフォルトで Append モードになっています。

Android

Android 用のアプリケーションビルド工程には 2 ステップあります。

  1. アプリケーションパッケージ (.apk ファイル) が、必要なライブラリとシリアル化されたアセットと共に生成される
  2. アプリケーションパッケージが実際のデバイス上に配置される

ビルド設定のダイアログで「Build」のボタンが押されたときには、最初のステップだけ実行されます。
「Build and Run」のボタンを押すと両方のステップが実行されます。
Cmd+B を使用した場合は、自動的に「Build and Run」が実行され、その際には最後に使用したフォルダーがビルドの指定先となります。

初めて Android のプロジェクトをビルドする際には、Android アプリケーションのビルドとインストールに必要となりますので、Android SDK の場所を Unity に指定してください。
あとから変更する場合にはプリファレンスから設定できます。

Android に向けてアプリをビルドする場合には、そのデバイスの設定で「USB Debugging」と「Allow mock locations」がチェックされていることを確認してください。

OS からデバイスが認識できているかどうかは、Android SDK/platform-tools というフォルダーにある adb devices というコマンドを走らせることで確認できます。
Mac と Windows 両方で使用できるでしょう。

Unity はアプリケーションアーカイブ (.apk ファイル) をビルドして、それを接続デバイスにインストールします。
iPhone のようにアプリケーションがオートスタートしない場合には、スクリーンをアンロックする必要があるかもしれませんし、さらに稀なケースではインストールしたアプリケーションをメニューから自分で探す必要があるかもしれません。

テクスチャーの圧縮について

ビルド設定には Texture Compression/テクスチャーの圧縮 という項目があります。
Unity の初期設定では、特に指定が無い場合ETC1/RGBA16 というテクスチャーフォーマットが使用されます。
テクスチャーフォーマットのオーバーライドについてはテクスチャー 2D / プラットフォームごとのオーバーライドを参照してください。

特定のハードウェアアーキテクチャを対象とするアプリケーションアーカイブ ( .apk ファイル) をビルドする場合、テクスチャーの圧縮オプションを使ってデフォルト設定をオーバーライドすることができます。
圧縮しないよう指定したテクスチャーはどれもそのままで、圧縮フォーマットを使用しているテクスチャーだけが、オプション内で指定されたフォーマットで圧縮されます。

そのテクスチャー圧縮をサポートしているデバイスのみにデプロイが限定されるよう、Unity が所定フォーマットのタグを含めるように AndroidManifest を編集します。
こうすることで Android Market のフィルターメカニズムが、適切なグラフィックハードウェアを持つデバイスだけにアプリケーションを提供できるようになります。

プリローディング

パブリッシュしたビルドは、シーンをロードする際に自動的にシーン内のアセットをプリロード/先行読み込みします。
ただし、シーン 0 は例外です。
最初のシーンは通常スプラッシュスクリーンなどで、極力迅速に表示するべきだからです。

コンテンツがすべてプリロードされたことを確認するためには、空のシーンを用意して Application.LoadLevel(1) を呼び出します。
そしてビルド設定でこの空のシーンを index 0 に設定すれば、それ以降の全てのレベルがプリロードされるようになります。

ビルドの準備ができました

これまでに Unity のインターフェースを学び、アセットの使い方を学び、シーンの作成方法を学び、ビルドのパブリッシュの仕方を学んできました。
夢のゲームを作ろうとするあなたを止めるものは、もう何もありません。
そしてその道のりでは、よりたくさんのことを学ぶことになるでしょう。
わたしたちもお手伝いさせていただきます。

Unity の使い方ついて詳しく知りたい場合は、このままマニュアルを読み進む か、チュートリアルに進んでください。

コンポーネントやゲーム動作の要点についてもっと知りたい場合はコンポーネントリファレンスを読んでください。

スクリプトについて学ぶにはスクリプトリファレンスをどうぞ。

アートアセットについて知りたい場合は、マニュアルのアセットのセクションをご覧ください。

Unity のユーザーや開発者のコミュニティと交流がしたい方は、Unity フォーラムにお越しください。
質問したり、プロジェクトを共有したり、チームを結成したりと、何でもアリです。
ぜひ一度はフォーラムに顔を出して、わたしたちにあなたの作った素晴らしいゲームを見せてくださいね。