本日は 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 が正常に動作して値が代入されていることが確認できます。