コガネブログ

平日更新を目標に Unity や C#、Visual Studio、ReSharper などのゲーム開発アレコレを書いていきます

【Unity】UnityでC#5.0と6.0の機能を使用できるようにする

はじめに

https://bitbucket.org/alexzzzz/unity-c-5.0-and-6.0-integration

上記のBitbucketで公開されている「Unity C# 5.0 and 6.0 Integration」を
Unityプロジェクトに追加することで、
UnityでC#5.0と6.0の機能が使用できるようになります

導入手順

  1. 下記のページから「CSharp60Support XX.XX.XX.zip」をダウンロードする
    https://bitbucket.org/alexzzzz/unity-c-5.0-and-6.0-integration/downloads f:id:baba_s:20160624124357p:plain
  2. ダウンロードした「CSharp60Support XX.XX.XX.zip」を解凍する
  3. 「CSharp60Support」フォルダをUnityプロジェクトのフォルダに移動する f:id:baba_s:20160624124408p:plain
  4. 使用しているUnityのバージョンに合わせて「CSharp60Support」フォルダ内の
    「CSharp60Support for Unity XX.unitypackage」をインポートする f:id:baba_s:20160624124420p:plain
  5. UnityプロジェクトのProjectビューを右クリックして「Reimport All」を選択する f:id:baba_s:20160624124428p:plain
  6. Windowsを使用している場合 は「CSharp60Support」フォルダ内の
    「ngen install.cmd」を右クリックして「管理者として実行(A)...」を選択する f:id:baba_s:20160624124433p:plain

サポートしているプラットフォーム

  • Windows(エディタとStandalone)
  • Mac OS X(エディタとStandalone)
  • Android
  • iOS

既知の問題

  • C#5.0と6.0はUnity Cloud Buildサービスとの互換性がない
  • Visual Studioでデバッグ中にMonoのC#6.0コンパイラを使用すると、
    ときどきUnityがクラッシュする
  • IL2CPPはC#6.0の例外フィルターをサポートしていない
  • 名前空間の中にMonoBehaviourが宣言されている場合は、
    MonoBehaviourの宣言前にC#6.0の言語構造を含めることができない

使用例

自動実装プロパティ用の初期化子

using UnityEngine;

public class Pokemon
{
    public int    Id   { get; set; } = 25;
    public string Name { get; set; } = "ピカチュウ";
}

public class Example : MonoBehaviour
{
    void Awake()
    {
        var pokemon = new Pokemon();
        Debug.Log( pokemon.Id   );
        Debug.Log( pokemon.Name );
    }
}

f:id:baba_s:20160624125213p:plain

Getterのみの自動実装プロパティ

using UnityEngine;

public class Pokemon
{
    public int    Id   { get; } = 25;
    public string Name { get; } = "ピカチュウ";
    
    public Pokemon( int id, string name )
    {
        Id   = id ;
        Name = name;
    }
    
    public Pokemon() { }
}

public class Example : MonoBehaviour
{
    void Awake()
    {
        var pokemon = new Pokemon();
        Debug.Log( pokemon.Id   );
        Debug.Log( pokemon.Name );
    }
}

f:id:baba_s:20160624125213p:plain

ラムダ式本体によるメンバーの記述

using UnityEngine;

public class Pokemon
{
    public int    Id   { get; set; }
    public string Name { get; set; }
    
    public string GetItem() => "オレンのみ";
    public void Attack() => Debug.Log( "10万ボルト" );
}

public class Example : MonoBehaviour
{
    void Awake()
    {
        var pokemon = new Pokemon();
        Debug.Log( pokemon.GetItem() );
        pokemon.Attack();
    }
}

f:id:baba_s:20160624125416p:plain

ラムダ式本体によるプロパティの記述

using UnityEngine;

public class Pokemon
{
    public string Item => "オレンのみ";
}

public class Example : MonoBehaviour
{
    void Awake()
    {
        var pokemon = new Pokemon();
        Debug.Log( pokemon.Item );
    }
}

f:id:baba_s:20160624125523p:plain

using static

using UnityEngine;

using static UnityEngine.Mathf;

public class Example : MonoBehaviour
{
    void Awake()
    {
        Debug.Log( Max( 0, 10 ) );
        Debug.Log( Min( 0, 10 ) );
    }
}

f:id:baba_s:20160624125620p:plain

Null条件演算子

using UnityEngine;
using UnityEngine.UI;

public class Example : MonoBehaviour
{
    void Awake()
    {
        var text = GetComponent<Text>()?.text;
        var name = GameObject.Find( "Pokemon" )?.name;
    }
}

f:id:baba_s:20160624125727p:plain

文字列補間

using UnityEngine;

public class Example : MonoBehaviour
{
    void Awake()
    {
        var id   = 25;
        var name = "ピカチュウ";
        var text = $"{id} : {name}";
    }
}

f:id:baba_s:20160624125809p:plain

nameof演算子

using UnityEngine;

public class Example : MonoBehaviour
{
    void Awake()
    {
        Debug.Log( nameof( gameObject ) );
        Debug.Log( nameof( transform  ) );
    }
}

f:id:baba_s:20160624125849p:plain

参考サイト様