Unity は完全に自動的なアセットパイプラインを持っています。アセット元となる psd ファイルや fbx ファイルが変更されたら、Unity は変更を検知し、自動的にその部分を再インポートします。ファイルからインポートされたデータはすぐに内部形式に変換され保存されます。
この処理は個人のユーザーに対し、ワークフローをできるだけ効果的で柔軟にするためにデザインされています。ただし、チームで作業をしている場合には、他のユーザーが頻繁にアセットの変更していることがあります。それらもすべてインポートされます。さらに、デスクトップとモバイルのビルドターゲットプラットフォーム間で切り替えをするとき、アセットを再インポートしなければなりません。そのため、そのような変更は大きなプロジェクトでは長時間かかります。
インポートしたアセットデータを キャッシュサーバー にキャッシュすることで、アセットのインポートにかかる時間を著しく縮めることができます。
それぞれのアセットインポートは以下に基づいてキャッシュされます。
以上のどれかが変更された場合、アセットは再インポートされるか、キャッシュサーバーからダウンロードされます。
Preference で キャッシュサーバー (後述の _キャッシュサーバー の設定_ を参照) を有効にすると、複数のプロジェクトにまたがるアセットインポートを行うことも可能です (つまり、インポート作業がコンピューター上で行われ、結果物を他のプロジェクトと共有します)。
いったんキャッシュサーバーを設定すると、この過程はすべて自動的になり、追加のワークフローはありません。何ら手間を必要とせずに、インポートするための時間を単純に短縮してくれるでしょう。
キャッシュサーバーを設定する方法がとても簡単になりました。Preferences の Use Cache Server にチェックして、ローカルマシンの Unity Editor にどこに Cache Server があるのかを指定するだけです。
キャッシュサーバーの設定は、Mac OS X で Unity > Preferences 、Windows と Linux では Edit > Preferences で行います。
リモートコンピューターではなく、ローカルコンピューターのキャッシュサーバーをホストするには、 Cache Server Mode を Local に設定します。
このようにすると、ローカルマシンのキャッシュサーバーを簡単に設定できます。ハードドライブのサイズの制限があるため、別のコンピューターにキャッシュサーバーを作ることが推奨されます。
プロパティー | 機能 |
---|---|
Cache Server Mode | 使用したいキャッシュサーバーモードを選択します。この設定によって、キャッシュサーバーの無効化 (Disabled)、リモートサーバーの指定 (Remote)、ローカルコンピューターにキャッシュサーバーを設定 (Local)、のいずれかを行えます。 |
Disabled (デフォルト) | キャッシュサーバーを無効にします。 |
Remote | リモートコンピューターでキャッシュサーバーをホストします。 |
Local | 使用中のコンピューターでローカルにキャッシュサーバーをホストします。 |
IP Address (リモートのみ) |
キャッシュサーバーをホストするリモートマシンの IP アドレスを指定します。 |
Check Connection (リモートのみ) |
このボタンを使ってリモートのキャッシュサーバーに接続します。 |
Maximum Cache Size (GB) (ローカルのみ) |
このコンピューターのストレージのキャッシュサーバーの最大サイズをギガバイトで指定します。最小サイズは 1GB。最大キャッシュサイズは 200GB。デフォルトは 10GB。 |
Custom cache location | チェックすると、キャッシュを保存するディスクの場所を指定します。 |
Check Cache Size (ローカルのみ) |
ローカルのキャッシュサーバーが使用しているストレージサイズを確認するには、このボタンをクリックします。大きなプロジェクトがある場合、この操作は完了するのにいくらか時間がかかる場合があります。操作が終わると “Cache size is unknown” (キャッシュサイズは不明です) というメッセージが、キャッシュサイズの表示に代わります。 |
Clean Cache | キャッシュのコンテンツを削除します。 |
ローカルのキャッシュサーバーがカスタムの場所にあり、その場所が無効になった場合は、Unity は以下の警告を表示します。
Local cache directory does not exist - please check that you can access the cache folder and are able to write to it (ローカルのキャッシュディレクトリが存在しません - キャッシュフォルダーにアクセスし、書き込むことができるかどうかを確認してください)
管理者はキャッシュされたアセットを置いておくための キャッシュサーバー マシンを設定する必要があります。
以下の設定が必要です。
キャッシュサーバー にはとても大きいストレージを持つ信頼できるマシンが必要です(複数のバージョンのインポートされたリソースを保存しておくため、プロジェクトのサイズよりずっと大きい必要があります)。もしハードディスクがいっぱいになると、 キャッシュサーバー のパフォーマンスが遅くなります。
Unity が提供している .sh
や .cmd
のスクリプトはサーバーのサービスとして設定する必要があります。キャッシュサーバーはアトミックなファイル操作を行うため、そうすることで、いつでもキャッシュサーバーは安全に中断や再起動ができます。
デフォルトで 2 種類のキャッシュサーバー処理が開始します。古いキャッシュサーバーは5.0 以前のバージョンの Unity で使用できます。新しいキャッシュサーバーは 5.0 以降の Unity で使用できます。2 種類のキャッシュサーバーの設定、有効化、無効化に関する詳細は後述のキャッシュサーバー設定を参照してください。
スクリプトを実行して Cache Server を起動する方法では、古いキャッシュサーバーはポート 8125 を、そして、新しいキャッシュサーバーではポート 8126 を使って起動します。また、スクリプトと同じディレクトリに “cache” と “cache5.0” が作成され、そこにデータが保存されます。それらのキャッシュディレクトリには、デフォルトで最大 50GB まで保存することができます。このサイズの設定やディレクトリの場所は、以下のコマンドラインで変更することが可能です。
./RunOSX.command --path ~/mycachePath --size 2000000000
または
./RunOSX.command --path ~/mycachePath --port 8199 --nolegacy
以下のコマンドラインオプションを使用して、キャッシュサーバーの設定を行えます。
--port
特定のサーバーポートを使用します。新規でキャッシュサーバーを構築するときのみ使用してください。デフォルトは 8126
です。--path
特定のパスにキャッシュフォルダーを作成します。新キャッシュサーバーを構築するときのみ使用してください。デフォルトは ./cache5.0
です。--legacypath
特定のパスにキャッシュフォルダーを作成します。古いキャッシュサーバーを構築するときのみ使用してください。デフォルトは ./cache
です。--size
キャッシュサーバーでキャッシュできる最大キャッシュサイズを設定します。キャッシュサイズを超えた場合、使用されていないファイルから自動で削除されていきます。--nolegacy
古いキャッシュサーバーを開始しない場合にこのオプションを使用します。古いキャッシュサーバーを使用する場合はポートは 8125
になります。最高のパフォーマンスを得るために、インポートされたプロジェクト全体を網羅できるだけの十分なメモリ容量 (RAM) が必要です。加えて高速なハードディスクと高速なイーサーネット接続があるのがベストでしょう。また、ハードディスクは十分な空き容量が必要です。ただ一方、キャッシュサーバーには CPU パワーはほとんど必要ではありません。
キャッシュサーバーとバージョンコントロールとの主な違いは、キャッシュ化されたデータはいつでもローカルで再ビルドできる、ということです。これは単に、パフォーマンス改善のためのツールということです。この理由で、キャッシュサーバーをインターネットで利用することは意味がありません。分散しているチームならば、それぞれのロケーションでキャッシュサーバーを立てるべきでます。
できれば、Linux か Mac OS X マシンでキャッシュサーバーを走らせるべきです。Windows のファイルシステムはキャッシュサーバーがデータを保存する方法にあまり適しておらず、ファイルロックに関する問題が発生する場合があります。Linux や Mac OS X ではそのようなことがありません。
キャッシュサーバーは自動的に一定周期に使われなくなったアセットを削除します(もちろん再度必要になれば、次に使われる間に再び作られるでしょう)。
キャッシュサーバーはソースバージョンコントロールと切り離してデザインされているので、Unity の Asset Server に制限されることはありません。
Unity は一つのアセットをインポートしようとする際、元となる全てのデータの MD5 ハッシュを生成します。
例えばテクスチャでは、以下のように成り立っています。
もしハッシュがキャッシュサーバーに保存されているものと違っていたら、アセットが再インポートされるか、キャッシュ化されたバージョンがダウンロードされます。クライアント側の Unity エディターは必要な時にサーバーからアセットを持ってくるだけです。つまりアセットは変更のたびにそれぞれのプロジェクトにプッシュされることはありません。
キャッシュサーバーは依存関係を扱いません。Unity のアセットパイプラインは依存関係のコンセプトを処理できません。アセット間の依存を避けるように作られています。 AssetPostprocessor クラスは、アセットインポーターを自分用にカスタマイズする一般的なテクニックです。例えば、決められた名前やタグに基づいて .fbx ファイルのゲームオブジェクトに MeshCollider を追加することも可能です。
AssetPostprocessor
を使って、依存関係を示すことも簡単にできます。例えば、アセットの次に、テキストファイルから得たデータを使って、インポートしたゲームオブジェクトにコンポーネントを追加することも可能です。これはキャッシュサーバーではサポートされません。もしキャッシュサーバーを使いたいなら、プロジェクトフォルダーの他のアセットの依存関係を排除しなければなりません。キャッシュサーバーはポストプロセッサの依存関係について何も検知しないので、変更を検知せず、キャッシュされた古いバージョンのアセットを使用してしまいます。
実践的な話で言えば、キャッシュサーバーと連携して AssetPostprocessor を走らせる方法はたくさんあります。以下を利用します。
既にあるマテリアルを変更すると問題の原因になる場合があります。キャッシュサーバーを使っていると、Unity はマテリアルへの参照が維持されるよう検証します。しかしポストプロセスの呼び出しが発生しないので、キャッシュサーバーを通してモデルがインポートされても、マテリアルのコンテンツは変更されません。そのため、キャッシュサーバーがある場合とない場合とで違う結果を得る場合があります。これを避けるにはディスクに既に存在するマテリアルは絶対に修正しないことです。
サーバーにキャッシュされない種類のアセットはいくつかあります。キャッシングスクリプトによって作られたものは、サーバーでは無視されるので、キャッシュされません。(Maya、3D Max 等の)3D モデリングソフトで使われているネイティブのファイルはそのアプリケーション自体を使って FBX にコンバートされます。現在サーバーでは、ネイティブのファイルとインポートプロセスで生成された FBX ファイルのどちらもキャッシュ化しません。しかし、モデリングソフトから FBX にエクスポートされたファイルを Unity プロジェクトに追加することでキャッシュ化が可能になります。