Version: 2017.1
YAML クラス ID リファレンス
スクリプトでアセットを変更する

キャッシュサーバー

Unity は完全に自動的なアセットパイプラインを持っています。アセット元となる psd ファイルや fbx ファイルが変更されたら、Unity は変更を検知し、自動的にその部分を再インポートします。ファイルからインポートされたデータはすぐに内部形式に変換され保存されます。

この処理は個人のユーザーに対し、ワークフローをできるだけ効果的で柔軟にするためにデザインされています。ただし、チームで作業をしている場合には、他のユーザーが頻繁にアセットの変更していることがあります。それらもすべてインポートされます。さらに、デスクトップとモバイルのビルドターゲットプラットフォーム間で切り替えをするとき、アセットを再インポートしなければなりません。ですから、そのような変更は大きなプロジェクトでは長時間かかります。

インポートしたアセットデータを キャッシュサーバー にキャッシュすることで、アセットのインポートにかかる時間を著しく縮めることができます。

それぞれのアセットインポートは以下に基づいてキャッシュされます。

  • アセットファイルそのもの
  • インポート設定
  • インポートされたアセットのバージョン
  • 現在のプラットフォーム

以上のどれかが変更された場合、アセットは再インポートされるか、キャッシュサーバーからダウンロードされます。

Preference で キャッシュサーバー (後述の _キャッシュサーバー の設定_ を参照) を有効にすると、複数のプロジェクトにまたがるアセットインポートを行うことも可能です (つまり、インポート作業がコンピューター上で行われ、結果物を他のプロジェクトと共有します)。

いったんキャッシュサーバーを設定すると、この過程はすべて自動的になり、追加のワークフローはありません。何ら手間を必要とせずに、インポートするための時間を単純に短縮してくれるでしょう。

キャッシュサーバーの設定 (ユーザー側)

キャッシュサーバーを設定する方法がとても簡単になりました。Preferences の Use Cache Server にチェックして、ローカルマシンの Unity Editor にどこに Cache Server があるのかを指定するだけです。

キャッシュサーバーの設定は、Mac OS X で Unity > Preferences 、Windows と Linux では Edit > Preferences で行います。

リモートコンピューターではなく、ローカルコンピューターのキャッシュサーバーをホストするには、 Cache Server ModeLocal に設定します。

このようにすると、ローカルマシンのキャッシュサーバーを簡単に設定できます。ハードドライブのサイズの制限があるため、別のコンピューターにキャッシュサーバーを作ることが推奨されます。

プロパティー 説明
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 ダウンロード アーカイブ ページに移動してください。使っている Unity バージョンのダウンロードを選択し、 Cache Server をクリックしてダウンロードを開始します。
  • そのファイルを展開すると、下図のようになります。
  • OS ごとに違いますが、適切なコマンドスクリプトを走らせてください。
  • バックグラウンドで動いているキャッシュサーバーをターミナルウィンドウで確認できます。

キャッシュサーバー にはとても大きいストレージを持つ信頼できるマシンが必要です(複数のバージョンのインポートされたリソースを保存しておくため、プロジェクトのサイズよりずっと大きい必要があります)。もしハードディスクがいっぱいになると、 キャッシュサーバー のパフォーマンスが遅くなります。

サービスとしてのキャッシュサーバーをインストール

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 ではそのようなことがありません。

キャッシュサーバー FAQ

キャッシュサーバーの DB サイズはインポートしたりリソースを保存したりするたびに無限にどんどん大きくなってしまうのでしょうか?

キャッシュサーバーは自動的に一定周期に使われなくなったアセットを削除します(もちろん再度必要になれば、次に使われる間に再び作られるでしょう)。

キャッシュサーバーは Asset Server でしか動かないのですか?

キャッシュサーバーはソースバージョンコントロールと切り離してデザインされているので、Unity の Asset Server に制限されることはありません。

何を変更するとインポートしたファイルが再度生成されるのでしょうか?

Unity は一つのアセットをインポートしようとする際、元となる全てのデータの MD5 ハッシュを生成します。

例えばテクスチャでは、以下のように成り立っています。

  • 元となるアセット: “myTexture.psd” ファイル
  • メタファイル: “myTexture.psd.meta” (全てのインポート設定を保存しています)
  • テクスチャインポーターの内部バージョン番号
  • 全ての AssetPostprocessors のバージョン番号のハッシュ

もしハッシュがキャッシュサーバーに保存されているものと違っていたら、アセットが再インポートされるか、キャッシュ化されたバージョンがダウンロードされます。クライアント側の Unity エディターは必要な時にサーバーからアセットを持ってくるだけです。つまりアセットは変更のたびにそれぞれのプロジェクトにプッシュされることはありません。

依存関係のあるアセットはどう扱ったら良いですか?

キャッシュサーバーは依存関係を扱いません。Unity のアセットパイプラインは依存関係のコンセプトを処理できません。アセット間の依存を避けるように作られています。 AssetPostprocessor クラスは、アセットインポーターを自分用にカスタマイズする一般的なテクニックです。例えば、決められた名前やタグに基づいて、.fbx ファイルのゲームオブジェクトに MeshCollider を追加することも可能です。

AssetPostprocessor を使って、依存関係を示すことも簡単にできます。例えば、アセットの次に、テキストファイルから得たデータを使って、インポートしたゲームオブジェクトにコンポーネントを追加することも可能です。これはキャッシュサーバーではサポートされません。もしキャッシュサーバーを使いたいなら、プロジェクトフォルダーの他のアセットの依存関係を排除しなければなりません。キャッシュサーバーはポストプロセッサの依存関係について何も検知しないので、変更を検知せず、そのため、キャッシュされた古いバージョンのアセットを使用してしまいます。

実践的な話で言えば、キャッシュサーバーで動かすためのアセットポストプロセッサを走らせる方法はたくさんあります。以下を利用します。

  • インポートされたアセットのパス
  • アセットの全てのインポート設定
  • 元となるアセット自身か、アセットポストプロセッサー内で生成されたデータ

マテリアルで動かす際に問題がありませんか?

既にあるマテリアルを変更すると問題の原因になる場合があります。キャッシュサーバーを使っていると、Unity はマテリアルへの参照が維持されるよう検証します。しかしポストプロセスの呼び出しが発生しないので、キャッシュサーバーを通してモデルがインポートされても、マテリアルのコンテンツは変更されません。そのため、キャッシュサーバーがある場合とない場合とで違う結果を得る場合があります。これを避けるにはディスクに既に存在するマテリアルは絶対に修正しないことです。

サーバーによってキャッシュされないアセットの種類はありますか?

サーバーにキャッシュされない種類のアセットはいくつかあります。キャッシングスクリプトによって作られたものは、サーバーでは無視されるので、キャッシュされません。(Maya、3D Max 等の)3D モデリングソフトで使われているネイティブのファイルはそのアプリケーション自体を使って FBX にコンバートされます。現在サーバーでは、ネイティブのファイルとインポートプロセスで生成された FBX ファイルのどちらもキャッシュ化しません。しかし、モデリングソフトから FBX にエクスポートされたファイルを Unity プロジェクトに追加することでキャッシュ化が可能になります。

YAML クラス ID リファレンス
スクリプトでアセットを変更する