検証環境
- Unity 2018.4.8f1
概要
using UnityEngine; public class TestScene : MonoBehaviour { private string m_text; private string[] m_array; private void OnEnable() { Debug.Log( m_text == null ); // True Debug.Log( m_array == null ); // True } }
例えば MonoBehaviour を継承したクラスで
private な文字列や配列の変数を定義して初期値を確認してみると
どちらも null になりますが
using UnityEngine; public class Example : ScriptableObject { private string m_text; private string[] m_array; private void OnEnable() { Debug.Log( m_text == null ); // False Debug.Log( m_array == null ); // False } }
ScriptableObject を継承したクラスで
private な文字列や配列の変数を定義して初期値を確認してみると
null ではなく空文字列や空配列が設定されていることが確認できます
そのため、private な文字列や配列が初期化されているかどうかは
null チェックでは確認できません
対策
using System; using UnityEngine; public class Example : ScriptableObject { [NonSerialized] private string m_text; [NonSerialized] private string[] m_array; private void OnEnable() { Debug.Log( m_text == null ); // True Debug.Log( m_array == null ); // True } }
変数に NonSerialized 属性を適用すると、
private な文字列や配列の初期値が null になります