LinuxでUnityを使う

# はじめに
この記事は[Unity Advent Calendar 2024](https://qiita.com/advent-calendar/2024/unity) 13日目の記事です。

皆さんはUnityでどのOSに出力しているでしょうか？
モバイル用のiOS/AndroidあるいはデスクトップのWindows/MacOSに出力している方がほとんどだと思います。
今回は出力先としては珍しいLinuxについて解説します。
LinuxでUnityを使う利点として、WindowsやMacの使用にかかるライセンス料を大幅に減らすことができます。また、Unityを組み込みソフトとして使う場合や、AWS/Google Cloud(GCP)などのクラウド上で使う場合に選択肢として考えられます。

# 環境の準備
公式サイトではUnityを使えるLinuxのディストリビューションとして下記がリストアップされています。
> System requirements
> CentOS 7
> Rocky
> Ubuntu versions 20.04 and 22.04
https://docs.unity3d.com/hub/manual/InstallHub.html

今回の記事ではAWS上にUbuntu環境を用意し、そこにUnityをインストールします。既に環境がある方は、この節を飛ばしていただいて問題ありません。

AWSではNICE DCVというリモートデスクトップの機能があります。こちらの機能を含んだAMIをMarket Placeから探してきてインスタンスを立ち上げます。インスタンスタイプには`g4dn.xlarge`などGPU付きを指定します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/105021/efbb4dab-e0ce-2992-e63c-8c90d9973426.png)

NICE DCVはセキュリティグループでUDP/TCPともに`8443`ポートを空けておく必要があります。また、SSH接続用にTCPの`22`も開けておきます。

最近のUnityは大きな容量を要求するのでストレージを少し大きめに設定しておきます
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/105021/1beaf5a4-b063-61a3-6dd4-71c47a44543a.png)


立ち上がったばかりのインスタンスにはパスワードが設定されていないので、コンソールから接続し下記のコマンドでパスワードを設定します。なお、初期のユーザー名が`ubuntu`になっています。
```
sudo passwd ubuntu
```

[NICE DCV](https://aws.amazon.com/jp/hpc/dcv/)クライアントを使って接続します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/105021/b07be837-b5f7-2ae2-6d6d-c17e848c7891.png)

上手くいくとUbuntuのデスクトップが表示されます。これで環境設定は完了です。
![ubuntu.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/105021/59c5285f-ff30-5122-18cf-6986420b7922.png)

# Unity Editorのインストール
ここからUnity Editorをインストールしていきます。
公式サイトに記載の手順で進めていきます。下記はUbuntuでの説明になります。

下記の4コマンドでUnityHubのインストールができます。
```
wget -qO - https://hub.unity3d.com/linux/keys/public | gpg --dearmor | sudo tee /usr/share/keyrings/Unity_Technologies_ApS.gpg > /dev/null

sudo sh -c 'echo "deb [signed-by=/usr/share/keyrings/Unity_Technologies_ApS.gpg] https://hub.unity3d.com/linux/repos/deb stable main" > /etc/apt/sources.list.d/unityhub.list'

sudo apt update

sudo apt-get install unityhub
```

上手くインストールができたらアプリケーション一覧にUnityHubのアイコンが表示されます
![unityhub.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/105021/f21e91dd-0950-be3a-25d2-7b61139ac3f4.png)

アイコンをクリック、または`unityhub`コマンドでUnityHubが起動します。
この時下記のエラーが出て実行できないことがあります。
```
A JavaScript error occurred in the main process
Uncaught Exception:
Error: /tmp/.org.chromium.Chromium.LesfF5: failed to map segment from shared object
```
こちらは`sudo mount -o remount,exec /tmp`のコマンドを実行してから、UnityHubを実行すると直すことができます。

UnityHubが実行できたら、ログインしUnity Editorをインストールします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/105021/b338fa77-a285-1f88-fbbc-673fc6542fcd.png)

インストールができたら、プロジェクトを作成します
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/105021/34bfa629-1196-66ed-fbb2-6846e6d78a1f.png)

プロジェクトが開きました。
ここまで出来たら後はいつものUnityと変わりありません。
![unity.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/105021/cacfae92-46ad-8f4a-560c-2be871bd39a9.png)

ビルドして実行できるか確認してみましょう
![build.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/105021/8991f980-3c57-22c3-a742-7091502016b7.png)


