2015-05-20 1 views
7

Я хочу уничтожить экземпляр объекта, когда он находится в пределах определенной круговой области. Код выглядит следующим образом:Уничтожающий клон уничтожает все клоны

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) уничтожает все клоны и новые них постоянно те, которые не инстанцированы и я получаю ошибку 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.

Есть ли способ, чтобы уничтожить то, что и клон в конкретнее? Я пробовал разные имена и использовал Destroy(GameObject.Find(coll.name)), но также уничтожал все клоны и предотвращал появление новых.

Кто-нибудь поможет?

UPDATE:

Инстанцирование следующим образом:

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:

код работает, если я раскомментировать if (grabbedObject !=null) в

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

Это фон 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; 
       } 

      } 

В основном grabbedObject все, что вы щелкните и перетащите на на экране (любой геймобжекты), то, что мне не хватает здесь, ребята?

+0

Как вы создаете клоны 'gameObject'? – Dai

+0

Вероятно, что-то не так с вашим кодом «клонировать» ... или «Уничтожить» - обязательно разместите минимально возможный набор кода, который показывает проблему со всеми связанными частями. –

+0

Обновлено оригинальное сообщение, чтобы включить экземпляр –

ответ

0

паки проблемы в том, что вы не спасаете ссылку на элемент ресурсов, поэтому, когда вы уничтожите самое первый элемент, создать свой «шаблон» для создания экземпляра уничтожаются

Это позволит решить эти

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

С точки зрения уничтожения всех клонов это ваш журнал отладки, в котором говорится, что он уничтожает несколько элементов? Если это так, то столкновение действительно может поразить всех клонов и, следовательно, уничтожить их всех.

+0

Это не сработало Колтон. Коллайдер не поражает их всех. Я собираюсь обновить несколько деталей. –

+0

Извините, это должно быть «Instatiate (template, ...» not «Instatiate (go ...»), который должен исправить проблему, связанную с установкой. –

+0

Что вы можете получить, если вы измените отладку как Debug.Log (coll .gameObject.name)? Какое имя вы получаете? И любые из ваших объектов, которые удаляются родителем других объектов? Уничтожение объекта gameObject также удаляет все его дочерние элементы –