Unity

VS Code で Unity の補完が効かない時に見る所

プロジェクトが読み込まれず IntelliSense が死んでいる時、原因の大半は .NET SDK かパスです。確認する順番を書いておきます。

#Unity #VSCode

Unity のスクリプトを VS Code で開いたら補完が一切効かない、using UnityEngine; に赤い波線が出る、という状態になりました。拡張機能の入れ直しを何度かやって時間を溶かしたので、確認する順番を残しておきます。

1. まず .NET SDK が入っているか

一番多い原因がこれでした。C# 拡張はプロジェクトを読み込むのに .NET SDK を使いますが、これがパスから見えていないと何も起きずに黙って失敗します。

dotnet --version

command not found や「用語として認識されません」が返ってきたら、SDK が入っていないかパスが通っていません。.NET SDK を入れて、ターミナルではなく VS Code 自体を再起動します。VS Code は起動時の環境変数を持ち続けるので、ターミナルだけ開き直しても直りません。

確認は VS Code の出力パネルで行えます。表示 → 出力 → ドロップダウンから「C#」を選ぶと、読み込みのログが出ます。SDK が見つかっていない場合はここに理由が書いてあります。

2. .sln が生成されているか

プロジェクトのルートに .sln と .csproj がなければ、拡張機能は読むものがありません。Unity 側で作らせます。

Unity の Edit → Preferences → External Tools を開いて、External Script Editor が Visual Studio Code になっているか確認します。なっていたら、その下の Regenerate project files を押します。

それでも生成されない時は、Assets の外にある .sln .csproj Library/ を一度消してから Unity を再起動すると作り直されます。Library/ は再生成されるので消して問題ありません。

3. プロジェクトのパスを疑う

ここが自分のケースで効いた話です。プロジェクトの置き場所が

C:\Users\...\OneDrive\ドキュメント\My project (1)\

のようになっていました。この中に問題になり得る要素が3つ入っています。

  • OneDrive — ファイルがクラウドのみの状態だとツールから実体が見えないことがある
  • 日本語 — 一部のツールチェーンが非 ASCII のパスで転ぶ
  • スペースと括弧 — コマンドライン引数として渡された時に切れる

補完が効かない以外にも、ビルドが不定期に失敗する、Git が重い、といった症状の原因にもなります。

対策は単純で、プロジェクトを OneDrive の外の、ASCII だけの短いパスに移すことです。

D:\unity\my-project\

移動したら Library/ を消して Unity で開き直し、もう一度 Regenerate project files を実行します。

ちなみに Unity のプロジェクトを OneDrive に置くこと自体、同期対象のファイルが数万件になるので避けた方がいいです。バックアップは Git と .gitignore でやる方が結果的に軽くなります。

確認する順番

  1. dotnet --version が通るか
  2. .sln がプロジェクトルートにあるか
  3. パスに OneDrive・日本語・スペースが含まれていないか
  4. 出力パネルの「C#」に何が出ているか

拡張機能の再インストールは最後で十分です。自分の場合は1番でした。