🈳

【Unity】未割り当てのSerializeが完全nullになる条件

に公開

はじめに

インスペクタで未割り当てのUnityオブジェクト系変数は 偽装null(非null) となる認識でしたが
TextMeshPro変数が完全なnull になってて気になったので少し検証してみました。

環境:Unity 6000.0.52f1(エディタでプレイ)

結論

軽く検証した結果どうやら MonoBehaviourから派生したクラスは完全なnull となるようでした。
※TextMeshProはMonoBehaviourから派生している

また、ScriptableObject派生も完全なnull となっていました。

検証コード

TestBehaviour.cs
public class TestBehaviour : MonoBehaviour
{
    [SerializeField] private GameObject _gameObject;
    [SerializeField] private Object _object;
    [SerializeField] private Component _component;
    [SerializeField] private Behaviour _behaviour;
    [SerializeField] private MonoBehaviour _monoBehaviour;
    [SerializeField] private MeshRenderer _meshRenderer;
    [SerializeField] private Image _image;
    [SerializeField] private TextMeshProUGUI _text;
    [SerializeField] private Animator _animator;
    [SerializeField] private InputActionAsset _inputActionAsset; // ScriptableObject派生

    private void Awake()
    {
        CheckNull(_gameObject, nameof(_gameObject));
        CheckNull(_object, nameof(_object));
        CheckNull(_component, nameof(_component));
        CheckNull(_behaviour, nameof(_behaviour));
        CheckNull(_monoBehaviour, nameof(_monoBehaviour));
        CheckNull(_meshRenderer, nameof(_meshRenderer));
        CheckNull(_image, nameof(_image));
        CheckNull(_text, nameof(_text));
        CheckNull(_animator, nameof(_animator));
        CheckNull(_inputActionAsset, nameof(_inputActionAsset));
    }

    private static void CheckNull(Object obj, string name)
    {
        var result = obj is null ? "<color=green>null</color>" : "<color=red>not null</color>";
        Debug.Log($"{name} is {result}.");
    }
}

ログ出力


ちなみにめちゃくちゃどうでもいいんですが、ComponentやBehaviourを継承したクラスは自作してもAddComponentできないようです。
AddComponent asking for "MyBehaviour" which is not a Unity engine type.と言われる。
※AddComponentできないくせにシリアライズ変数にしたら 非null でした。

Discussion