🦔
Unityでinit修飾子を使えるようにする方法
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