Unity開発環境をdocker上に構築する

## 概要
* ホスト側のGUIでdocker上のUnityEditorを起動する方法を紹介します
* UbuntuのUnity導入手順が面倒だったのでdockerfileにまとめました
* ほとんど[前回の投稿](https://qiita.com/chikuta/items/a62cd1d8d945f9b826b1)と同じ内容です
* 簡単に使える dockerfile がなかったので作って公開しました → [chikuta-dockerfiles](https://github.com/chikuta/chikuta-dockerfiles)

## 検証環境
今回検証した環境は以下になります。

**Hardware**
cpu - AMD Ryzen 9 3900X
gpu - Geforce RTX 2060 super
ram - 32G

**Software**
os - ubuntu 20.04.1
kernel - Linux define 5.4.0-48-generic
docker - 19.03.13
nvidia-driver - 450.66
cuda version - 11.0

`nvidia-smi` の出力を添付しておきます。

```bash
$ nvidia-smi
+-----------------------------------------------------------------------------+
| NVIDIA-SMI 450.66       Driver Version: 450.66       CUDA Version: 11.0     |
|-------------------------------+----------------------+----------------------+
| GPU  Name        Persistence-M| Bus-Id        Disp.A | Volatile Uncorr. ECC |
| Fan  Temp  Perf  Pwr:Usage/Cap|         Memory-Usage | GPU-Util  Compute M. |
|                               |                      |               MIG M. |
|===============================+======================+======================|
|   0  GeForce RTX 206...  Off  | 00000000:0E:00.0  On |                  N/A |
| 38%   40C    P8    11W / 175W |    916MiB /  7979MiB |      1%      Default |
|                               |                      |                  N/A |
+-------------------------------+----------------------+----------------------+
```

## 環境整備
最初にnvidia-container-runtimeをインストールします。

```bash
# apt 関連設定
$ curl -s -L https://nvidia.github.io/nvidia-container-runtime/gpgkey | sudo apt-key add -
$ distribution=$(. /etc/os-release;echo $ID$VERSION_ID)
$ curl -s -L https://nvidia.github.io/nvidia-container-runtime/$distribution/nvidia-container-runtime.list | sudo tee /etc/apt/sources.list.d/nvidia-container-runtime.list

# nvidia-container-runtimeインストール
$ sudo apt update
$ sudo apt install nvidia-container-runtime

# docker service の再起動
$ sudo systemctl restart docker.service
```

次に docker group に自身の UID を登録します。docker を使っている人はやっていると思いますが念の為。

```bash
$ sudo usermod -a -G docker `id -un`
$ sudo systemctl restart docker.service
```


## 実行方法
次にdockerイメージのビルドを行います。

```bash
$ git clone https://github.com/chikuta/chikuta-dockerfiles.git
$ cd chikuta-dockerfiles
$ ./docker/ros-bionic-melodic-unity/build-docker-image.bash
```

次に以下のコマンドを実行することでビルドしたイメージのコンテナを起動できます。スクリプトの中身はxhost周りの処理とdockerの引数をラッピングしたものです。必要に応じて編集をすれば自分の環境を作れるで積極的にカスタマイズしましょう。

```bash
$ cd chikuta-dockerfiles
$ ./docker/ros-bionic-melodic-unity/run-docker-container.bash
```

スクリプトを実行すると青色のterminatorが立ち上がります。これは dockerコンテナ上で動いているターミナルアプリケーションになるため、ここで実行したコマンドは全てdockerコンテナ上で処理されます。
次にUnityHubを立ち上げてみます。

```bash
cd /opt/unity
./UnityHub.AppImage
```

![unityhub.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/62361/fdd2249a-c0d9-4795-12af-299f118a9803.png)

必要な環境をインストールした後にUnityEditorを立ち上げてみましょう。
画像は適当な `Free Island Collection` をAsset Storeから取得して表示したものになります。

![unityeditor.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/62361/54a10fd2-1c0d-3a38-322c-35a7df9048c3.png)

次はROS連携あたりを書いていきます。

## 参考
* https://waldeinsamkeit.hatenablog.jp/entry/2019/08/17/002854
* https://nvidia.github.io/nvidia-container-runtime/
* https://medium.com/@benjamin.botto/opengl-and-cuda-applications-in-docker-af0eece000f1
* https://qiita.com/chikuta/items/a62cd1d8d945f9b826b1
* https://forum.unity.com/threads/unity-on-linux-release-notes-and-known-issues.350256/