【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.xRoslynC# 9.0公式マニュアルでC# 9.0と記載
Unity 2023.xRoslynC# 9.0相当Unity 2022以降とほぼ同系統
Unity 2022.3 LTSRoslynC# 9.0相当LTSで安定運用向き
Unity 2021.xRoslynC# 9.0相当C# 9の一部機能に注意
Unity 2020.3 LTSRoslynC# 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#言語バージョンとは、recordswitch expressionnullable reference typespattern 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 LevelUnityで参照できる.NET API範囲
Scripting BackendMono / 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# compilerRoslyn
C# language versionC# 9.0

公式情報を確認するときは、自分が使っているUnity Editorのバージョンと同じドキュメントを参照してください。Unity 2020、2021、2022、Unity 6では内容が異なる場合があります。

3-2. Unity Editorの設定画面で確認すべき項目

Unity Editor上で直接「C# version」という項目が表示されるわけではありません。

ただし、以下の設定は確認しておくべきです。

  1. Edit > Project Settingsを開く

  2. Playerを選択する

  3. Other Settingsを開く

  4. Configuration周辺を確認する

  5. 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での注意
recordC# 9.0Unity 6なら標準範囲内
global usingC# 10標準では非推奨
file-scoped namespaceC# 10Unity標準では避ける
requiredC# 11Unity標準では避ける
primary constructorsC# 12Unity標準では避ける

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の範囲が変わります。

手順は以下です。

  1. Unity EditorでEdit > Project Settingsを開く

  2. Playerを選択する

  3. Other Settingsを開く

  4. Configurationを探す

  5. Api Compatibility Levelを変更する

  6. 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 typesnull安全性の向上
static local functionsstaticなローカル関数

例:

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では、recordinitなどが追加されました。

機能概要
record値ベースのデータ型
init-only setter初期化時だけ代入可能
target-typed new型推論されたnew
pattern matching強化条件分岐を簡潔に書ける
top-level statementsMainを省略できる

例:

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開発で積極的に使うべきとは限りません。

特に注意したいのは以下です。

機能注意点
recordUnityのシリアライズ対象としては扱いに注意
initUnity Inspectorとの相性に注意
top-level statementsUnityスクリプトでは通常使わない
module initializerUnityの初期化順序と混乱しやすい
source generatorUnity環境では制約が出やすい

Unityでは、C#の言語仕様として使えることと、Unityのシリアライズ、Inspector、MonoBehaviour、ScriptableObjectと相性が良いことは別です。

5-5. C# 10以降の機能が使えないケース

C# 10以降の代表的な機能には以下があります。

C#バージョン機能例
C# 10global using、file-scoped namespace
C# 11required、raw string literals
C# 12primary constructors、collection expressions
C# 13params 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では、言語機能として使えても避けたほうがよいものがあります。

機能避けたい理由
過剰なLINQGC Allocが増える場合がある
dynamicIL2CPPやAOT環境で問題になりやすい
reflection多用パフォーマンスとビルド時に注意
複雑なasync/awaitMonoBehaviourのライフサイクルと競合しやすい
最新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ではエラーになります。

対策は以下です。

  1. Unity Consoleのエラーを優先する

  2. .csprojを再生成する

  3. IDEを閉じてUnityから開き直す

  4. 使用しているUnityバージョンの公式C#対応を確認する

  5. 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です。

対策は以下です。

  1. アセットの対応Unityバージョンを確認する

  2. 古いバージョンのアセットを使う

  3. 該当コードをUnity対応構文に修正する

  4. 開発元のアップデートを確認する

  5. 無理にC# 10を有効化しない

6-6. IL2CPP・Mono・Burst使用時の注意点

Unityでは、Editor上の実行と実機ビルドで挙動が変わることがあります。

環境注意点
MonoEditor実行や一部プラットフォームで使用
IL2CPPAOT変換により制約が出る場合がある
Burst対応できるC#機能に制限がある
WebGLスレッドや一部APIに制約がある
iOSAOT環境の制限に注意

特にreflection、dynamic、複雑なジェネリック、非対応APIはIL2CPPで問題になりやすいです。

C#バージョンだけでなく、最終的なビルド対象でも検証しましょう。

6-7. ビルド対象プラットフォームごとの注意点

Unityはマルチプラットフォーム対応のゲームエンジンです。

Editorでコンパイルが通っても、以下のような環境では追加の注意が必要です。

プラットフォーム注意点
Windows / macOS比較的検証しやすい
iOSIL2CPP、AOT制約に注意
AndroidIL2CPP / 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など
IDEVisual Studio / Riderの推奨版
禁止構文global using、file-scoped namespaceなど

7-3. アセットストア製品や外部ライブラリとの互換性

Unity開発では、自作コードだけでなくアセットストア製品やNuGet由来のライブラリを使うことがあります。

外部ライブラリを導入するときは、以下を確認してください。

確認項目内容
対応Unityバージョン使用中のUnityに対応しているか
C#バージョン新しすぎる構文を使っていないか
.NET StandardUnityの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#に対応しても、すぐに全機能を使う必要はありません。

おすすめの設計方針は以下です。

  1. Unity標準サポート範囲内で書く

  2. 最新構文に依存しすぎない

  3. asmdefで依存関係を整理する

  4. プラットフォーム依存コードを分離する

  5. CIでビルド検証する

  6. 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 6C# 9.0
Unity 2020.3C# 8.0
C# 10以降標準サポート外と考える
.csproj編集直接編集は避ける
API Compatibility LevelC#構文ではなく.NET API範囲
実務開発Unity標準サポートを優先

UnityでC#を書くときは、「最新のC#機能を使えるか」ではなく、「Unityが公式にサポートしており、チームとビルド環境で安全に使えるか」を基準に判断しましょう。