I want to destroy an instance of an object when it is within a particular circular area. The code is as follows:
Collider2D[] overlap = Physics2D.OverlapCircleAll(
ball.transform.position,
(ball.renderer.bounds.size.x)/2);
if (overlap.Length>=1)
{
foreach (Collider2D coll in overlap)
{
Debug.Log (coll.GetInstanceID());
if (coll.name.Contains("alien"))
{
//problem here:
Destroy (coll.gameObject);
}
}
}
The Destroy(coll.gameObject)
destroys all the clones permanantly and new ones aren't instantiated and I get the error MissingReferenceException: The object of type 'GameObject' has been destroyed but you are still trying to access it.
Your script should either check if it is null or you should not destroy the object.
Is there a way to destroy that and that clone in specific? I've tried different names and using Destroy(GameObject.Find(coll.name))
but that destroys all clones as well and prevents new ones from spawning.
Somebody help?
UPDATE:
Instantiating as follows:
private bool bCanCreateParachuter = true; // bool to stop the spawning
GameObject go;
// Use this for initialization
void Start () {
//handling screen orientation
Screen.orientation = ScreenOrientation.LandscapeLeft;
///
go = (GameObject)Instantiate(Resources.Load("alienPink"));
StartCoroutine("CreateParachuter");
}
IEnumerator CreateParachuter()
{
while(bCanCreateParachuter)
{
Instantiate(go, new Vector3(Random.Range(-10,10), Random.Range(-5,5), 0), Quaternion.identity);
// Instantiate(go, new Vector3(Random.Range(-10,10), Random.Range(-10,10), 0), Quaternion.identity);
go.name = "alienPink"+nextNameNumber;
nextNameNumber++;
yield return new WaitForSeconds(Random.Range(0f,1f));
yield return null;
}
yield return null;
}
Crucial Update:
The code works if I uncomment if (grabbedObject !=null)
in
// if (grabbedObject != null) {
//works if uncomment above for some reason
Collider2D[] overlap = Physics2D.OverlapCircleAll (ball.transform.position, (ball.renderer.bounds.size.x)/2);
if (overlap.Length>=1){
foreach (Collider2D coll in overlap){
Debug.Log (coll.GetInstanceID());
if (coll.name.Contains("alien")){
Destroy (coll.gameObject);
}
}
}else {
// Debug.Log (grabbedObject.renderer.bounds.size.x);
}
This is the background of grabbedObject:
Rigidbody2D grabbedObject = null;
. . .
RaycastHit2D hit = Physics2D.Raycast(mousePos2D , dir);
//if (hit!=null && hit.collider!=null){
// check collisions with aliens
// OnCollisionEnter2D(grabbedObject.collisionDetectionMode);
if ( hit.collider!=null){
// we clicked on something lol... something that has a collider (box2d collider in this case)
if (hit.collider.rigidbody2D!=null){
//hit.collider.rigidbody2D.gravityScale = 1;
grabbedObject = hit.collider.rigidbody2D;
// circleCollider = hit.collider.collider2D. ;
springJoint = grabbedObject.gameObject.AddComponent<SpringJoint2D>();
// set the anchor to the spot on the object that we clicked
Vector3 localHitPoint = grabbedObject.transform.InverseTransformPoint(hit.point);
springJoint.anchor = localHitPoint;
//
dragLine.enabled = true;
}
}
Basically the grabbedObject is anything you click and drag on on screen (any GameObject), what am I missing over here guys?
The respawning issue is that you aren't saving a reference to the resources item, so when you destroy the very first item you create your "template" to instantiate is destroyed
This would solve this
GameObject template;
void Start()
{
//handling screen orientation
Screen.orientation = ScreenOrientation.LandscapeLeft;
template = (GameObject)Resources.Load("alienPink");
StartCoroutine("CreateParachuter");
}
IEnumerator CreateParachuter()
{
while(bCanCreateParachuter)
{
GameObject go = Instantiate(template, new Vector3(Random.Range(-10,10), Random.Range(-5,5), 0), Quaternion.identity);
go.name = "alienPink"+nextNameNumber;
nextNameNumber++;
yield return new WaitForSeconds(Random.Range(0f,1f));
yield return null;
}
yield return null;
}
In terms of it destroying all of the clones is your debug log stating that it is destroying multiple items? If so the collision may indeed be hitting all of the clones and therefore destroying them all.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With