WindowsのUnityでVimを使う手順

UnityはWindowsで動かしたいけど、Vimが使いたいので、WSLでVimを使うことにした。

WSLのインストール

WSL2を使っても良かったが、追加のコンポーネントが必要とのことで、ひとまずWSL1で利用することにした。 WSL2でも問題ない。 https://qiita.com/matarillo/items/61a9ead4bfe2868a0b86

Windows Terminal

インストールして適当に設定。

Windows Terminalのベルを消す

Windows TerminalでESCキーを押すと、Windowsの警告音がなってうるさいので、消す。

echo 'set bell-style none' >> ~/.inputrc

NeoVim

ひとまずアプデ。

sudo apt update
sudo apt upgrade

リポジトリ追加&インストール。

sudo apt-add-repository ppa:neovim-ppa/stable
sudo apt update
sudo apt install neovim

https://sig9.hatenablog.com/entry/2020/05/02/000000

vim-lsp

VimIDEのように使うには、LSPを導入する必要がある。 導入方法はいろいろあるが、私はvim-lsp-settingsを使っている。

https://github.com/mattn/vim-lsp-settings

omnisharpを機能させる

vim-lsp-settingsは、C#のLSPにomnisharpをインストールする。 これと同時にデフォルトでmonoもインストールされるのだが、このmonoだとうまくいかないケースが割とある。 そのため、最新のmonoをインストールして、それを使うように変更する。

monoのインストール https://linuxize.com/post/how-to-install-mono-on-ubuntu-20-04/

vim-lspでインストールされたomnisharpサーバーのmonoのパスを変更する。 ~/.local/share/vim-lsp-settings/servers/omnisharp-lsp/runmono_cmdの行を↓のように書き換える。

修正前:mono_cmd=${bin_dir}/mono
修正後:mono_cmd=/usr/bin/mono

Unityプロジェクトを一度Visual Studioで開く

初めてプロジェクトを開く場合、一度Visual Studioで開いてソリューションファイルを作成する必要がある。(もしかしたらUnityの起動だけで作られるかもしれないが) プロジェクトのルートフォルダに.slnファイルと.csprojファイルがあるのを確認したら、Visual Studioは閉じてしまう。

Unityのソリューションファイルを読み込めるようにする

いざ、WSLからUnityのC#ファイルを開くと、ソリューションファイルが読み込まれる。 しかし、表示された画面は真っ赤で、MonoBehaviourがundefinedとか言われる。

これは、UnityのソリューションファイルがWindows用に生成したものであり、Windows以外からアクセスすると間違ったパスになるのが原因だった。 具体的には、Unityプロジェクトのルートフォルダにある*.csprojの中が↓のようになっているのがまずい。

<Reference Include="UnityEngine">
  <HintPath>C:/Program Files/Unity/Hub/Editor/2019.4.23f1/Editor/Data/Managed/UnityEngine/UnityEngine.dll</HintPath>
</Reference>
<Reference Include="UnityEngine.AIModule">
  <HintPath>C:/Program Files/Unity/Hub/Editor/2019.4.23f1/Editor/Data/Managed/UnityEngine/UnityEngine.AIModule.dll</HintPath>
</Reference>
<Reference Include="UnityEngine.ARModule">
  <HintPath>C:/Program Files/Unity/Hub/Editor/2019.4.23f1/Editor/Data/Managed/UnityEngine/UnityEngine.ARModule.dll</HintPath>
</Reference>
<Reference Include="UnityEngine.AccessibilityModule">
  <HintPath>C:/Program Files/Unity/Hub/Editor/2019.4.23f1/Editor/Data/Managed/UnityEngine/UnityEngine.AccessibilityModule.dll</HintPath>
</Reference>
...

HintPathにC:がついていることが問題で、このファイルをWSLで読み込んでも、C:は認識できない。 これは、C:の部分を/mnt/cに置き換えることで解決できる。

↓のシェルスクリプトを実行すれば、すべての.csprojC:/mnt/cに置き換える。

#!/bin/bash

dir="${PWD}"

for f in *.csproj
do
    sed -i "s/C:/\/mnt\/c/g" $f
done

これで再びC#ファイルを開けば、ついに正しく読み込めるはずだ。

.csprojが自動再生成される問題

Unityの再起動時等に.csprojファイルが再生成されることがある。 すると、せっかく置き換えたC:がまた元に戻ってしまう。

この問題の解決策として、次の2つを考えているがまだうまくいっていない。 うまくいったらまた追記したい。 しばらくは毎度シェルスクリプトを実行することで耐えようと思う。

  • Unityに.csprojファイルを再生成させない
  • WSL用のソリューションファイルを別フォルダに移し、vimではそのソリューションを開くよう設定する