Unityの開発において、[SerializeField]
とreadonly
を一緒に使用する際に遭遇する問題について、よくある質問の一つです。[SerializeField]
を使って変数をエディタに公開し、readonly
を使ってその変数の参照先を固定したいという状況ですが、これがうまくいかないことがあります。この記事では、この問題に対する理解を深め、解決策を紹介します。
1. [SerializeField]とreadonlyの基本的な使い方
[SerializeField]
は、Unityエディタでフィールドを公開し、インスペクタでその値を変更できるようにする属性です。readonly
は、変数の値をコンストラクタまたは初期化時に設定した後、変更できなくする修飾子です。これらは通常、役割が異なりますが、場合によっては両方を使いたい場面もあります。
具体的には、[SerializeField]
を使うことで、Unityエディタ上でのインスペクタから変数を編集可能にし、readonly
でその変数の参照先が後から変更されないようにします。
2. [SerializeField]とreadonlyの共存に関する警告
質問者の方が遭遇した警告UNT0013
は、[SerializeField]
とreadonly
の両方が付けられたフィールドに対して、Unityが「冗長である」と判断する場合に表示されます。この警告は、readonly
が変数の参照先を変更不可にするため、エディタ上でその変数を変更できるようにする[SerializeField]
と矛盾していると見なされるためです。
3. readonlyを使う理由と[Serializable]との関係
readonly
を使う目的は、変数の参照先を固定することです。しかし、Unityの[SerializeField]
を使う場合、その参照先をエディタ上で変更できる必要があるため、両方を同時に使うことは難しくなります。readonly
が変数の変更を防ぐのに対して、[SerializeField]
は変更を許可するため、互いに矛盾している状態となります。
もし、変数がエディタで変更可能で、プログラム内でその参照先を固定したい場合は、[SerializeField]
を使用し、readonly
は取り除くことが推奨されます。
4. 解決策とベストプラクティス
上記の警告を回避するためには、readonly
を使わずに[SerializeField]
だけを使用するのが最も簡単で適切な解決策です。もしどうしても参照を固定したい場合は、readonly
を使うのではなく、適切なタイミングでその参照を設定する方法を考えるべきです。
たとえば、コンストラクタで変数を初期化し、その後変更しないようにする方法があります。また、List
などのコレクションの中身を変更したい場合、readonly
を使用せず、インスペクタから直接変更できるようにすることが一般的です。
5. まとめ
Unityでの[SerializeField]
とreadonly
の併用には注意が必要です。[SerializeField]
はエディタでの変更を許可し、readonly
は後からの変更を防ぐため、両者は基本的に共存できません。この問題を回避するためには、readonly
を取り除き、エディタ上での変更を許可する方法を選ぶことが重要です。
コメント