【Unity対応表】C#のバージョンはどれ?確認方法・変更方法・使える機能を徹底解説
はじめに
UnityでC#を書くときに混乱しやすいのが、「自分のUnityではC#のどのバージョンが使えるのか」という点です。
Visual Studioではエラーが出ないのにUnity Editorではコンパイルエラーになる、C# 10以降の機能を使おうとしたら怒られる、Unityを更新したのにC#の新機能が使えない、といった問題はよくあります。
結論から言うと、Unityで使えるC#バージョンはUnity Editor側が使用するC#コンパイラーと言語バージョンに依存します。Visual StudioやRiderを最新版にしても、Unity側が対応していなければ最新のC#機能は使えません。
この記事では、「c# unity version」で調べている人向けに、UnityとC#バージョンの対応表、確認方法、変更方法、使える機能、よくあるエラーの解決策までまとめて解説します。
1. Unityで使えるC#バージョンの結論【まず対応表で確認】
1-1. Unity 6・2023・2022・2021・2020のC#バージョン対応表
まずは結論です。代表的なUnityバージョンとC#言語バージョンの目安は以下のとおりです。
| Unityバージョン | 標準のC#コンパイラー | 標準のC#言語バージョン | 備考 |
|---|---|---|---|
| Unity 6 / 6000.x | Roslyn | C# 9.0 | 公式マニュアルでC# 9.0と記載 |
| Unity 2023.x | Roslyn | C# 9.0相当 | Unity 2022以降とほぼ同系統 |
| Unity 2022.3 LTS | Roslyn | C# 9.0相当 | LTSで安定運用向き |
| Unity 2021.x | Roslyn | C# 9.0相当 | C# 9の一部機能に注意 |
| Unity 2020.3 LTS | Roslyn | C# 8.0 | 一部C# 8機能は非対応 |
Unity 6の公式マニュアルでは、C#コンパイラーはRoslyn、C#言語バージョンはC# 9.0とされています。
Unity 2020.3では、公式マニュアル上でC#言語バージョンはC# 8.0と記載されています。また、C# 8.0のうち一部機能はサポート対象外です。
1-2. 現在のUnityで公式に使えるC#はどこまで?
現在のUnityで安全に使えるC#は、基本的にUnity 6ならC# 9.0までと考えるのが無難です。
Unity 6の公式ドキュメントには、C# language versionとしてC# 9.0が明記されています。つまり、UnityでC# 10、C# 11、C# 12、C# 13などの最新機能を標準サポートとして使えるわけではありません。
Unity開発では、「C#の最新版」ではなく「使用しているUnity Editorが公式にサポートしているC#バージョン」を基準にする必要があります。
1-3. C# 10・11・12・13はUnityで使えるのか?
通常は使えないと考えてください。
csc.rspやAdditional Compiler Argumentsで-langversion:10のように指定できる場合もありますが、Unityが公式に保証している使い方ではありません。コンパイルできる構文があっても、Unity Editor、IL2CPP、Mono、Burst、アセット、IDE連携などで問題が出る可能性があります。
特に業務開発や長期運用プロジェクトでは、C# 10以降を無理に有効化するより、Unity標準のC# 9.0までに収めるほうが安全です。
1-4. Unity EditorのバージョンとVisual StudioのC#バージョンは別物
Unity初心者が特に勘違いしやすいのが、Visual Studioを最新版にすればUnityでも最新C#が使える、という誤解です。
Visual Studio、Rider、VS Codeはあくまでコードを書くためのエディターです。実際にUnityプロジェクトのC#をコンパイルするのはUnity Editor側のコンパイル環境です。
そのため、Visual Studio上ではC# 10の構文が補完されても、Unityに戻るとコンパイルエラーになることがあります。
1-5. 「UnityでC#の最新機能が使えない」原因の早見表
| 症状 | 主な原因 | 対応 |
|---|---|---|
| C# 10の構文でエラーになる | UnityがC# 10を標準サポートしていない | C# 9までの構文に戻す |
| Visual Studioではエラーがない | IDE側の解析バージョンとUnity側が違う | Unity Consoleのエラーを優先する |
LangVersionを変更しても戻る | .csprojがUnityにより再生成される | .csprojを直接編集しない |
| 外部アセット導入後にエラー | アセットが要求するC#バージョンと不一致 | 対応Unityバージョンを確認する |
| IL2CPPビルドだけ失敗する | Editor上では動いてもビルド環境で非対応 | 対象プラットフォームで検証する |
2. UnityのC#バージョンを理解するための基礎知識
2-1. UnityがC#をコンパイルする仕組み
Unityでは、Assetsフォルダー内のC#スクリプトをUnity Editorが検出し、内部のC#コンパイラーでコンパイルします。
通常の.NETアプリのように、開発者が自由にSDKやcsprojを管理するのではなく、Unityがプロジェクト構成やアセンブリ参照を自動生成します。
そのため、UnityのC#バージョンは次の要素で決まります。
| 要素 | 影響 |
|---|---|
| Unity Editorのバージョン | 使用できるC#言語バージョンの大枠を決める |
| Roslynコンパイラー | C#コードを解析・コンパイルする |
| API Compatibility Level | 使える.NET APIの範囲を決める |
| asmdef | アセンブリ単位の分割に影響する |
| csc.rsp | 追加のコンパイラーオプションを指定できる |
2-2. UnityのC#言語バージョンとは何か
C#言語バージョンとは、record、switch expression、nullable reference types、pattern matchingなど、どのC#構文を使えるかを決めるものです。
たとえば、以下のような構文はC#バージョンによって使用可否が変わります。
C#// C# 9.0のrecord
public record PlayerData(string Name, int Level);
UnityがC# 9.0をサポートしていれば、recordなど一部のC# 9機能を使えます。ただし、UnityではC# 9.0のすべての機能が完全に使えるとは限らない点に注意が必要です。
2-3. .NET Standard・.NET Framework・API Compatibility Levelとの違い
C#バージョンと.NETのバージョンは別物です。
C#バージョンは「言語構文」の話です。一方、.NET Standardや.NET Framework、API Compatibility Levelは「使えるクラスライブラリ/API」の範囲を決めます。
Unity 6の公式マニュアルでは、API Compatibility Levelとして.NET Standard 2.1と.NET Frameworkが説明されており、.NET Frameworkは.NET Framework 4.8に加えて.NET Standard 2.1の追加APIを含むとされています。
| 項目 | 意味 |
|---|---|
| C#言語バージョン | 使える構文を決める |
| .NET Standard | 共通API仕様 |
| .NET Framework | より広い.NET APIセット |
| API Compatibility Level | Unityで参照できる.NET API範囲 |
| Scripting Backend | Mono / IL2CPPなど実行・ビルド方式 |
2-4. RoslynコンパイラーとUnityの関係
RoslynはMicrosoft製のC#コンパイラープラットフォームです。UnityもC#コードのコンパイルにRoslynを使用しています。
ただし、Roslynを使っているからといって、常に最新C#が使えるわけではありません。Unity Editorが同梱しているコンパイラーや、Unityが指定するコンパイル設定に従う必要があります。
つまり、「Roslyn対応=C#最新版対応」ではありません。
2-5. Unityのバージョンを上げるとC#も自動で新しくなるのか
基本的には、Unity Editorのバージョンを上げるとC#言語バージョンも新しくなる可能性があります。
たとえば、Unity 2020.3ではC# 8.0、Unity 6ではC# 9.0が公式に示されています。
ただし、Unityを更新しても必ず最新C#に追従するわけではありません。Unityはゲームエンジンとしての安定性、プラットフォーム互換性、IL2CPP、Burst、エディター連携などを考慮してC#サポートを決めています。
3. UnityプロジェクトでC#バージョンを確認する方法
3-1. Unity公式ドキュメントで確認する方法
最も確実なのは、使用しているUnityバージョンの公式マニュアルで「C# compiler」または「C# compiler and language version reference」を確認する方法です。
Unity 6の場合、公式マニュアルに以下のような情報があります。
| 項目 | 内容 |
|---|---|
| C# compiler | Roslyn |
| C# language version | C# 9.0 |
公式情報を確認するときは、自分が使っているUnity Editorのバージョンと同じドキュメントを参照してください。Unity 2020、2021、2022、Unity 6では内容が異なる場合があります。
3-2. Unity Editorの設定画面で確認すべき項目
Unity Editor上で直接「C# version」という項目が表示されるわけではありません。
ただし、以下の設定は確認しておくべきです。
Edit > Project Settingsを開くPlayerを選択するOther Settingsを開くConfiguration周辺を確認するApi Compatibility Levelを確認する
ここで確認できるのは主に.NET APIの互換レベルです。C#言語バージョンそのものではありません。
3-3. .csprojファイルでLangVersionを確認する方法
Unityプロジェクトを開くと、Assembly-CSharp.csprojなどの.csprojファイルが生成されます。
この中にLangVersionが書かれている場合があります。
XML<LangVersion>9.0</LangVersion>
ただし、Unityの.csprojは自動生成されるため、直接編集しても再生成時に上書きされます。
.csprojは確認用として見る程度にして、設定変更の本命にはしないほうが安全です。
3-4. Visual Studio・Rider・VS Code側で確認する方法
IDE側でもC#言語バージョンを確認できる場合があります。
Visual Studioでは、プロジェクトのプロパティやエラー表示から言語バージョンを確認できます。Riderでもプロジェクト設定や解析エンジンから確認できます。
ただし、Unityプロジェクトの場合はIDE側の表示とUnity Editor側の実際のコンパイル結果がずれることがあります。
最終的には、Unity Consoleでコンパイルが通るかを基準にしてください。
3-5. コンパイルエラーからC#バージョンを判別する方法
C#バージョンが原因の場合、Unity Consoleに次のようなエラーが表示されることがあります。
Feature 'global using directive' is not available in C# 9.0.
Please use language version 10.0 or greater.
このようなエラーが出た場合、使用している構文が現在のUnityのC#バージョンより新しい可能性があります。
代表例は以下です。
| 構文 | 必要なC#バージョン | Unityでの注意 |
|---|---|---|
record | C# 9.0 | Unity 6なら標準範囲内 |
global using | C# 10 | 標準では非推奨 |
file-scoped namespace | C# 10 | Unity標準では避ける |
required | C# 11 | Unity標準では避ける |
| primary constructors | C# 12 | Unity標準では避ける |
3-6. 確認時によくある勘違いと注意点
C#バージョン確認でよくある勘違いは次のとおりです。
| 勘違い | 正しい理解 |
|---|---|
| Visual Studioが最新版なら最新C#が使える | Unityのコンパイラー設定が優先 |
| .NET Frameworkを選べばC#も新しくなる | API範囲とC#構文は別 |
.csprojを書き換えれば固定できる | Unityが再生成するため不安定 |
| Editorで動けば全プラットフォームで動く | IL2CPPや対象OSで失敗する場合がある |
| C# 9対応ならC# 9機能は全部安全 | Unityでは一部制限に注意 |
4. UnityでC#バージョンを変更する方法
4-1. Unityの標準設定で変更できる範囲
Unityでは、通常のプロジェクト設定画面からC#言語バージョンを自由に変更する項目はありません。
基本方針は、使用中のUnity Editorが標準でサポートするC#バージョンを使うことです。
C#バージョンを上げたい場合は、まずUnity Editor自体を新しいLTSやUnity 6へ更新することを検討します。
4-2. Api Compatibility Levelを変更する手順
API Compatibility Levelを変更すると、使用できる.NET APIの範囲が変わります。
手順は以下です。
Unity Editorで
Edit > Project Settingsを開くPlayerを選択するOther Settingsを開くConfigurationを探すApi Compatibility Levelを変更するUnityを再コンパイルする
選択肢はUnityバージョンによって異なりますが、Unity 6では.NET Standard 2.1と.NET Frameworkが説明されています。
注意点として、API Compatibility Levelを変えてもC#言語バージョンがC# 10やC# 11に上がるわけではありません。
4-3. Additional Compiler Argumentsでlangversionを指定する方法
Unityでは、追加のコンパイラー引数を使ってlangversionを指定できる場合があります。
例:
-langversion:9.0
または実験的に次のように指定するケースもあります。
-langversion:10.0
ただし、Unityが公式にサポートしていないC#バージョンを指定すると、Editor上では一部通ってもビルドやプラットフォーム依存部分で問題が起きる可能性があります。
基本的には、Unity公式サポート範囲内で使うことをおすすめします。
4-4. csc.rspを使ってコンパイラーオプションを指定する方法
csc.rspは、UnityのC#コンパイラーに追加オプションを渡すためのファイルです。
たとえば、Assetsフォルダー直下にcsc.rspを作成し、以下のように書きます。
-langversion:9.0
nullableを有効にしたい場合は、次のような指定を使うこともあります。
-nullable:enable
ただし、csc.rspを使った設定はプロジェクト全体に影響する場合があります。チーム開発では必ず共有し、CIやビルド環境でも同じ設定になるよう管理してください。
4-5. asmdefを使ってアセンブリ単位で管理する方法
Unityでは、Assembly Definition File、つまりasmdefを使ってスクリプトのコンパイル単位を分けられます。
asmdefを使うメリットは以下です。
| メリット | 内容 |
|---|---|
| コンパイル時間短縮 | 変更したアセンブリだけ再コンパイルしやすい |
| 依存関係の整理 | 参照関係を明確にできる |
| テスト分離 | Editor用、Runtime用、Tests用を分けられる |
| 設定管理 | アセンブリ単位で構成を整理しやすい |
ただし、C#言語バージョンをアセンブリ単位で自由自在に変える運用は複雑になりがちです。特別な理由がなければ、プロジェクト全体でC#バージョンを統一しましょう。
4-6. .csprojを直接編集してはいけない理由
Unityプロジェクトの.csprojはUnityが自動生成します。
そのため、以下のように直接編集しても、
XML<LangVersion>10.0</LangVersion>
Unity側の再生成で消えることがあります。
.csprojを直接編集すると、チームメンバーの環境で再現しなかったり、CIで失敗したり、IDE再読み込み時に設定が戻ったりします。
Unityでコンパイラー設定を変更したい場合は、.csprojではなく、Unityが想定している設定方法を使いましょう。
4-7. C# 10以降を無理に有効化する場合のリスク
C# 10以降を無理に有効化すると、以下のリスクがあります。
| リスク | 内容 |
|---|---|
| Unity Editorでエラー | コンパイラーが構文を認識しない |
| IDEとUnityの不一致 | IDEではOKでもUnityでNG |
| IL2CPPビルド失敗 | Editor実行では見つからない問題が出る |
| Burst非対応 | 高速化対象コードで使えない可能性 |
| アセット互換性低下 | 外部アセットと衝突する可能性 |
| チーム開発の混乱 | メンバー環境で結果が変わる |
学習用や個人実験なら試す価値はありますが、公開予定のゲームや業務案件では避けるのが無難です。
5. Unityで使えるC#の主な機能一覧
5-1. C# 7.xで使える代表的な機能
Unityで広く安全に使いやすいのがC# 7.xまでの機能です。
代表的な機能は以下です。
| 機能 | 例 |
|---|---|
| タプル | (int x, int y) |
| out変数宣言 | if (int.TryParse(s, out var n)) |
| パターンマッチング | if (obj is Player p) |
| ローカル関数 | メソッド内に関数を書く |
| switchの拡張 | 型判定など |
例:
C#if (target is Enemy enemy)
{
enemy.Damage(10);
}
C# 7.xの機能は、Unity開発でも比較的安心して使えます。
5-2. C# 8.0で使える代表的な機能
C# 8.0では、よりモダンな構文が追加されました。
| 機能 | 概要 |
|---|---|
| switch式 | 値を返すswitch |
| using宣言 | スコープ終了時に自動Dispose |
| null合体代入 | ??= |
| nullable reference types | null安全性の向上 |
| static local functions | staticなローカル関数 |
例:
C#string label = state switch
{
GameState.Ready => "準備中",
GameState.Playing => "プレイ中",
GameState.GameOver => "終了",
_ => "不明"
};
Unity 2020.3ではC# 8.0が使用されますが、一部機能は公式に非対応とされています。
5-3. C# 9.0で使える代表的な機能
C# 9.0では、recordやinitなどが追加されました。
| 機能 | 概要 |
|---|---|
| record | 値ベースのデータ型 |
| init-only setter | 初期化時だけ代入可能 |
| target-typed new | 型推論されたnew |
| pattern matching強化 | 条件分岐を簡潔に書ける |
| top-level statements | Mainを省略できる |
例:
C#public record CharacterStatus(string Name, int Hp, int Attack);
Unity 6ではC# 9.0が公式に示されています。
5-4. Unityで一部サポートされないC# 9.0機能
UnityでC# 9.0とされていても、すべてのC# 9機能をUnity開発で積極的に使うべきとは限りません。
特に注意したいのは以下です。
| 機能 | 注意点 |
|---|---|
| record | Unityのシリアライズ対象としては扱いに注意 |
| init | Unity Inspectorとの相性に注意 |
| top-level statements | Unityスクリプトでは通常使わない |
| module initializer | Unityの初期化順序と混乱しやすい |
| source generator | Unity環境では制約が出やすい |
Unityでは、C#の言語仕様として使えることと、Unityのシリアライズ、Inspector、MonoBehaviour、ScriptableObjectと相性が良いことは別です。
5-5. C# 10以降の機能が使えないケース
C# 10以降の代表的な機能には以下があります。
| C#バージョン | 機能例 |
|---|---|
| C# 10 | global using、file-scoped namespace |
| C# 11 | required、raw string literals |
| C# 12 | primary constructors、collection expressions |
| C# 13 | params collectionsなど |
これらはUnity標準のC# 9.0環境では基本的に使えません。
たとえば、以下はC# 10のfile-scoped namespaceです。
C#namespace MyGame.Player;
public class PlayerController
{
}
Unityの標準サポート範囲を重視するなら、従来のnamespace形式にしておきましょう。
C#namespace MyGame.Player
{
public class PlayerController
{
}
}
5-6. ゲーム開発で特に便利なC#機能
Unity開発で特に便利なのは、最新すぎる構文よりも、読みやすさと保守性を上げる機能です。
| 機能 | 使いどころ |
|---|---|
| enum + switch式 | 状態管理 |
| パターンマッチング | 型ごとの処理分岐 |
| タプル | 一時的な複数値返却 |
| readonly struct | 軽量な値型 |
| LINQ | エディター拡張や小規模データ処理 |
| async/await | 通信、ロード、非同期処理 |
| null合体演算子 | nullチェックの簡略化 |
例:
C#public int GetScoreBonus(PlayerRank rank)
{
return rank switch
{
PlayerRank.S => 1000,
PlayerRank.A => 500,
PlayerRank.B => 200,
_ => 0
};
}
5-7. Unityでは避けたほうがよいC#機能
Unityでは、言語機能として使えても避けたほうがよいものがあります。
| 機能 | 避けたい理由 |
|---|---|
| 過剰なLINQ | GC Allocが増える場合がある |
| dynamic | IL2CPPやAOT環境で問題になりやすい |
| reflection多用 | パフォーマンスとビルド時に注意 |
| 複雑なasync/await | MonoBehaviourのライフサイクルと競合しやすい |
| 最新C#構文 | チーム・アセット・ビルド環境と不一致になりやすい |
ゲーム開発では、最新構文よりも「安定してビルドできる」「チーム全員が読める」「プラットフォーム差が出にくい」ことを優先しましょう。
6. C#バージョン関連のよくあるエラーと解決策
6-1. 「この機能はC# ○○以降で使用できます」と表示される
典型的なC#バージョン不一致エラーです。
例:
Feature 'file-scoped namespace' is not available in C# 9.0.
Please use language version 10.0 or greater.
この場合、使っている構文がUnityのC#バージョンより新しいことが原因です。
解決策は以下です。
| 解決策 | 内容 |
|---|---|
| 構文を古い書き方に戻す | 最も安全 |
| Unityを更新する | 新しいC#対応が必要な場合 |
| langversion指定を見直す | 実験用途なら可 |
| 外部コードを修正する | アセットやライブラリの場合 |
6-2. Visual StudioではエラーがないのにUnityでコンパイルエラーになる
これはIDE側とUnity側のC#解析環境がずれているときに起こります。
Visual Studioは最新C#構文を認識していても、Unity Editorのコンパイラーが対応していなければUnityではエラーになります。
対策は以下です。
Unity Consoleのエラーを優先する
.csprojを再生成するIDEを閉じてUnityから開き直す
使用しているUnityバージョンの公式C#対応を確認する
C# 10以降の構文を使っていないか確認する
6-3. LangVersionを指定しても反映されない
LangVersionを.csprojに直接書いている場合、Unityが.csprojを再生成して設定が消えることがあります。
また、csc.rspの配置場所やasmdef構成によって、想定したアセンブリにオプションが効いていない場合もあります。
確認ポイントは以下です。
| 確認項目 | 内容 |
|---|---|
.csprojを直接編集していないか | 直接編集は避ける |
csc.rspの場所 | 対象アセンブリに効いているか |
| asmdefの有無 | アセンブリ分割の影響を確認 |
| Unity再起動 | 設定反映のため再起動する |
| Library再生成 | 必要に応じて再インポートする |
6-4. Unityを更新したのにC#バージョンが変わらない
Unityを更新しても、期待したC#バージョンにならないことがあります。
主な理由は以下です。
| 原因 | 内容 |
|---|---|
| 更新先Unityが最新C#に未対応 | Unity 6でも標準はC# 9.0 |
| プロジェクト設定が古い | API Compatibility Levelなどを確認 |
| IDE側キャッシュ | .csproj再生成が必要 |
| asmdefやrsp設定 | 古い指定が残っている |
| パッケージ制約 | 一部パッケージが古いUnity前提 |
Unity 6でも公式のC#言語バージョンはC# 9.0です。C# 10以降を期待して更新しても、標準では使えない点に注意してください。
6-5. パッケージやアセット導入後にC#バージョンエラーが出る
アセットストアやGitHubから導入したライブラリが、Unity標準より新しいC#構文を使っている場合があります。
たとえば、以下のような構文が含まれていると、Unityの標準C#バージョンではエラーになることがあります。
C#namespace SomeAsset.Core;
これはC# 10のfile-scoped namespaceです。
対策は以下です。
アセットの対応Unityバージョンを確認する
古いバージョンのアセットを使う
該当コードをUnity対応構文に修正する
開発元のアップデートを確認する
無理にC# 10を有効化しない
6-6. IL2CPP・Mono・Burst使用時の注意点
Unityでは、Editor上の実行と実機ビルドで挙動が変わることがあります。
| 環境 | 注意点 |
|---|---|
| Mono | Editor実行や一部プラットフォームで使用 |
| IL2CPP | AOT変換により制約が出る場合がある |
| Burst | 対応できるC#機能に制限がある |
| WebGL | スレッドや一部APIに制約がある |
| iOS | AOT環境の制限に注意 |
特にreflection、dynamic、複雑なジェネリック、非対応APIはIL2CPPで問題になりやすいです。
C#バージョンだけでなく、最終的なビルド対象でも検証しましょう。
6-7. ビルド対象プラットフォームごとの注意点
Unityはマルチプラットフォーム対応のゲームエンジンです。
Editorでコンパイルが通っても、以下のような環境では追加の注意が必要です。
| プラットフォーム | 注意点 |
|---|---|
| Windows / macOS | 比較的検証しやすい |
| iOS | IL2CPP、AOT制約に注意 |
| Android | IL2CPP / Mono設定に注意 |
| WebGL | 使用できないAPIがある |
| Console | 専用SDKや制約に注意 |
| VR / XR | パフォーマンスとGCに注意 |
C#の新機能を使う場合は、Editorだけでなく実機ビルドまで確認することが重要です。
7. UnityでC#の新機能を使うべきか判断するポイント
7-1. 個人開発・学習用途ならどこまで使ってよいか
個人開発や学習用途であれば、Unityが標準対応しているC# 9.0までの機能は積極的に試して問題ありません。
ただし、C# 10以降の機能を使う場合は、次の前提を理解しておきましょう。
| 条件 | 判断 |
|---|---|
| 学習用プロジェクト | 試してもよい |
| 公開予定なし | 実験しやすい |
| 自分だけが開発 | 環境差が少ない |
| ストア公開予定 | 標準サポート内が安全 |
| 長期運用予定 | 無理な有効化は避ける |
7-2. チーム開発でC#バージョンを統一すべき理由
チーム開発では、C#バージョンを統一しないとトラブルの原因になります。
たとえば、あるメンバーの環境ではC# 10構文が通るのに、別のメンバーのUnityではエラーになる、といった状況が起こります。
チームでは以下を明文化しましょう。
| 項目 | 例 |
|---|---|
| Unityバージョン | Unity 2022.3 LTSなど |
| C#バージョン | C# 9.0まで |
| API Compatibility Level | .NET Standard 2.1など |
| IDE | Visual Studio / Riderの推奨版 |
| 禁止構文 | global using、file-scoped namespaceなど |
7-3. アセットストア製品や外部ライブラリとの互換性
Unity開発では、自作コードだけでなくアセットストア製品やNuGet由来のライブラリを使うことがあります。
外部ライブラリを導入するときは、以下を確認してください。
| 確認項目 | 内容 |
|---|---|
| 対応Unityバージョン | 使用中のUnityに対応しているか |
| C#バージョン | 新しすぎる構文を使っていないか |
| .NET Standard | UnityのAPI Compatibility Levelと合うか |
| IL2CPP対応 | 実機ビルドで動くか |
| 更新頻度 | メンテナンスされているか |
特に一般的な.NETライブラリは、Unityではそのまま使えないことがあります。
7-4. 長期運用プロジェクトで安定性を優先する考え方
長期運用するゲームでは、最新C#機能より安定性を優先すべきです。
理由は以下です。
| 理由 | 内容 |
|---|---|
| Unity更新の影響を受ける | バージョンアップ時に問題が出る |
| アセット依存がある | 外部コードとの互換性が重要 |
| 複数プラットフォーム対応 | ビルド環境差が出やすい |
| チーム入れ替わり | 読みやすいコードが重要 |
| 保守期間が長い | 特殊設定は負債になりやすい |
長期運用では、Unity標準の範囲内で、誰でも理解しやすいC#を書くことが重要です。
7-5. 最新C#機能よりUnity標準サポートを優先すべきケース
以下に当てはまる場合は、最新C#機能よりUnity標準サポートを優先しましょう。
| ケース | 理由 |
|---|---|
| 商用ゲーム | ビルド安定性が重要 |
| 複数人開発 | 環境差を減らすため |
| アセットを多用 | 互換性を守るため |
| IL2CPP必須 | AOT制約を避けるため |
| コンソール対応 | 専用環境での検証が必要 |
| 初心者が多いチーム | 読みやすさを優先 |
「使えるか」より「安全に運用できるか」で判断しましょう。
7-6. 将来のUnityアップデートに備えた設計方針
将来的にUnityがより新しいC#に対応しても、すぐに全機能を使う必要はありません。
おすすめの設計方針は以下です。
Unity標準サポート範囲内で書く
最新構文に依存しすぎない
asmdefで依存関係を整理する
プラットフォーム依存コードを分離する
CIでビルド検証する
C#バージョン方針をREADMEに書く
これにより、Unity更新時のトラブルを減らせます。
8. UnityとC#バージョンに関するFAQ
8-1. Unityで使っているC#のバージョンはどこで見られる?
使用中のUnityバージョンの公式マニュアルで「C# compiler」または「C# compiler and language version reference」を確認するのが確実です。
Unity 6では、公式マニュアルにC# language versionとしてC# 9.0と記載されています。
8-2. Unity 2022やUnity 6ではC# 10を使える?
標準サポートとしては、C# 10ではなくC# 9.0までと考えるのが安全です。
csc.rspなどでC# 10を指定できる場合もありますが、Unity公式の標準サポート外になる可能性があるため、業務開発や公開予定のプロジェクトでは避けるのが無難です。
8-3. Visual Studioを最新版にすればUnityでも最新C#が使える?
使えません。
Visual Studioはコード編集や補完を行うIDEです。UnityプロジェクトのC#を最終的にコンパイルするのはUnity Editor側です。
そのため、Visual Studioが最新C#を認識していても、Unityが対応していなければコンパイルエラーになります。
8-4. .NETのバージョンを変えればC#バージョンも変わる?
変わりません。
.NET Standardや.NET Framework、API Compatibility Levelは、主に使えるAPIの範囲を決める設定です。C#言語バージョンは、使える構文を決めるものです。
両者は関係しますが、同じものではありません。
8-5. C#バージョンを上げると既存プロジェクトに影響はある?
あります。
新しいC#構文を導入すると、チームメンバーの環境、外部アセット、ビルドターゲット、IL2CPP、Burstなどに影響する可能性があります。
既存プロジェクトでは、C#バージョンを上げる前に以下を確認しましょう。
| 確認項目 | 内容 |
|---|---|
| Unityバージョン | 全員同じか |
| IDE設定 | 解析結果が一致するか |
| CI | 自動ビルドが通るか |
| 対象プラットフォーム | 実機ビルドできるか |
| アセット | 互換性があるか |
8-6. 初心者はどのC#バージョンを学べばよい?
Unity初心者は、まずC#の基本文法を学べば十分です。
具体的には、以下を優先しましょう。
| 優先度 | 学ぶ内容 |
|---|---|
| 高 | 変数、if、for、クラス、メソッド |
| 高 | MonoBehaviour、GameObject、Transform |
| 中 | List、Dictionary、enum |
| 中 | プロパティ、interface、イベント |
| 中 | async/await、LINQ |
| 低 | record、nullable、最新C#構文 |
最初からC# 10やC# 12の機能を覚える必要はありません。Unityで安定して使えるC#の基本を身につけるほうが重要です。
8-7. Unityで安全に使えるC#機能の範囲はどこまで?
Unity 6を基準にするなら、C# 9.0までを基本範囲と考えるのが安全です。
ただし、Unityのシリアライズ、Inspector、IL2CPP、Burst、対象プラットフォームとの相性を考えると、実務ではC# 7.x〜C# 8.0相当の機能を中心に使い、C# 9.0機能は必要に応じて慎重に使うのがおすすめです。
まとめ
Unityで使えるC#バージョンは、Visual StudioやRiderではなくUnity Editor側のコンパイラーと言語バージョンで決まります。
Unity 6では公式にC# 9.0が示されており、Unity 2020.3ではC# 8.0が示されています。
C# 10、C# 11、C# 12、C# 13などの最新機能は、Unity標準では使えないと考えるのが安全です。
重要なポイントは次のとおりです。
| ポイント | 結論 |
|---|---|
| UnityのC#バージョン | Unity Editor側で決まる |
| Visual Studio最新版 | UnityのC#対応とは別 |
| Unity 6 | C# 9.0 |
| Unity 2020.3 | C# 8.0 |
| C# 10以降 | 標準サポート外と考える |
.csproj編集 | 直接編集は避ける |
| API Compatibility Level | C#構文ではなく.NET API範囲 |
| 実務開発 | Unity標準サポートを優先 |
UnityでC#を書くときは、「最新のC#機能を使えるか」ではなく、「Unityが公式にサポートしており、チームとビルド環境で安全に使えるか」を基準に判断しましょう。

