いつものようにUnityプロジェクトを作り、VSCodeでScriptをいじると、
オートコンプリート(入力補完)が使えず、アセンブリが読み込まれていないみたいでした。
バグっているのかと思い、.csprojと.sln、.vscodeを削除してみたがやっぱり直らず。
VSCodeを見るとOmniSharpからエラーが出てました。
Starting OmniSharp server at 2019-5-31 07:42:34
Target: c:\Users\densy\Documents\InstNet\InstNet.sln
OmniSharp server started.
Path: C:\Users\densy\.vscode\extensions\ms-vscode.csharp-1.19.1\.omnisharp\1.32.19\OmniSharp.exe
PID: 6600
... (省略)
[fail]: OmniSharp.MSBuild.ProjectLoader
The reference assemblies for framework ".NETFramework,Version=v4.7.1" were not found. To resolve this, install the SDK or Targeting Pack for this framework version or retarget your application to a version of the framework for which you have the SDK or Targeting Pack installed. Note that assemblies will be resolved from the Global Assembly Cache (GAC) and will be used in place of reference assemblies. Therefore your assembly may not be correctly targeted for the framework you intend.
[warn]: OmniSharp.MSBuild.ProjectManager
Failed to load project file 'c:\Users\densy\Documents\InstNet\Assembly-CSharp.csproj'.
c:\Users\densy\Documents\InstNet\Assembly-CSharp.csproj
C:\Users\densy\.vscode\extensions\ms-vscode.csharp-1.19.1\.omnisharp\1.32.19\.msbuild\Current\Bin\Microsoft.Common.CurrentVersion.targets(1183,5): Error: The reference assemblies for framework ".NETFramework,Version=v4.7.1" were not found. To resolve this, install the SDK or Targeting Pack for this framework version or retarget your application to a version of the framework for which you have the SDK or Targeting Pack installed. Note that assemblies will be resolved from the Global Assembly Cache (GAC) and will be used in place of reference assemblies. Therefore your assembly may not be correctly targeted for the framework you intend.
[fail]: OmniSharp.MSBuild.ProjectManager
Attempted to update project that is not loaded: c:\Users\densy\Documents\InstNet\Assembly-CSharp.csproj
.NET v4.7.1が見つからないと言われます。
考えられるエラーの理由は、Unityを更新してから初めてプロジェクトを作ったということ。
調べてみると、Unityのプロジェクトで使っている.NETのバージョンが4.xになっていました。
そこで早速Microsoft .Net Frameworkを更新してみたのですが、
すでにインストールされていると言われてしまいました。
1. .NETのバージョンを3.5に変更する
Unity側でProject Settingsから、
Player > Other > Settings > Configuration > Scripting Runtime Version
を3.5に変更すれば.NETのバージョンを3.5に変更でき、すぐに使えるのですが、
今回はECSなどをやってみたいので、その方法はなし。
2. Assembly-CSharp.csprojのTargetFrameworkVersionをいじる
できれば避けたいのですが、プロジェクトフォルダにあるAssembly-CSharp.csprojを編集して、
TargetFrameworkVersionを持っているバージョンに書き換えることでアセンブリを読み込めますが、
Unityを起動するたびにもとに戻されてしまうので、いい方法ではありません。
3. VSCodeで.NET 4.7.1のアセンブリを参照できるようにする (Visual Studio必須)
まずはこちらですが、Visual Studioが必要らしいです。
https://qiita.com/riekure/items/c45868f37a187f8e1d69
VSCodeで.NETのアセンブリを参照できるようにするためにわざわざVisual Studioをインストールしなければならないのか?こんなんしてたらVSCodeユーザー減るぞ。。。と、思いました。(結構この件に時間を消費してる)
他に方法はないのか
他に方法がないかと調べて、
とりあえず、自分の.NETのバージョンを調べてみたら.NET 4.7.2がインストールされていました。
更に調べると、2018.3以前にあった問題で.NET 4.5が見つからないということがあったみたいです。
https://github.com/Unity-Technologies/vscode-unity-debug/issues/115
こちらでは.NET 4.5.2のDeveloper Packをダウンロードして、フォルダ名を変更するという方法でした。
https://dotnet.microsoft.com/download/dotnet-framework/net471
この方法を参考に、こちらから.NET 4.7.1のDeveloper Packをダウンロードしてみましたが、
うまくいきませんでした。
さらに調べる
エラーの問題ばかり調べていたので、話を戻してオートコンプリートが効かないという問題から調べてみました。
するとこちらを見つけました。
https://qiita.com/gomasilver/items/43e63fd8741277356802
ですが、こちらにはVSCodeの公式サイトに書かれている方法で対処していますが、
私が見たタイミングでは現在、書かれている内容が異なり、
.NET 4.6 Targeting Packをダウンロードするよう書かれていました。
ですが、その方法では解決しませんでした。
.NET 4.7.1のTargeting Packではないのかと思い調べてみましたが、
そんなものはありませんでした。
こちらは2016年の内容なので、今では異なるのかもしれません。
またLegacy C# Support拡張機能も見つかりませんでした。
さらにさらに調べる
次はこちらを見つけましたが、Macでした。こちらも2016年のものです。
https://qiita.com/MARQUE/items/01813b7046b103d1e8e1
こちらではLegacy C# Supportだけではコード補完ができないため、
Monoを入れていました。
ですので、こちらでもMonoを入れてみました。すると、
コード補完ができる!と思ったのですが、
Unity関連に全く対応せず、エラーも正しく表示されませんでした。
結局、自分のところではVisual Studioが必要な方法しかわかりませんでした。
自分の場合、Unity 2018.4(2018.4.0f1)かつ、見つからない.NETが4.7.1だったのか、調べても英語しか出てこないため、調べるのが大変でした。
VSCode以外ではできるのか、みんなはどうやっているのか、
他に方法がありましたら、ぜひ教えてください。