MRが楽しい

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

Unityでinitキーワードを利用する

本日は Unity の小ネタ枠です。
Unityでinitキーワードを利用する方法についてです。

initキーワード

init を定義することでオブジェクトの構築時のみ、プロパティまたはインデクサー要素に値が割り当てられます。
initキーワードは C#9 以降でのみ利用可能な変数の初期化機能です。Unity では 2021.2 以降が C# 9.0 に対応しています。
learn.microsoft.com

サンプルコードとエラーの対処方法

以下のような init を利用したサンプルコードを作成しました。
・InitTest.cs

using UnityEngine;

class Person_InitExampleAutoProperty
{
    public int YearOfBirth { get; init; }
}

public class InitTest : MonoBehaviour
{
    void Start()
    {
        var person = new Person_InitExampleAutoProperty
        {
            YearOfBirth = 1984
        };
        
        Debug.Log($"YearOfBirth : {person.YearOfBirth}");
    }
}

しかし、本スクリプトをそのまま利用しようとすると以下のエラーが発生します。

Assets\Sandbox\InitTry\Scripts\InitTest.cs(7,35): error CS0518: Predefined type 'System.Runtime.CompilerServices.IsExternalInit' is not defined or imported

これは System.Runtime.CompilerServices.IsExternalInit が .NET 5 に含まれるクラスであるためです。
しかし init キーワード自体は C#9 の機能であるため、本クラスのダミークラスがあれば init を問題なく利用できるようです。
blog.xin9le.net
stackoverflow.com

以下のダミークラスを用意しました。
他のアセンブリに影響を与えないように internal でクラスを定義しています。
・IsExternalInit.cs

namespace System.Runtime.CompilerServices
{
    internal static class IsExternalInit { }
}

こうすることで、以下の通りエラーが解消されます。

シーンを再生してスクリプトの動作を確認します。
以下の通り、init が正常に動作して値が代入されていることが確認できます。