Уничтожение клона уничтожает все клоны

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

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

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

ОБНОВЛЕНИЕ:

Создание экземпляра следующим образом:

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

Ключевое обновление:

Код работает, если я раскомментирую 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);
        }

Это предыстория захваченного объекта:

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

            }

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


person Ahmed Zafar    schedule 20.05.2015    source источник
comment
Как вы создаете клоны gameObject?   -  person Dai    schedule 20.05.2015
comment
Вероятно, что-то не так с вашим кодом клона... или Destroy - не забудьте опубликовать наименьший возможный набор кода, который показывает проблему со всеми связанными частями.   -  person Alexei Levenkov    schedule 20.05.2015
comment
Обновлен исходный пост, чтобы включить создание экземпляра   -  person Ahmed Zafar    schedule 20.05.2015
comment
Я не знаю, что это даст Эндрю..   -  person Ahmed Zafar    schedule 20.05.2015


Ответы (1)


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

Это решило бы это

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

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

person Colton White    schedule 20.05.2015
comment
Это не сработало, Колтон. Ни один коллайдер не поразит их всех. Я собираюсь обновить некоторые детали. - person Ahmed Zafar; 21.05.2015
comment
Извините, это должно быть Instatiate (шаблон, ... не Instatiate (go ....), это должно исправить проблему с инстатированием, которая не работает. - person Colton White; 22.05.2015
comment
Что вы получите, если измените отладку на Debug.Log(coll.gameObject.name)? Какое имя (имена) вы получаете? И являются ли какие-либо из ваших объектов, которые удаляются, родителем других объектов? уничтожение gameObject также удаляет все его дочерние элементы - person Colton White; 22.05.2015