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
VimをIDEのように使うには、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/runのmono_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に置き換えることで解決できる。
↓のシェルスクリプトを実行すれば、すべての.csprojのC:を/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ではそのソリューションを開くよう設定する