Unity 5.5 ベータを入れてみたという話。

ブログ曰く、「Mono C# コンパイラー がMono4.4にアップグレードしました。」とのことなので、これ、C# 6使えるはずよね?と。

公式サポートはC# 4

リリースノートを見ると、「C# 4です」って書かれてるわけですが。 Mono 4.4のコンパイラーを使っててC# 6使えないとかお前は何を言っているんだ…

まあ、標準ライブラリの方が .NET Framework 3.5相当のままなので、Taskクラスが使えない。 なので当然、普通にやるとasync/awaitが使えない。 その状況下で「C# 6対応」とか言っちゃったら、問い合わせ押し寄せてやばいでしょうから、公式には「C# 4」と言わざるを得ないのはわかります。

要するに、コンパイラー的にC# 6に対応している状況で、langversionオプションを指定してわざと4に絞ってる。

例えば、以下のようなコードを用意します。

async/await (C# 5)、expression-bodied method (C# 6)とか使ってます。 これをコンパイルしようとすると、 Unity 5.3だと以下のようなエラーに。

Assets/Scripts/NewBehaviourScript.cs(30,13): error CS1519: Unexpected symbol `=>' in class, struct, or interface member declaration
Assets/Scripts/NewBehaviourScript.cs(37,28): error CS1519: Unexpected symbol `XAsync' in class, struct, or interface member declaration

これが、5.4は試してないんですけど、5.5だと以下のように。

Assets/Scripts/NewBehaviourScript.cs(30,12): error CS1644: Feature `expression bodied members' cannot be used because it is not part of the C# 4.0 language specification
Assets/Scripts/NewBehaviourScript.cs(37,16): error CS1644: Feature `asynchronous functions' cannot be used because it is not part of the C# 4.0 language specification

5.3曰く「ちょっとその文法わからない」、5.5曰く「その機能はC# 4じゃないからダメ」。 5.5は解釈自体はできていると。

-langversion:6

てことで、まあ、オプション変更。

プロジェクトの Assets 直下に mcs.rsp っていうファイルを作り、

Unityに対してC#コンパイラー オプション指定

以下の1行を書いて保存。

-langversion:6

これで、C# 6なコードもビルドが通ります。

ただ、Unityが出力する csproj ファイルに余計な行が入るんで、こいつも消さないと、Visual Studio上でC# 6の機能が使えなくなります。

余計な1行

この行も削除が必要。 いったん手作業削除してるんですが、ちゃんとやるならProject File Generationでも使ってフックしてやればよさそう。

Taskクラスが必要なasync/awaitはともかく、ライブラリ依存がほとんどないC# 6の機能とかなら問題なく使えると思います。

async/awaitを使う

で、Taskクラスさえ自前で用意すればasync/awaitも使えるっぽい。 うちは自力でバックポートしたライブラリを持ってるので、それを参照してみたら、あっさり動きました。 ライブラリは↓これ。

実際動いてるプロジェクトがこんな感じ↓。

まあ、Unity Editor上でしか試してないんで、IL2CPPとか実機で動くかはわからないんですが。