Search code examples
c#unity-game-engineaccessorunity-editor

Unity Custom Editor NullReferenceException When SerializedProperty Has Any Accessor


I am trying to make a custom editor in Unity for a ScriptableObject class which has private fields like such:

ScriptableObject class

But has soon as one of my fields has an accessor (I also tried properties with get;), I get the following error when I try to see my ScriptableObject in the inspector.

NullReferenceException

I made some tests and it works perfectly without accessors. For instance, I can see the field "test". Here is the code for my custom editor:

Custom editor script

Any idea? I would not believe a custom editor for a class that has accessors would not be supported. Thank you!


Solution

  • This has nothing to do with an "accessor". And note that properties are not serialized by Unity at all.


    The mistake is pretty simple: Your field's name is not ingredients but rather _ingredients!

    Therefore FindProperty("ingredients") returns null since it doesn't find any field called ingredients.

    (This is assuming of course that Item is a [Serializable] type at all.)


    To avoid exactly this type of issues I usually prefer to embed the editor into the type itself and use e.g.

    public class YourType : MonoBehaviour /*or ScriptableObject*/
    {
        [SerializeField] private int _someField;
    
    #if UNITY_EDITOR
        [CustomEditor(typeof(YourType))]
        private class YourTypeEditor : Editor
        {
            private SerializedProperty _someFieldProperty;
    
            private void OnEnable()
            {
                _someFieldProperty = serializedObject.FindProperty(nameof(_someField));
            }
    
            ...
        }
    #endif
    }
    

    so whenever you rename the fields it will be fixed in the Inspector automatically