Destroy (gameObject) работает только один раз при подписке на событие - PullRequest
0 голосов
/ 27 мая 2018

В моем первом сценарии я объявляю событие следующим образом

public static event Action OnChangeScene;

private void OnMouseDown()
{
     OnChangeScene?.Invoke();
}

Во втором сценарии я пытаюсь заставить Destroy (gameObject) подписаться на это событие с помощью выражения lamda.

private void Start()
{
    MoveButton.OnChangeScene += () => Destroy(gameObject);
}

Проблема в том, что он работает только при первом нажатии мыши.После этого я получаю сообщение об ошибке: " MissingReferenceException: объект типа 'Animal' был уничтожен, но вы все еще пытаетесь получить к нему доступ. Ваш сценарий должен либо проверить, является ли он нулевым, либо вы не должны уничтожать объект. "

1 Ответ

0 голосов
/ 27 мая 2018

Вы должны отписаться от события после уничтожения объекта.

Однако вы подписываетесь на анонимный метод, и вам потребуется ссылка на него, чтобы отписаться от него.(подробности по этот вопрос и , что тоже ).Официальную информацию вы можете найти на странице MSDN по этому вопросу.

Если вам не придется позднее отписываться от события, вы можете использовать оператор присваивания (+ =)прикрепить анонимный метод к событию.

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

Рассмотрите этот подход:

private Action destroyDelegate;

private void Start()
{
    destroyDelegate = () => Destroy(gameObject);
    MoveButton.OnChangeScene += destroyDelegate;
}

protected void OnDestroy()
{
    MoveButton.OnChangeScene -= destroyDelegate;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...