2016-03-05 2 views
2

Я кодирую в Unity, и я обнаружил, что иногда метод может вызываться функцией Invoke, даже если объект игры был уничтожен. Вот почему я добавил эту проверку, и, похоже, она работает правильно, но это довольно странно.если (! This) {возврат; } имеет смысл в C#?

Предположим, у меня есть объект, который я хочу уничтожить за одну секунду. Я добавляю Invoke в Awake, чтобы его уничтожить. Но также, я хочу немедленно уничтожить игровой объект, если игра окончена. Объект подписывается на событие Gameover.

void Awake() 
    { 
    Invoke ("_destroy", 1); 
    GameMachine.Gameover += _destroy; 
    } 

Метод _destroy как это:

void _destroy() 
    { 
    if (!this) { 
      return; 
    } 
    GameMachine.Gameover -= _destroy; 
    Destroy (this.gameObject); 
} 

Я добавил, что если проверить, потому что я обнаружил, что Invoke может достигнуть метод _destroy, даже если объект (это!) был уже уничтожен игрой по событию. Это имеет смысл, возможно ли это случиться?

Благодаря

+9

Чтобы ответить на вопрос, заданный в заголовке: 'if (! This)' обычно не компилируется и не имеет смысла в C#. Однако класс 'Object' Unity поддерживает [неявное преобразование в' bool'] (http://docs.unity3d.com/412/Documentation/ScriptReference/Object-operator_bool.html), который проверяет, был ли объект уничтожен. –

+0

Спасибо, Майкл Лю. Это означает, что если бы этот код был в классе, отличном от MonoBehaviour, он даже не компилировался бы? – DavidGuaita

+1

Это правильно (если, конечно, этот класс не поддерживает преобразование в 'bool'). –

ответ

0

Насколько я могу судить, это будет работать, но, это не хорошая идея, чтобы сделать это. Unity's MonoBehaviour переопределяет оператор bool. Поэтому, когда вы проверяете

!this 

Вы проверяете, существует ли объект (и, следовательно, сценарий).

В качестве примечания стороны, если вы хотите отменить подписку на события, используйте функцию OnDisable. Пример кода

void OnDisable() { 
    GameMachine.Gameover -= _destroy; 
} 
+0

Спасибо, Venkat. Думаю, что '! This' проверяет, существует ли Monobehaviour, если объект игры существует, не будет '! this.gameObject'? Хорошая точка с примечанием OnDisable. – DavidGuaita

+0

Yup,'! this.gameObject' проверяет, существует ли GameObject. Однако, поскольку вы вызываете функцию в конкретный Monobehaviour, этот скрипт должен существовать или вызов будет терпеть неудачу. Таким образом, проверка скрипта является более логичным способом обойти это. –

Смежные вопросы