Unity5 ProでCache Serverをつかってみる

# Cache Serverとは？

Cache Serverはインポート後のアセットデータをサーバーに保存し、
チーム内で再利用・共有することができるUnity公式のシステムです。

Unityをそれなりの規模のプロジェクトでつかっていると、
アセットのインポート時間が悩みのタネになります。
リポジトリから更新を反映するたびに数分、
Switch Platformするたびに数十分/数時間...がザラです。
しかもこれがチームメンバー分になるため、
それはもう大変な時間を浪費していることになります。

簡単にできる対策としてはPreferencesのCompress Assets on Importの
チェックをはずすというものが考えられますが、
どのみちビルド時に時間がかかったりなど、
微妙に根本的な解決になっていなかったりします。

そこでCache Serverの登場です。
Cache Serverを使うと一度誰かのマシンで圧縮処理を済ませ
サーバーにキャッシュされたアセットは、
次回以降は処理済みのデータをダウンロードするだけになります。
一言でいうとインポート処理が爆速になります。

ちなみにUnity公式のドキュメントはこちらです。
http://docs.unity3d.com/ja/current/Manual/CacheServer.html

# Cache ServerとTeam LicenseとUnity 5 Pro

ただし、Cache Serverを利用するためにはTeam Licenseが必要です。
Unity4まではこのTeam Licenseはアドオンライセンスとなっており
ユーザーごとに追加料金が必要でした。
そのため、導入を見送っていた方もいるかもしれません。

ところが、Unity5では
お得なことにProライセンスを購入するとTeam Lisenceがついてきます。

また、アセットのインポート時間が深刻な問題となるのは、
業務としてUnityを使っている方でほぼProライセンスでしょう。

アセットモリモリのプロダクトを
Unity5 Proで作ろうとしている方は
ノーコストで導入できるCache Serverを一回試してみる価値アリです。

# とりあえずCache Serverを試してみる

実はCache Serverの導入はめちゃくちゃ簡単です。
Unityの公式ページで配布されているため、
ダウンロード後サーバーとして起動しておきます。

注：まずは動作の検証だけに留めるため、
ちゃんとサーバーとして立ち上げたい場合は記事後半を参照ください。

## ダウンロードしてテスト起動する
とりあえず以下からCache Serverをダウンロードしましょう。

http://unity3d.com/jp/unity/collaboration/

ダウンロードしたzipファイルを展開すると、
いくつかのCacheServerの実行ファイルの他に以下のような起動スクリプトが入っています。

* RunOSX.command（Mac用）
* RunLinux.sh（Linux用）
* RunWin.cmd（Windows用）

あとは環境に合わせてこのファイルをダブルクリックするだけです。
クリックするとコンソールが開いてCache Serverが起動します。
これで準備は完了です。

<img width="589" alt="スクリーンショット 2015-10-21 20.57.18.png" src="https://qiita-image-store.s3.amazonaws.com/0/97161/54f07725-ef44-a722-328a-e03af8b2f919.png">


## UnityでCache Serverを使う設定にする
次にUnityの設定を行います。
UnityのPreferences -> Cache Serverを開きUse Cache Severにチェックをいれ、
IP Addressに「localhost」と打ち込みます。

完了です。
これだけでCache Serverを利用できるようになります。
チェックのためCheck Connectionボタンを押し、
Connection successful.と表示されればOKです。

<img width="534" alt="スクリーンショット 2015-10-20 23.22.28.png" src="https://qiita-image-store.s3.amazonaws.com/0/97161/0c340f10-d42e-569f-180a-bb97bc22e0e4.png">

この状態で、UnityプロジェクトをSwitch Platformしてみましょう。
複数のプラットフォームを行き来していると
1回目のSwitch Platformは通常通りの速度ですが、
2回目以降は爆速になっていることが確認できます。

ちなみにデフォルトだと
キャッシュされるデータが~/cache, ~/cache5.0に保存されます。

# Cache Serverをサーバーに配置してみる

Cache Serverはダブルクリックすれば簡単に起動できるのですが、
実際に使うとしたらコンソール閉じていても動いてて欲しいし、
PC起動時に自動で立ち上がって欲しいものです。
そこで、実際に使えるように設定を行います。

ちなみに、
今回はUnityプロジェクト専用のビルドサーバーに導入してます。
環境はMacでLaunchAgentを使います。あしからず。
（Linuxの場合も同じような流れで自動起動の設定をすれば良いだけです）

ただし、自分一人で使う場合でも、
同様の手順でローカルのマシンに立てるだけで十分効果があるかとおもいます。

## ファイルの配置

この辺りはどこでもいいですが、
ダウンロードしたCache Serverを以下に配置しました。

```
~/Library/Unity/CacheServer
```

## 自動起動の設定

つぎにLaunchAgentに登録するための設定ファイルを以下のように作成します。

```com.unity3d.CacheServer.agent.plist 
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
 <dict>
  <key>Label</key>
  <string>com.unity3d.CacheServer</string>
  <key>RunAtLoad</key>
  <true/>
  <key>ProgramArguments</key>
  <array>
     <string>/Users/jenkins/Library/Unity/CacheServer/RunOSX.command</string>
     <string>--port 8126</string>
     <string>--path /Users/jenkins/Library/Unity/CacheServer/cache5.0</string>
     <string>--size 53687091200</string>
     <string>--nolegacy</string>
  </array>
  <key>StandardErrorPath</key>
  <string>/dev/null</string>
  <key>StandardOutPath</key>
  <string>/dev/null</string>
 </dict>
</plist>
```

このとき、UserのディレクトリやRunOSX.commandの
位置は環境に合わせて変更してください。

--port, --path, --size, --nolegacyの値は
起動時にCache Serverに渡すオプションです。
こちらも必要に応じて変更してください（詳細は公式のドキュメントを参照）。

ちなみに、上記の設定だと
キャッシュデータ自体は~/Library/Unity/cache5.0以下に出力されます。

このファイルを~Library/LaunchAgents/以下に配置し、
以下のコマンドを叩けば起動と自動起動の設定が完了です。

```
$ launchctl load ~Library/LaunchAgents/com.unity3d.CacheServer.agent.plist
```

サーバーをストップし自動起動をやめたいときは以下です。

```
$ launchctl unload ~Library/LaunchAgents/com.unity3d.CacheServer.agent.plist
```


## Unity側IPの変更

あとは、Preferencesから、
キャッシュサーバーのIP Adressを設定するだけです。
チームメンバーが同じサーバーを使うようにします。

ちなみに、ネットワークに繋がってないなど、
なんらかの原因でCache Serverにアクセスできない場合は、
通常通りのインポート処理が走るようです。