【发布时间】:2016-06-18 23:24:42
【问题描述】:
我正在使用 Unity 进行编码,我发现有时即使游戏对象已被销毁,也可以通过 Invoke 函数调用方法。 这就是我添加此检查的原因,它似乎可以正常工作,但很奇怪。
假设我有一个我想在一秒钟内自行销毁的对象。 我在唤醒时添加了一个 Invoke 以自我摧毁它。 而且,如果游戏结束,我想立即销毁游戏对象。该对象订阅了 Gameover 事件。
void Awake ()
{
Invoke ("_destroy", 1);
GameMachine.Gameover += _destroy;
}
_destroy 方法是这样的:
void _destroy()
{
if (!this) {
return;
}
GameMachine.Gameover -= _destroy;
Destroy (this.gameObject);
}
我添加了 if (!this) 检查,因为我发现 Invoke 可以到达 _destroy 方法,即使对象已经被游戏结束事件销毁。 这有什么意义,有可能发生吗?
谢谢
【问题讨论】:
-
回答标题中提出的问题:
if (!this)通常在 C# 中无法编译或没有意义。然而,Unity 的Object类支持 implicit conversion tobool来检查对象是否已被销毁。 -
谢谢迈克尔刘。这意味着如果该代码位于非 MonoBehaviour 类中,它甚至无法编译?
-
没错(当然,除非该类也支持转换为
bool)。 -
隐式类型转换的使用太可怕了。您是否可以查看其他属性(例如
if(!base.destroyed),以便其他人阅读您的代码时不会感到困惑?