如果(!this){return;}在C#中有意义?
我在Unity中编写代码,我发现有时调用函数可以调用方法,即使游戏对象已被销毁。 这就是为什么我添加了这个检查,它似乎工作正常,但它很奇怪 假设我有一个物体,我想在一秒钟内自我毁灭。 我在唤醒时添加一个调用来自我销毁它。 而且,如果游戏结束,我想立即销毁游戏对象。该对象已订阅Gameover事件如果(!this){return;}在C#中有意义?,c#,events,unity3d,destroy,C#,Events,Unity3d,Destroy,我在Unity中编写代码,我发现有时调用函数可以调用方法,即使游戏对象已被销毁。 这就是为什么我添加了这个检查,它似乎工作正常,但它很奇怪 假设我有一个物体,我想在一秒钟内自我毁灭。 我在唤醒时添加一个调用来自我销毁它。 而且,如果游戏结束,我想立即销毁游戏对象。该对象已订阅Gameover事件 void Awake () { Invoke ("_destroy", 1); GameMachine.Gameover += _destroy; } 销毁方法
void Awake ()
{
Invoke ("_destroy", 1);
GameMachine.Gameover += _destroy;
}
销毁方法如下所示:
void _destroy()
{
if (!this) {
return;
}
GameMachine.Gameover -= _destroy;
Destroy (this.gameObject);
}
我添加了if(!this)检查,因为我发现调用可以到达_destroy方法,即使对象已经被game over事件破坏。
这是有道理的,有可能发生吗
谢谢据我所知,它会起作用,但是,这样做不是一个好主意。 Unity的操作将覆盖操作符。因此,当您检查
!this
您正在检查对象(以及脚本)是否存在
另外,如果要取消订阅事件,请使用该函数。代码示例
void OnDisable () {
GameMachine.Gameover -= _destroy;
}
回答标题中提出的问题:
如果(!this)
在C#中通常没有编译或意义。然而,Unity的对象
类支持一个检查对象是否已被销毁的类。谢谢Michael Liu。这意味着,如果代码在非单行为类中,它甚至不会编译?这是正确的(当然,除非该类也支持到bool
的转换)。隐式类型转换的使用多么可怕啊。您是否可以查看其他属性(例如,if(!base.destromed)
只是为了让其他人在阅读你的代码时不会感到困惑?谢谢,文卡特。我想!这个检查是否存在单一行为,如果游戏对象不存在就不会!这个.gameObject
?这句话很好。是的,!这个.gameObject
会检查游戏对象是否存在。但是,因为你正在调用一个特定单行为中的函数,该脚本必须存在,否则调用将失败。因此,检查脚本是更符合逻辑的方法。