- Home /
How to detect if a GameObject has been destroyed?
I have a script that does something like this (psuedo-code-ish):
var spawnedThing : GameObject;
function Update()
{
if (whatever)
{
if (!spawnedThing || spawnedThing.isDestroyed)
spawnedThing = InstantiateObject(...);
spawnedThing.enabled;
}
else
{
if (spawnedThing && !spawnedThing.isDestroyed)
spawnedThing.enabled = false;
}
}
My question is: how do I determine if spawnedThing has been destroyed? That is, my spawn script wants to...
Spawn something if there isn't already one.
Enable/disable the spawned thing based on condition (eg, if player is too far away to notice.)
Keep track of whether this one has been destroyed (i.e., player beat it up) and spawn a new one, if so.
When the GameObject is destroyed, does my variable go to null? Or do I have a pointer to a dead object? What's best-practice, here?
Thanks!
i think the best way to do so is to use if(spawnedThing),the best way is to use if(spawnedThing) to check if it's null
Answer by KvanteTore · Mar 25, 2010 at 06:05 PM
After an object is destroyed, an equality check with null
will return true
. The variable does not go to null, you can still call GetInstanceID()
on it, but the "==" operator is overloaded and behaves as expected.
I believe the following would do the trick
var spawnedThing : GameObject;
function Update()
{
if (whatever)
{
if (spawnedThing == null)
spawnedThing = InstantiateObject(...);
spawnedThing.enabled;
}
else
{
if (spawnedThing != null)
spawnedThing.enabled = false;
}
}
Edit: However, if you do this often, it might be a better idea to go easy on the garbage collector and reuse the objects. Instead of Destroying the spawnedThing when it gets killed, you can disable it and re-enable it whenever necessary. See this question for more details.
Edit2: If don't want to poll every frame, you could implement the OnDisable function in a component on spawnedThing. See this forum thread for more details on that.
Ah, that's what I was wondering. Vote-up for direct answer, but I'm still wondering how to implement Eric's less-CPU-intensive see$$anonymous$$g solution.
Note: GameObjects get destroyed at the end of the current frame by default (unless you choose the immediate option, which is not advisable). Therefore tests against null will not return true until the next frame.
Using if (something == null)
still returns null for me when "something" is destroyed...
Answer by Eric5h5 · Mar 25, 2010 at 06:25 PM
Instead of polling every frame whether the object is destroyed, it's probably better just to have a callback which the object calls when it's destroyed.
That would indeed be better, but then what's the "you're about to be destroyed" function? Is there OnDestroyed() or some such? What I'm looking for in particular is for a function to be called any time anything destroys the object for any reason, without the fragility of requiring all destroyers to call theObject.Send$$anonymous$$essage("YoureAboutToBeDestroyed")
@Olie: There's OnDisable(), which isn't quite OnDestroy(), but can often be used as a substitute.
@Eric5h5: To be clear, are you saying that, whenever an object is destroyed, it is sent the message OnDisable() just before destruction?
Yes, but the OnDisable() method is also called whenever the object is disabled. See this forum thread: http://forum.unity3d.com/viewtopic.php?p=274449&sid=c77bf5738b6b908a76dc4bd09e4b2ddc
smart move, thanks boy ;-) (Guess the first nice thing I said in here^^ am getting better it seems^^)
Answer by sindrijo · Jul 06, 2015 at 10:41 AM
Hi, I was also in the situation where I needed to know if a game object had been destroyed as opposed to the reference actually being null because I was running some code in OnDisable(), this is the solution I ended up with to test if a game object has been destroyed:
public static class GameObjectExtensions
{
/// <summary>
/// Checks if a GameObject has been destroyed.
/// </summary>
/// <param name="gameObject">GameObject reference to check for destructedness</param>
/// <returns>If the game object has been marked as destroyed by UnityEngine</returns>
public static bool IsDestroyed(this GameObject gameObject)
{
// UnityEngine overloads the == opeator for the GameObject type
// and returns null when the object has been destroyed, but
// actually the object is still there but has not been cleaned up yet
// if we test both we can determine if the object has been destroyed.
return gameObject == null && !ReferenceEquals(gameObject, null);
}
}
Your answer
Follow this Question
Related Questions
using Contains(gameObject) to find and destroy a gameObject from a list 2 Answers
Destroy object when transform.position.x > 10. 1 Answer
How do I make Destroy(gameObject) work in my script? 1 Answer
(2d) How can I destroy a gameObject when I pass over it? 1 Answer
Destroy(gameObject) does not work 2 Answers