serializedObject становится нулевой ошибкой - PullRequest
1 голос
/ 09 марта 2019

В моем пользовательском редакторе я подписался на событие EditorApplication.update, чтобы делать каждый кадр с моим объектом:

using UnityEngine;
using UnityEditor;
using System;

[CustomEditor(typeof(MyCustom))]
[CanEditMultipleObjects()]
public class MyCustomEditor : Editor
{
    private bool is_subcribed = false;

    void MyUpdate()
    {

        if (serializedObject == null)
        {
            Debug.Log("serialized object is null");
        }

        // My code stuff
    }

    void OnEnable()
    {
        if(!is_subcribed)
        {
            EditorApplication.update += MyUpdate;
            is_subcribed = true;
        }
    }

}

Это прекрасно работает, но если я перейду к Prefab моего родительского объекта (у которого нет этого CustomEditor), выберите его дочерний объект (ы) что имеет этот Пользовательский редактор подключен и пока они выбраны Я выхожу из Режим Prefab похоже, что MyUpdate функция продолжается вызвать себя и (поскольку эти дочерние объекты не выбраны, а serializibleObject пропал), выбрасывая это безумие в мою консоль:

enter image description here

Я пытался реализовать некоторые попытки / отловить и отписаться от EditorApplication.update, но я новичок в C #, поэтому мне не удалось :( Может кто-нибудь помочь мне помешать этому?

Ответы [ 2 ]

1 голос
/ 09 марта 2019

Вы не удаляете слушателя.Поэтому в следующий раз, когда EditorApplication.update будет вызван, вы уже "уничтожите" экземпляр редактора, на который указывает обратный вызов MyUpdate, так что это будет null.

Ошибка не произойдет, потому что serializedObject будетбыть null, но запись обратного вызова (ваш экземпляр MyCustomEditor) в EditorApplocation.update сама по себе равна null.


Чтобы удалить обратный вызов, просто используйте ту же строку, но с -= вместо.

Примечание. Также всегда можно «сохранить» / разрешить удалить слушателя, даже если он еще не существует.Так что я бы сделал

// This is called when the object gains focus
private void OnEnable()
{
    // This makes sure the callback is added only once
    EditorApplication.update -= MyUpdate;
    EditorApplication.update += MyUpdate;
}

// This is called when the object loses focus or the Inspector is closed
private void OnDisable ()
{
    EditorApplication.update -= MyUpdate;
}
0 голосов
/ 10 марта 2019

@ derHugo прав в своем ответе, но проблема в том, что OnDisable вызывается после MyUpdate, поэтому я вижу сообщение об ошибке один раз. Это не критично, но я все еще стараюсь попробовать / поймать, чтобы консоль была более понятной:

void OrbUpdate()
{
    try
    {
        MyCustom = (MyCustom)serializedObject.targetObject;
    }
    catch (Exception)
    {
        // Catching that bug :(
    }

}

private void OnDisable ()
{
    // And then unsubscribing
    EditorApplication.update -= MyUpdate;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...