UnityとC#バージョンによる機能の違い注意

アイキャッチ画像

初心者のための Unity と C# 関係まとめ

UnityとC#、Mono、.NET についてまとめたものです。

C#の機能差分は把握しておくと、プログラミングするときに下に書いたトラブルで役立つかも。主に自分がはまった事項です。

  • 共通ライブラリを事前に用意していて、いざUnityに適用しようとしたとき、C#バージョン依存でコンパイルエラーがでてしまった!C#バージョンで対応した初期化方法や定義方法に結構な差がある。
  • Thread処理を記載するときのC#バージョンでの対応・非対応を確認しておく。ゲームプログラムに限らず、重たい処理を裏でThread処理することはよくあると思いますが、標準で扱えるThread関連のクラスにだいぶ差がある。

Unityでの利用可能言語

Unity は C#、Boo、Javascriptのプログラミング言語に対応しています。現在開発はC#で行っています。C#言語は .NET Framework というフレームワークとセットで開発されたプログラミング言語で、Delphi 言語に似ているとのことです。
※2018/3/18 追記:Boo言語は利用者が少ないことからUnity2017よりサポート対象外となったようです。

ややこしいのは、C# と .NET Framework がともに開発されてきたが、役割はそれぞれ全く異なる点です。

C# と .NET Framework の役割の違い

  • 「C#」はテキスト形式で記載できるプログラミング言語。
  • 「.NET Framework」はC#で書かれたプログラムをコンパイルしてバイナリの中間言語にし、 拡張子 exe の実行可能形式にする実行環境。 exe 形式を実行すると、.NET Framework が中間言語の読み取りおよびNativeコードへの変換して処理実行を行う。

.NET Framework互換とは

.NET Framework は基本的に Windows 環境を意識して作成されています。MacOS や Android 上でも動作するような.NET Framework にあたる部分が、オープンソースで作成されています。便利。Unity では Mono というC# コンパイラを利用しています。

Unity(Mono)とC# バージョンの対応

2017年7月時点で Unity 2017 が最新リリースとなっています。

Unity2017になり、いろいろとゲームエンジンが最適化されており、機能も増えているようなので、開発序盤・中盤くらいであれば、Unity 2017に乗り換えてもよいかと考えています。なお、現在のUnity(Monoコンパイラ)と C# のバージョンの依存関係は以下のようです。

  • Unity 5.6.2 は C#4 & .NET 3.5 を利用
  • Unity 2017 は C#6 & .NET 4.6 を利用

C# の各バージョンの主な違い(超ざっくりメモ)

使うUnity のバージョンによって利用可能なC# や Mono が持つ機能が異なってきます。以下はC#のバージョンと言語としての機能進化を自分なりにまとめてみたものです。

バージョン1.0(2002年にリリース)

特徴ちょっとJavaに似ているこの言語は ECMA(国際的な標準化団体)の目的にも掲げられていて、「モダンで、シンプルで、汎用的なオブジェクト指向言語」として規格された。

でも、わりとあって当然とされる ASYNC (非同期機能)の標準機能組込やGENERICSについての機能組み込みが遅れており、実際にプログラマが機能実装するときはメンドクサイ各自の実装をする必要があった。

バージョン2.0(2005年にリリース)

機能名(英語+日本語)ざっくり機能解説
C# バージョン2.0 機能差分のまとめ
Generics

総称型

List<T> のような型Tのチェック記述が可能になった。
Nullable Types

Null許容型

Nullable<int> でnull許容int 型を定義できるようになった。
Anonymous Methods

匿名メソッド

名無しのメソッド定義や、delegate利用などができるようになった。
Iterator Blocks

反復子ブロック

yeild return で繰り返し値を返すブロック(コルーチン)を定義可能になった。

バージョン3.0(2007年にリリース)

機能名(英語+日本語)ざっくり機能解説
C# バージョン3.0 機能差分のまとめ
Implicit Type

暗黙の型

var test=”文字列” など、推論が可能な型を利用可能になった。
Objects Initializers and Collection initializers

オブジェクト初期化子&コレクション初期化子

