VSCode + Unityでインテリセンスが効かない時の対処方法
新しいゲームの画面モックをXDで作り、概ね仕様と画面構成が出来上がったので開発を開始しました。
迷ったのはどのUnityバージョンを使うかです。安パイなのは2019.4のLTSバージョンですが、今から開発してリリースする頃にはLTS版になっているはずの2020.2b(ベータ)に決めて使い始めたところ、VSCodeのインテリセンスが効かない現状に遭遇しました。
その時に発生した現象と対処方法を備忘録的に記載しておきます。
結論から言うと、プロジェクトディレクトリを綺麗にしてみるで直りました。
目次
対象環境
以下の環境で発生
- macOS Catalina 10.15.7
- Unity 2020.2.0b12
- Visual Studio Code 1.15.1
- C# for Visual Studio Code (ms-dotnettools.csharp) 1.23.6
発生した現象
Ominisharpが途中でフリーズしてインテリセンスが機能しない。
エラーの原因を探るとログ(拡張機能ホスト)に以下のエラーが表示されていた。
[exthost] [error] [ms-dotnettools.csharp] provider FAILED
[exthost] [error] Problem invoking 'GetCodeActions' on OmniSharp server: Error: Pending request cancelled: /v2/getcodeactions
.NET Coreのバージョンを 5.0.100 にアップデート
dotnetのバージョンが3.1だったのでMicrosoftのページから最新の5.0をダウンロードしてインストールしました。
結果は変化なし!
というか、ms-dotnettools.csharpはdotnetコマンドを使っていない?
Monoのバージョンを最新に!
ログを見るとMonoを使っている模様。もしかしたらこのバージョンをあげれば直るかもしれないということでこちらもバージョンアップ。Stable Chunnelにある6.12をダウンロードしてインストールしました。
Visual Studio Codeを再起動して再度Omnisharpを起動すると以下のログが出力されました。
Starting OmniSharp server at 11/25/2020, 4:10:41 PM
Target: /Users/tamilabo/projects/individ/ppknights/ppkclient
OmniSharp server started with Mono 6.12.0.
Path: /Users/tamilabo/.vscode/extensions/ms-dotnettools.csharp-1.23.6/.omnisharp/1.37.3/omnisharp/OmniSharp.exe
PID: 22044
結果、Mono 6.12.0を使ってくれるようになったものの依然として変わらず。
公式リポジトリのissueを探る
ここまでやってダメだったので、似たような現象に遭遇しているかもしれない人たちの記事を探ってみました。むしろ一番最初に調べるべきですが。
その結果、以下のissueが一番遭遇している現象に近そうでした。
Omnisharp freeze, not working and high cpu usage #4017
https://github.com/OmniSharp/omnisharp-vscode/issues/4017
このスレを追ってみると、途中でOmnisharpがフリーズしてオートコンプリート(インテリセンス)が効かず、さらにCPUが100%になってしまうという内容です。僕はCPU100%になってはいないですが発生ている不具合の内容も似ているし、エラーログの内容も同じです。
その中では、ms-dotnettools.csharpのバージョンを1.23.1にすれば問題を回避できると書かれていたので、拡張機能>C#>別のバージョンをインストールから、1.23.1を選択してvscodeを再起動してみましたが、症状は改善しませんでした。
Unityバージョンの問題なのか?
使おうとしているバージョンが2020.2b(ベータ)なので不具合があるのかも?と思い、2020.1や2019.4LTSでも試してみました。
しかし、2020.2b以外は発生しません。これはいよいよUnityのバージョンの問題なのかもと思い、2020.1にダウングレードして使うことを考えてみましたが、D&Dでアセットをインポートすると一部のファイル名のPrefixが勝手にアンダースコア( _ )に置き換わってしまうという別の不具合に遭遇してしまいました。
これは2019.4LTSや2020.2bでは発生しないので、2020.1のエンバグのようです。
バグを回避しようと別のバージョンをインストールして別のバグに遭遇する。まあまあ良くあることです。
じゃあ、2019.4LTSを使えばいいじゃないか?とも考えましたが、それは負けを認めてしまうことになるので嫌です(笑)
Visual Studioを使おう
macOSにもVisual Studio for MacというVisual Studioもどきがあります。古き良きMonoDevelopのようなXamarinのような怪しいツールなのですが、ちゃんとMicrosoft謹製で良くできています。このツールの欠点はちょっと重いことですね。
僕はVim使いなので、VsVimを拡張機能としてインストールして使ってみたのですが、日本語入力とコマンドを往来すると挙動がおかしくなるというバグに遭遇。これではまともにコードなんて書けません。
VsVimをOFFにすればエディタとしては使えるのですが、Viのコマンドに慣れきってしまってるのでカーソルの移動なんて今更上下左右キーでやる気も起きません。
JetBrains Riderが良いよという記事も見かけて導入しようかと思いましたが、有償な上にあちこちIDEを横断したくない。
ということで、やっぱりなんとかVisual Studio Codeを使いたい。
プロジェクトディレクトリを綺麗にしてみる
そういえば、以前Unityのプロジェクトがおかしくなった時にLogsやらLibraryやらのファイルを綺麗にしたら解消したことがあったことを思い出しました。今回はコードのインテリセンスなので.csprojや.slnファイルを一切合切削除してみます。
- Unityを終了させます。
- Visual Studio Codeを終了させます。
- プロジェクトディレクトリに移動し、.csprojと.slnファイルを全て削除します。
- Unityを起動します。
- Assets > Open C# Project をクリックします
この作業をしたところ、無事Omnisharpが動くようになりました。
もしかしたら以前追加したり削除したりしたパッケージのプロジェクトファイルが残ったままになっていたのかもしれません。とりあえずこれで無事に動くようになってくれたので良かったです。
こんなことに半日以上費やしてしまった。
今後は同じような現象が発生したら.csprojと.slnを削除してみる!これを忘れないように覚えておこうと思います。