Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Destroying clone destroys all clones

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?

like image 654
Ahmed Zafar Avatar asked May 20 '15 18:05

Ahmed Zafar


1 Answers

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.

like image 160
Colton White Avatar answered Oct 17 '22 09:10

Colton White