UnityEditorのバージョン管理をしたい

本記事は関東ゲーム制作部 Advent Calendar 2018 16日目の記事です。
[東ゲ部 Advent Calendar 2018](https://adventar.org/calendars/3482)

## 経緯
昨日12/14に[Unity 2018.3](https://prtimes.jp/main/html/rd/p/000000082.000016287.html)がリリースされましたね。個人的には長らく切望していた**Nested Prefab**機能が実装されたと聞いて早速使ってみたいと思いました。ですが、Unity使いの皆様ならよくあると思うのですが、「Unityのバージョンアップすると過去のが動かなくなるから上げたくないんだよなぁ...」ということがあるかと思います。デフォルトではUnityは1環境に1バージョンしか存在できないっぽい?ので、特に共同開発なんかしていると周りと足並みそろえて変更する必要があると思います。Pythonであれば、pyenvとかで複数バージョンを共存させられるけど、Unityでもそういったことできないのかな～と思っていたら2通りのやり方を見つけたので、誰かの役に立てばと思い、メモしておきます。

## UnityHubを使う
![コメント 2018-12-16 002612.jpg](https://qiita-image-store.s3.amazonaws.com/0/199063/88ccab24-9020-5f1f-b027-2b84a6b0aa34.jpeg)
私はこの記事を書くにあたって知りましたが、こちらを使っている人は割といるのではないでしょうか?UnityHubの特徴はこちらの記事にわかりやすくまとめられています。
[UnityHubを用いて複数バージョンのUnityEditorを管理する](https://qiita.com/k7a/items/ca4547725434580bc3a9)
要点だけ抜粋すると

- 複数のバージョンを管理できる
- Componentを追加インストールできる
- ver.2017以降であればUnityHub経由でインストールできる。それ以前もローカルにあれば、追加できる
- 同一バージョンのUnityEditorを同時に起動できる

あたりでしょうか。これを使えば、プロジェクトでは古いバージョンを使っているけど、自分の環境では新しいバージョンを試したいなんてときに便利だと思います。手っ取り早く使いたいならこっちを使うのがおすすめです。
![コメント 2018-12-16 011026.jpg](https://qiita-image-store.s3.amazonaws.com/0/199063/ddbb1611-7f22-c419-b42c-5e91a5c9aa2d.jpeg)

## Unity on Docker
ここからが本命かつマイナーなお話になります。最近、バージョン管理や環境を汚さないようにDocker上でいろいろやろうという話を聞きます。かくいう私もPythonの環境とかはDocker上で作ったりしています。そこで、最近流行りのDockerを使ってUnityを動かせないかと思いました。結論から言うとおすすめしません。それでも、供養の意味も込めて検討記録ということで長くはなりますが、それでもいいよという心優しい方はお付き合いください。

Docker自体のインストールも書いているといよいよ長くなりすぎるので、ここでは割愛します。私はWindows10なので、Docker for Windowsを使うためにこの辺りを参考にしました。
[WindowsでDocker環境を試してみる](https://qiita.com/fkooo/items/d2fddef9091b906675ca)
ついでにGUIでコンテナ管理したいのでKitematicも入れています。

Dockerのインストールには成功しました。いよいよ、Unityのコンテナを用意します。といっても私は`docker-compose up -d`程度しか使えないので、誰かいい感じの`Dockerfile`なり`docker-compose.yml`など提供してくれてないかなぁと検索したところ、ありました。
[docker-unity3d (Docker container for Unity)](https://github.com/nenadg/docker-unity3d)
探せばいるもんですね。先人は偉大です。しかもReadMeを読んだところなにも考えずに`docker-compose up -d`をと唱えれば良いと書かれているもんだからありがたい限りです。ということで、早速コマンドプロンプトを起動して、リポジトリをcloneしてきて、`Dockerfile`があるディレクトリまで移動して、実行します。
※ここからは回線状況にもよりますが、作業に**2～3時間程度**要します。また、ディスク容量に**4GB程度の空き**を作っておく必要があります。

```Console
>docker-compose up -d
```
と叩くと、`Dockerfile`に従ってインストールが始まります。時間がかかりそうだったので、放置していたら、タイムアウトの関係でいくつかのインストールに失敗していたのと、share directoryにのアクセスに失敗しました的なメッセージが出て止まっていました。同時にポップアップでshare directoryのアクセスを許可しますか?のようなものが出ていたので、OKを押して再インストール。うまくいかない場合は、一度インストールしたイメージ類をすべて消してから再度実行するとうまくいくと思います。

```Console
>docker image list #ダウンロードしたイメージ一覧を表示
>docker rmi *** #***で指定したイメージを削除
```
当該のイメージが見つかりませんでしたのようなメッセージが出た場合はタグをつけて削除するとうまくいくと思います。
[docker rmiコマンドの使い方（実例付）CE対応](https://www.memotansu.jp/docker/703/)

これでコンテナのダウンロードまでは成功したようなのですが、コンテナの起動がうまくいかない。メッセージにリビルドしてねと出ていたので

```Console
>docker-compose up --build
```
を実行。概ね上手くいったぽいけど、すると今度は、

```Console
standard_init_linux.go:190: exec user process caused "no such file or directory"
```
Windows10を使っているのですが、どうやらリポジトリからcloneしてきたときに、改行コードが`CRLF`に変換されて落としてきています。ですが、コンテナ自体は`Ubuntu`だからか`LF`でないと動かないようです。
[docker-compose upするとコンテナが一瞬でexited with code 1する話](https://qiita.com/nrk_baby/items/d872e8f051a96a313601)
なので、テキストエディタで改行コードを`LF`に変更して再度

```Console
>docker-compose up --build
```
を実行するとようやくUnityのコンテナが起動!!ゴールは近いです。提供ページに書かれている通り、VNC ViewerでVM内に入ってくださいとのとこなので、お好きなVNC Viewerを使ってコンテナ内に入ります。私は今回は[Ultra VNC](https://forest.watch.impress.co.jp/library/software/ultravnc/)を使いました。
[UltraVNCでWindows PCをリモート制御する（クライアント編）](http://www.atmarkit.co.jp/ait/articles/0709/21/news145.html)辺りを参考にしながら、インストールの設定は基本デフォルトで、環境変数に登録とデスクトップにショートカットアイコンを作る的なものだけチェックを入れてインストール。さーて、IPアドレスを打っていざConnectと思ったのですが、またコケました。今度は何だと思ってKitematicのログを見ると、

```Console
Creating unity-service ... done
Attaching to unity-service
unity-service | stored passwd in file: /home/adminuser/.vnc/passwd
unity-service | 16/12/2018 07:00:26 -usepw: found /home/adminuser/.vnc/passwd
unity-service | 16/12/2018 07:00:26 x11vnc version: 0.9.13 lastmod: 2011-08-10  pid: 8
unity-service | 16/12/2018 07:00:26
unity-service | 16/12/2018 07:00:26 wait_for_client: WAIT:cmd=FINDCREATEDISPLAY-Xvfb
unity-service | 16/12/2018 07:00:26
unity-service | 16/12/2018 07:00:26 initialize_screen: fb_depth/fb_bpp/fb_Bpl 24/32/2560
unity-service | 16/12/2018 07:00:26
unity-service | 16/12/2018 07:00:26 Autoprobing TCP port
unity-service | 16/12/2018 07:00:26 Autoprobing selected TCP port 5900
unity-service | 16/12/2018 07:00:26 Autoprobing TCP6 port
unity-service | 16/12/2018 07:00:26 Autoprobing selected TCP6 port 5900
unity-service | 16/12/2018 07:00:26 listen6: bind: Address already in use
unity-service | 16/12/2018 07:00:26 Not listening on IPv6 interface.
unity-service | 16/12/2018 07:00:26
unity-service |
unity-service | The VNC desktop is:      767f1c3f2d95:0
unity-service | PORT=5900
unity-service | 16/12/2018 07:05:11 Got connection from client 172.16.250.1
unity-service | 16/12/2018 07:05:11   other clients:
unity-service | 16/12/2018 07:05:11 webSocketsHandshake: unknown connection error
unity-service | 16/12/2018 07:05:11 Client 172.16.250.1 gone
unity-service | 16/12/2018 07:05:11 Statistics             events    Transmit/ RawEquiv ( saved)
unity-service | 16/12/2018 07:05:11  TOTALS              :      0 |         0/        0 (  0.0%)
unity-service | 16/12/2018 07:05:11 Statistics             events    Received/ RawEquiv ( saved)
unity-service | 16/12/2018 07:05:11  TOTALS              :      0 |         0/        0 (  0.0%)
unity-service exited with code 137
```
的なメッセージが出ていました。どうやらVNCアクセスに失敗していたのかよくわかりませんが、VNC Viewerを立ち上げる前にUnityのコンテナを立ち上げたのがいけなかったぽいので、一度コンテナを`down`させてからVNC Viewerを立ち上げた後に、再度

```Console
>docker-compose up --build
```
を実行すると、

```Console
Creating unity-service ... done
Attaching to unity-service
unity-service | stored passwd in file: /home/adminuser/.vnc/passwd
unity-service | 16/12/2018 07:24:51 -usepw: found /home/adminuser/.vnc/passwd
unity-service | 16/12/2018 07:24:51 x11vnc version: 0.9.13 lastmod: 2011-08-10  pid: 8
unity-service | 16/12/2018 07:24:51
unity-service | 16/12/2018 07:24:51 wait_for_client: WAIT:cmd=FINDCREATEDISPLAY-Xvfb
unity-service | 16/12/2018 07:24:51
unity-service | 16/12/2018 07:24:51 initialize_screen: fb_depth/fb_bpp/fb_Bpl 24/32/2560
unity-service | 16/12/2018 07:24:51
unity-service | 16/12/2018 07:24:51 Autoprobing TCP port
unity-service | 16/12/2018 07:24:51 Autoprobing selected TCP port 5900
unity-service | 16/12/2018 07:24:51 Autoprobing TCP6 port
unity-service | 16/12/2018 07:24:51 Autoprobing selected TCP6 port 5900
unity-service | 16/12/2018 07:24:51 listen6: bind: Address already in use
unity-service | 16/12/2018 07:24:51 Not listening on IPv6 interface.
unity-service | 16/12/2018 07:24:51
unity-service |
unity-service | The VNC desktop is:      6afa1c440a08:0
unity-service | PORT=5900
```
となり、Connection Errorは解消されたっぽい。ということで、ローカルホストに`VNCServer: 127.0.0.1`でローカルホストにアクセスすると、パスワードを聞かれました。提供元のReadMeに書かれていた通り、パスワード`pass123`を入力すると、無事、コンテナ内に入れました。こんな感じのコンソール画面だけが表示された画面が見えるはずです。で、肝心の`Unity`はどこにあるのかというと、`/opt/Unity/Editor/Unity`にあるとのことですが、デフォルトのディレクトリが`/opt/Unity/Editor`なので、その場で`Unity`を実行すれば起動できました。

```Console
adminuser@6afa1c440a08:~$cd Unity
```
あとは画面に従って通常のUnityのインストールと同様に進めていきます。
![image2.png](https://qiita-image-store.s3.amazonaws.com/0/199063/26a65a86-b365-6854-ae56-743ddc7dcc17.png)
![image4.png](https://qiita-image-store.s3.amazonaws.com/0/199063/0b3aa833-ce8b-b72a-5a69-7ea1e1717810.png)
ログインもできて、さーて開発を始める準備が整ったことでしょう。新規に作るもよし、既存のプロジェクトを使うもよし。自分で作っていたプロジェクトを使いたい場合はCloudに上げておくか、ローカルであれば、cloneしてきたリポジトリ直下にあるcontextフォルダにおくように書かれていたのでお好みの箇所に置きましょう。コンテナ内からアクセスするときは、`File System->context->任意のフォルダ`に入っています。

ところが、これで動くはず...あれ?一瞬エディター画面が表示されて`Aborted`とか言われるぞ...???なんかいろいろ調べるとバージョンによってはバグで動かないっぽいことを見かけたので、Unityのバージョンをアップすることにしました。
[Installing Unity 2017.1.0f2 In Docker Container](https://answers.unity.com/questions/1517429/installing-unity-201710f2-in-docker-container.html)
使用したバージョンは`Dockerfile`に書かれていた当時のlatestである[ver.2017.2.0f3](http://beta.unity3d.com/download/ee86734cf592/unity-editor_amd64-2017.2.0f3.deb)にしました。バージョンを変更したい場合は、お好みのバージョンのURLをコピーして`Dockerfile`の71行目あたりにある`.deb`ファイルを指定しているURLを変更すれば行けました。それ以外のバージョンを使いたい場合は、たぶん[こちらのスレッド](https://forum.unity.com/threads/unity-on-linux-release-notes-and-known-issues.350256/)から対応したUnityのイメージを落としてくればいいんだと思います。スレッドのページを下に繰っていくと、古いのだと5.1から最新で2017.2.0b11まであるみたいです。どれが行けてどれが行けないまでは検証していないのでわかりません(^-^;
バージョンアップして再度`dockder-compose up -d`からやり直すと無事NewProject作成で画面が表示された...?
![image7.png](https://qiita-image-store.s3.amazonaws.com/0/199063/5279001e-fe04-058f-f0de-328cc368324a.png)
メモリが足りないのかこれ以上まともに描画されませんでした。こんな調子なので当然、プロジェクトが重すぎたのか、2dだからダメなのか自前のプロジェクトはうまく描画できませんでした。本当はこんな感じの画面を出したかったんですが...
![image6.png](https://qiita-image-store.s3.amazonaws.com/0/199063/afdf0972-40b4-1b0b-0699-d83e3b79ae72.png)

画像は私の所属するサークル[NOEL](http://noelgame.html.xdomain.jp/)で制作したゲームです。現在は第2作目のリリースに向けて鋭意制作中です。最新情報は随時Twitterで流していきますので、よろしければフォローしてやってください。[@CircleNoelGame](https://twitter.com/CircleNoelGame?lang=ja)(←単なる宣伝です。)

これでめでたくDocker上でUnityが**表示**できるようになりました(まともに動くとは言っていない)。ものすっごく動作がもっさりしますが、とりあえず動いたということで、今回はここらへんで力尽きてしまいました。あとは割り当てメモリとか増やせばいいんですかね?でも、私の持つ低スペックPCでは3GB割り当てるのが精いっぱいなんですよね。年内に進展があれば、時間を見つけて続きを書きたいと思います。

ちなみに[UnrealEngineのdockerイメージ](https://github.com/connorlanigan/unrealengine-docker)も存在はするようです。頑張ればこっちも行けるんでしょうかね(;^_^A

少しでも誰かの参考になれば幸いです。よければサークル[NOEL](http://noelgame.html.xdomain.jp/)もよろしくお願いします。
Twitterはこちら[@CircleNoelGame](https://twitter.com/CircleNoelGame?lang=ja)

## その他のリファレンス
- [dockerhub gableroux/unity3d
](https://hub.docker.com/r/gableroux/unity3d/)
- [Run Unity Personal inside a Docker container](https://www.robinryf.com/blog/2017/09/30/running-unity-inside-docker.html)
- [robinryf/docker-images](https://github.com/robinryf/docker-images)
- [Made with unity ゲームエンジンunityを30分でLinuxにインストール](https://do-you-linux.com/blog/2017/07/14/made-with-unity-%E3%82%B2%E3%83%BC%E3%83%A0%E3%82%A8%E3%83%B3%E3%82%B8%E3%83%B3unity%E3%82%9230%E5%88%86%E3%81%A7linux%E3%81%AB%E3%82%A4%E3%83%B3%E3%82%B9%E3%83%88%E3%83%BC%E3%83%AB/)