コガネブログ

平日更新を目標に Unity や C#、Visual Studio、ReSharper などのゲーム開発アレコレを書いていきます

【Unity】ScriptableObject の private な文字列や配列は初期値が null ではなく空文字列や空配列になる

検証環境

  • 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 になります