本記事は関東ゲーム制作部 Advent Calendar 2018 16日目の記事です。
東ゲ部 Advent Calendar 2018
経緯
昨日12/14にUnity 2018.3がリリースされましたね。個人的には長らく切望していたNested Prefab機能が実装されたと聞いて早速使ってみたいと思いました。ですが、Unity使いの皆様ならよくあると思うのですが、「Unityのバージョンアップすると過去のが動かなくなるから上げたくないんだよなぁ...」ということがあるかと思います。デフォルトではUnityは1環境に1バージョンしか存在できないっぽい?ので、特に共同開発なんかしていると周りと足並みそろえて変更する必要があると思います。Pythonであれば、pyenvとかで複数バージョンを共存させられるけど、Unityでもそういったことできないのかな~と思っていたら2通りのやり方を見つけたので、誰かの役に立てばと思い、メモしておきます。
UnityHubを使う
私はこの記事を書くにあたって知りましたが、こちらを使っている人は割といるのではないでしょうか?UnityHubの特徴はこちらの記事にわかりやすくまとめられています。
UnityHubを用いて複数バージョンのUnityEditorを管理する
要点だけ抜粋すると
- 複数のバージョンを管理できる
- Componentを追加インストールできる
- ver.2017以降であればUnityHub経由でインストールできる。それ以前もローカルにあれば、追加できる
- 同一バージョンのUnityEditorを同時に起動できる
あたりでしょうか。これを使えば、プロジェクトでは古いバージョンを使っているけど、自分の環境では新しいバージョンを試したいなんてときに便利だと思います。手っ取り早く使いたいならこっちを使うのがおすすめです。
Unity on Docker
ここからが本命かつマイナーなお話になります。最近、バージョン管理や環境を汚さないようにDocker上でいろいろやろうという話を聞きます。かくいう私もPythonの環境とかはDocker上で作ったりしています。そこで、最近流行りのDockerを使ってUnityを動かせないかと思いました。結論から言うとおすすめしません。それでも、供養の意味も込めて検討記録ということで長くはなりますが、それでもいいよという心優しい方はお付き合いください。
Docker自体のインストールも書いているといよいよ長くなりすぎるので、ここでは割愛します。私はWindows10なので、Docker for Windowsを使うためにこの辺りを参考にしました。
WindowsでDocker環境を試してみる
ついでにGUIでコンテナ管理したいのでKitematicも入れています。
Dockerのインストールには成功しました。いよいよ、Unityのコンテナを用意します。といっても私はdocker-compose up -d
程度しか使えないので、誰かいい感じのDockerfile
なりdocker-compose.yml
など提供してくれてないかなぁと検索したところ、ありました。
docker-unity3d (Docker container for Unity)
探せばいるもんですね。先人は偉大です。しかもReadMeを読んだところなにも考えずにdocker-compose up -d
をと唱えれば良いと書かれているもんだからありがたい限りです。ということで、早速コマンドプロンプトを起動して、リポジトリをcloneしてきて、Dockerfile
があるディレクトリまで移動して、実行します。
※ここからは回線状況にもよりますが、作業に2~3時間程度要します。また、ディスク容量に4GB程度の空きを作っておく必要があります。
>docker-compose up -d
と叩くと、Dockerfile
に従ってインストールが始まります。時間がかかりそうだったので、放置していたら、タイムアウトの関係でいくつかのインストールに失敗していたのと、share directoryにのアクセスに失敗しました的なメッセージが出て止まっていました。同時にポップアップでshare directoryのアクセスを許可しますか?のようなものが出ていたので、OKを押して再インストール。うまくいかない場合は、一度インストールしたイメージ類をすべて消してから再度実行するとうまくいくと思います。
>docker image list #ダウンロードしたイメージ一覧を表示
>docker rmi *** #***で指定したイメージを削除
当該のイメージが見つかりませんでしたのようなメッセージが出た場合はタグをつけて削除するとうまくいくと思います。
docker rmiコマンドの使い方(実例付)CE対応
これでコンテナのダウンロードまでは成功したようなのですが、コンテナの起動がうまくいかない。メッセージにリビルドしてねと出ていたので
>docker-compose up --build
を実行。概ね上手くいったぽいけど、すると今度は、
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する話
なので、テキストエディタで改行コードをLF
に変更して再度
>docker-compose up --build
を実行するとようやくUnityのコンテナが起動!!ゴールは近いです。提供ページに書かれている通り、VNC ViewerでVM内に入ってくださいとのとこなので、お好きなVNC Viewerを使ってコンテナ内に入ります。私は今回はUltra VNCを使いました。
UltraVNCでWindows PCをリモート制御する(クライアント編)辺りを参考にしながら、インストールの設定は基本デフォルトで、環境変数に登録とデスクトップにショートカットアイコンを作る的なものだけチェックを入れてインストール。さーて、IPアドレスを打っていざConnectと思ったのですが、またコケました。今度は何だと思ってKitematicのログを見ると、
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を立ち上げた後に、再度
>docker-compose up --build
を実行すると、
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
を実行すれば起動できました。
adminuser@6afa1c440a08:~$cd Unity
あとは画面に従って通常のUnityのインストールと同様に進めていきます。
ログインもできて、さーて開発を始める準備が整ったことでしょう。新規に作るもよし、既存のプロジェクトを使うもよし。自分で作っていたプロジェクトを使いたい場合はCloudに上げておくか、ローカルであれば、cloneしてきたリポジトリ直下にあるcontextフォルダにおくように書かれていたのでお好みの箇所に置きましょう。コンテナ内からアクセスするときは、File System->context->任意のフォルダ
に入っています。
ところが、これで動くはず...あれ?一瞬エディター画面が表示されてAborted
とか言われるぞ...???なんかいろいろ調べるとバージョンによってはバグで動かないっぽいことを見かけたので、Unityのバージョンをアップすることにしました。
Installing Unity 2017.1.0f2 In Docker Container
使用したバージョンはDockerfile
に書かれていた当時のlatestであるver.2017.2.0f3にしました。バージョンを変更したい場合は、お好みのバージョンのURLをコピーしてDockerfile
の71行目あたりにある.deb
ファイルを指定しているURLを変更すれば行けました。それ以外のバージョンを使いたい場合は、たぶんこちらのスレッドから対応したUnityのイメージを落としてくればいいんだと思います。スレッドのページを下に繰っていくと、古いのだと5.1から最新で2017.2.0b11まであるみたいです。どれが行けてどれが行けないまでは検証していないのでわかりません(^-^;
バージョンアップして再度dockder-compose up -d
からやり直すと無事NewProject作成で画面が表示された...?
メモリが足りないのかこれ以上まともに描画されませんでした。こんな調子なので当然、プロジェクトが重すぎたのか、2dだからダメなのか自前のプロジェクトはうまく描画できませんでした。本当はこんな感じの画面を出したかったんですが...
画像は私の所属するサークルNOELで制作したゲームです。現在は第2作目のリリースに向けて鋭意制作中です。最新情報は随時Twitterで流していきますので、よろしければフォローしてやってください。@CircleNoelGame(←単なる宣伝です。)
これでめでたくDocker上でUnityが表示できるようになりました(まともに動くとは言っていない)。ものすっごく動作がもっさりしますが、とりあえず動いたということで、今回はここらへんで力尽きてしまいました。あとは割り当てメモリとか増やせばいいんですかね?でも、私の持つ低スペックPCでは3GB割り当てるのが精いっぱいなんですよね。年内に進展があれば、時間を見つけて続きを書きたいと思います。
ちなみにUnrealEngineのdockerイメージも存在はするようです。頑張ればこっちも行けるんでしょうかね(;^_^A
少しでも誰かの参考になれば幸いです。よければサークルNOELもよろしくお願いします。
Twitterはこちら@CircleNoelGame