MRが楽しい

MRやVRについて学習したことを書き残す

Unityでasync/awaitを使う

本日は Unity の技術調査枠です。
以前、Windows-universal-samples を HoloLens 上で試してみました。
bluebirdofoz.hatenablog.com

さて、いざ Unity に取り込んでこのコードを利用しようとしたところ、async/await が利用できない問題が発生しました。
例えば、以下のようなコードを作成するとUnityのビルドでエラーが発生します。
・AwaitTests01.cs

public class AwaitTest01 : MonoBehaviour {
    // Use this for initialization
    void Start ()
    {
        awaitasync();
    }
    public async void awaitasync()
    {
        Debug.Log("message");
    }
}

f:id:bluebirdofoz:20171227004507j:plain
エラーメッセージには「Feature 'asynchronous functions' cannot be used because it is not part of the C# 4.0 language specification」というメッセージが表示されています。

'asynchronous functions'の機能は C#4 じゃ使えないというエラーのようです。
しかし調べてみると、Unity 2017 は C# 6 に対応しているとの情報がありました。
qiita.com

では何故使えないかというと、現状、Unity 側のデフォルト設定が .NET 3.5 のままらしい。
メニューから Edit -> Project Settings -> Player でプロジェクト設定を開きます。
f:id:bluebirdofoz:20171227004601j:plain

デフォルトだと以下の通り、「Stable(.NET 3.5 Equivalent)」が選択されているので「Experimental(.NET 4.6 Equivalent)」に変更します。
f:id:bluebirdofoz:20171227004615j:plain

Unity を再起動すると……。
f:id:bluebirdofoz:20171227004624j:plain
エラーが消えました。Unity プロジェクトで C# 5 以降のコードを利用する際はこの変更を行う必要があります。

因みに、上記のエラーを解決しても Script を VisualStudio で開くと以下のようにエラーが表示されます。
f:id:bluebirdofoz:20171227004702j:plain

これは生成される VisualStudio のプロジェクトファイルに 4 が書き込まれているためです。
プロジェクトディレクトリにある csproj ファイルをテキストエディタで開きます。
f:id:bluebirdofoz:20171227004719j:plain

以下の の設定を 6 に変更します。
・T_CodeTestProject.CSharp.csproj

<LangVersion Condition=" '$(VisualStudioVersion)' != '10.0' ">6</LangVersion>

この状態で再び Script を VisualStudio で開くとエラーが解消されています。
f:id:bluebirdofoz:20171227004727j:plain