# バイナリを実行する
ビルドができたら実行ファイルをクリック、またはコンソールから叩くことで実行できます
もし実行できない場合は、実行権限が付与されているか確認しましょう
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/105021/f470099d-653f-5ea7-d3e3-01abdd3133ff.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/105021/94f17b52-fee4-c1a8-5de7-a1163d4ec34c.png)

# Linuxで制作する際の注意事項
ネイティブプラグインを使用する際は、Linux向けにビルドされたプラグインが必要になります。
既存のプロジェクトを移植する場合や、アセットストアからプラグインを入手した場合は注意が必要になります。
一方でC#で作成されたマネージドなプラグインであれば、Linuxでもそのまま使うことができます(DoTween、UniTask、UniVRMなど)

# Github Actionsを使ってビルドする
ここまでLinuxにUnityをインストールしてビルドするまでを紹介してきました。Linux版のUnityを使って開発することも可能ですが、使い慣れたWindowsやMacで開発を行い、最終出力だけLinux版のバイナリが欲しいという方もいるでしょう。
そういう方のために、Github Actionsを使ってビルドできる方法を簡単に紹介します。

環境構築についてはこちらの記事を参照してください。

https://qiita.com/broken55/items/2ca7d8b261ed12bb3820


環境構築ができたら、下記のYAMLでLinux版のビルドができます。
基本のファイルからTarget Platformを`StandaloneLinux64`に変更しただけになります。
```yaml
# 名前を付ける。これがGithubActions上に表示される
name: Run the Linux build
on:
  workflow_dispatch: {}
jobs:
  build:
    name: Run the Linux build
    runs-on: ubuntu-latest
    steps:
      # リポジトリのチェックアウト
      - name: Check out my unity project.
        uses: actions/checkout@v4
      - name: Create LFS file list
        run: git lfs ls-files -l | cut -d' ' -f1 | sort > .lfs-assets-id

      # LFSファイルのキャッシュを取得する
      - name: Restore LFS cache
        uses: actions/cache@v4
        id: lfs-cache
        with:
          path: .git/lfs
          key: ${{ runner.os }}-lfs-${{ hashFiles('.lfs-assets-id') }}

      # LFSファイルをPullする
      - name: Git LFS Pull
        run: |
          git lfs pull
          git add .
          git reset --hard

      # ファイル名にgitのハッシュを含めたいので$GITHUB_OUTPUTに保存しておく
      - name: Set outputs
        id: vars
        run: echo "sha_short=$(git rev-parse --short HEAD)" >> $GITHUB_OUTPUT
        
      # Cache
      - uses: actions/cache@v4
        with:
          path: Library
          key: Library-${{ hashFiles('Assets/**', 'Packages/**', 'ProjectSettings/**') }}
          restore-keys: |
            Library-

      # Unityプロジェクトのビルド
      # 設定しない場合、buildフォルダに出力される
      - name: Run the Linux build
        uses: game-ci/unity-builder@v4
        env:
          UNITY_LICENSE: ${{ secrets.UNITY_LICENSE }}
          UNITY_EMAIL: ${{ secrets.UNITY_EMAIL }}
          UNITY_PASSWORD: ${{ secrets.UNITY_PASSWORD }}
        with:
          targetPlatform: StandaloneLinux64
          unityVersion: 2022.3.0f1  #ここに使うUnityのバージョンを入れる

      # 成果物をZIPにしてアップロードする
      - name: Upload the Linux Build
        uses: actions/upload-artifact@v4
        with:
          name: Build-${{ steps.vars.outputs.sha_short }}
          path: build
```

このActionを実行し、うまくビルドできるとZIPファイルがGithub上にアップロードされます
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/105021/2def050d-7609-78f3-720c-cd3a515e87fd.png)

このファイルをLinuxに転送します。

ZIPファイルを展開すると`StandaloneLinux64`というフォルダが生成されます。
この中の`StandaloneLinux64`というファイルが実行ファイルになります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/105021/52de75ea-bfcc-b00b-83d7-1d1ad1b2104e.png)


# おわりに
LinuxでUnityを使うというニッチな技術を紹介しました。
Linuxを使うことでコスト性に優れたシステムを組むことができます。
是非参考にしてみてください