インスタンスの new 時に一緒にインスタンスで定義しているメンバを初期化するような記述が可能になった。
Anonymous Types

匿名型

匿名クラスの定義が可能になった。

例:var Enemy = new { Name = “ゴブリン”, Hp = 10, Exp = 5 };

Automatic Properties

自動実装するプロパティ

アクセサメソッドをget、set 記述で表現可能になった。
Lambda Expressions

ラムダ式

ラムダ式の記述が可能になった。バージョン2.0 の匿名メソッドを拡張したもの。
Extension Methods

拡張メソッド

既存のクラス(stringとか)にメソッドを追加可能になった。
Query Expressions

クエリ式

SQLライクな分でデータソート・抽出可能。
Partial

部分クラス

Partialキーワードを使ってクラスを複数ブロックに分割可能になった。

バージョン4.0(2010年にリリース)

機能名(英語+日本語)ざっくり機能解説
C# バージョン4.0 機能差分のまとめ
Dynamic Type

ダイナミック型

varと似ているが、こちらは実行時にメソッド定義が呼び出されるなど動的(ダイナミック)に解釈される型。
Optional Parameters

オプション引数

varと似ているが、こちらは実行時にメソッド定義が呼び出されるなど動的(ダイナミック)に解釈される型。
Named Arguments

名前付き引数

名前付きメソッド呼び出しが可能になった。

Method ( x: 10, z:5, y:23 ) という呼び方が可能になって直観的なコード記述が可能。

Generic Variance

ジェネリック型の分散

 List<int> を List<object>に変換するとき、IEnumerable<int> → <object>に変換可能とする機能。
Task

非同期Task処理

Thread 処理をTask管理可能になった。

バージョン5.0(2012年にリリース)

機能名(英語+日本語)ざっくり機能解説
C# バージョン5.0 機能差分のまとめ
await, async

非同期処理

今までのThread処理部分を読みやすく記述可能になった。
Caller Info 追加ファイル名、メソッド名、行をより簡単に出力可能になった。

バージョン6.0(2015年にリリース)

機能名(英語+日本語)ざっくり機能解説
C# バージョン6.0 機能差分のまとめ
Auto-Property Initializers

自動プロパティ初期化子

メンバ変数のアクセサ記述(get; set;)を行いながら、同時に初期化も可能。

例)public int Hitpoint { set; get; } = 100;

nameof Expression

nameof演算子

Instance名称を文字列で取得可能。

例:nameof ( ItemName ) で “ItemName” を取得。

String interpolation

文字列補間

例:var message = $”My name is {SyujinouName}”;

変数「string SyujinkouName」を埋め込んだ文字列を生成可能。

Expression-bodied function members

式形式のメンバ

メソッド本体がラムダ式で一行で記述が可能に。メンバの自動プロパティのget部分もラムダ式で記述可能になった。
Read-only Auto-properties自動プロパティに readonly キーワード指定が可能になった。
using static MethodあるクラスのStaticメソッドを直接 Using 指定し、クラスまでの記述を省略可能に。
Null-conditional Operators

Null条件演算子

「?.」演算子の追加。nullチェックを行い、結果は 「クラス名?」 へ代入される。「クラス名?」は Null許容型(Nullable Types )となる。
index initializers

インデックス初期化子

配列アクセス可能なクラスのインスタンス初期化時に内容の値を初期化設定可能。
Exception filters

例外フィルタ

例外のキャッチに加え、さらにフィルタ条件を指定可能。

例:

catch (NotFoundChestContainsException e) when (e.Message.Contains(“mimic”)){ 処理 }

await in catch and finally blocks

Catch、Finally句内での await

Catch、Finally句内でのawait利用が可能に。
#Pragma拡張Pragma でコンパイラ警告のユーザー定義による抑制が可能

非常に参考になったサイトさま

ページの更新履歴

更新日更新内容
2017.7.11ページ公開
2018.3.17スマホからレイアウトが崩れて読みにくいので修正。ついでに文章構造と内容も訂正。

シェアする

  • このエントリーをはてなブックマークに追加

フォローする