2015-05-20 34 views
7

Chcę zniszczyć instancję obiektu, gdy znajduje się on w obrębie określonego okręgu. Kod jest w następujący sposób:Niszczenie klonów niszczy wszystkie klony

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); 
     } 
    } 
} 

Destroy(coll.gameObject) niszczy wszystkie klony permanantly a nowe nie są wystąpienia i pojawia się błąd 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.

Czy istnieje sposób, aby zniszczyć to, i to w specyficzny klon? Próbowałem różnych nazw i używałem Destroy(GameObject.Find(coll.name)), ale to także niszczy wszystkie klony i zapobiega powstawaniu nowych.

Ktoś pomaga?

UPDATE:

instancji w następujący sposób:

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 Aktualizacja:

Kod działa, jeśli odkomentowaniu if (grabbedObject !=null) w

// 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); 
     } 

To tło 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; 
       } 

      } 

Zasadniczo grabbedObject jest coś kliknąć i przeciągnąć na na ekranie (dowolny GameObject), co mi brakuje tu ludzi?

+0

W jaki sposób tworzysz klony 'gameObject'? – Dai

+0

Prawdopodobnie coś nie tak z twoim "klonem" kodu ... lub "Zniszcz" - pamiętaj, aby opublikować najmniejszy możliwy zestaw kodu, który pokazuje problem ze wszystkimi powiązanymi elementami. –

+0

Zaktualizowany oryginalny post w celu włączenia wystąpienia –

Odpowiedz

0

respawning problemem jest to, że nie są oszczędności odniesienie do elementu zasobami, dzięki czemu podczas zniszczyć pierwszy element, który tworzy swoje „szablon” instancję jest zniszczona

To rozwiązałoby ten

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; 
} 

Pod względem niszczenia wszystkich klonów jest to dziennik debugowania, który stwierdza, że ​​niszczy wiele przedmiotów? Jeśli tak, kolizja może rzeczywiście uderzyć wszystkie klony, a tym samym zniszczyć je wszystkie.

+0

To nie działa Colton. Żaden zderzacz nie uderza wszystkich. Mam zamiar zaktualizować kilka szczegółów. –

+0

Przepraszam, że powinno to być "Instatiate (template, ...", a nie "Instatiate (idź ...."), które powinno naprawić problem instatiating nie działa –

+0

Co otrzymasz po zmianie debugowania na Debug.Log (coll .gameObject.name)? Jakich nazw otrzymujesz i czy którykolwiek z obiektów, które są usuwane, jest rodzicem innych obiektów? niszczenie obiektu GameObject usuwa także wszystkie jego dzieci –