🦔

Unityでinit修飾子を使えるようにする方法

2024/04/10に公開

init 修飾子とは

C# 9.0 から導入された init 修飾子は、プロパティの初期化をコンストラクタ・オブジェクト初期化子以外で行えないようにします。

public class Player
{
    public int Hp { get; init; }
}

このように書くことで、Hp プロパティはオブジェクト初期化子では初期化できますが、その後の変更はできません。

var player1 = new Player { Hp = 100 }; // OK

var player2 = new Player();
player2.Hp = 100; // Error: 'Player.Hp' is read-only

この機能はrecordにて特に便利で、一行でイミュータブルなクラスを作成できます。

public record Player(int Hp); // PlayerクラスはHpプロパティを持ち、init修飾子が付いている

Unity で init 修飾子を使う

Unity2021.2 以降では C# 9.0 の一部機能が使えるようになりましたが、init 修飾子はそのままでは使えず、以下のスクリプトを用意してあげる必要があります。

using System.ComponentModel;

namespace System.Runtime.CompilerServices
{
    [EditorBrowsable(EditorBrowsableState.Never)]
    public static class IsExternalInit
    {
    }
}

このスクリプトをプロジェクト内のどこかに配置しておくと、Unity で init 修飾子を使うことができるようになります。

Discussion