Свойство, по-видимому, самоинициализируется при запуске в редакторе единиц - PullRequest
0 голосов
/ 25 марта 2020

У меня странная проблема, которая не имеет смысла. Похоже, что одна из моих переменных, которые хранят пользовательский класс, самоинициализируется, когда он должен оставаться нулевым. Я удалил 99% кода в двух задействованных файлах класса и упростил оставшееся до минимума при отладке, но это все еще происходит.

Код, о котором идет речь, предназначен для [ExecuteInEditMode] в фоновом режиме в Unity, пока дизайнер делает свое дело, а не в игре.

  1. На первом тике OwnedData оценивается как ожидалось (ноль).
  2. На втором тике OwnedData оценивается как если объект был назначен, хотя я гарантирую, что canPrepare никогда не будет установлен в true. (Его внутренние свойства все еще нулевые)
[Serializable]
public class MyData {
    public byte[] id { get; private set; } = null;

    public MyData(byte[] id) {
        this.id = id;
    }
}

#if (UNITY_EDITOR)
    [ExecuteInEditMode]
#endif
public class Owner : MonoBehaviour {
    private bool canPrepare = false; //Made private to ensure nothing external can set this to true
    private MyData ownedData = null;

#if (UNITY_EDITOR)
    private float _editorTime;
    public void Awake() {
        EditorApplication.update += EditorDataEval;
    }

    private void OnDestroy() {
        EditorApplication.update -= EditorDataEval;
    }

    private void EditorDataEval() {
        if (Application.isPlaying) { return; }

        if (Time.realtimeSinceStartup - _editorTime >= 1f) {//Tick once per #f seconds
            _editorTime = Time.realtimeSinceStartup;

            if (ownedData == null) {
                if (canPrepare) {
                    ownedData = new MyData(System.Guid.NewGuid().ToByteArray());
                }
                return;
            } else {
                //Should never be called as canPrepare is not set
                Debug.Log("Data id: "+ ownedData.id);
            }
        }
    }
#endif

//TOOD: Add class methods back in once bug resolved.
}

Я начинаю теоретизировать, что Unity находится в фоновом режиме, автоматически инициализируя переменную, чтобы показать ее в редакторе ...

1 Ответ

0 голосов
/ 26 марта 2020

По умолчанию этого не должно происходить, поскольку ваше поле не public и не [SerializeField].

Полагаю, вы однажды вошли в режим Отладка в Инспекторе:

В этом случае Unity Inspector автоматически создает экземпляр поля, поскольку его тип [Serializable]! Позже он остается созданным до тех пор, пока сцена не будет перезагружена, даже если вы уже вышли из режима отладки.

Как видите, даже Сброс не помогает - я могу только догадываться, но я думаю, что Unity только сбрасывает здесь сериализованные поля Инспектора.

Очень быстрое исправление было бы просто войти и выйти из PlayMode один раз. Сцена и, следовательно, ваш компонент перезагружаются, а поле сбрасывается на null.

. Другой вариант - реализовать метод Reset и фактически сделать его там

* 1030. *

Теперь, если вы попробуете снова и нажмете Сброс в contextMenu, вы увидите, что вывод остановлен, так как поле сброшено на null.

enter image description here

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...