Уничтожить клонированные префабы после того, как расстояние до границы достигло единицы

Я пытаюсь уничтожить клонированные префабы, когда они достигают границы по оси x куба. Но при уничтожении первого клона возникает ошибка, и следующий появившийся клон не уничтожается.

Ошибка:

MissingReferenceException: объект типа GameObject был уничтожен, но вы все еще пытаетесь получить к нему доступ. Ваш сценарий должен либо проверить, является ли он нулевым, либо вы не должны уничтожать объект. deploy.Update() (в Assets/deploy.cs:52)

Это скрипт, прикрепленный к кубу:

public class deploy : MonoBehaviour
{
    public GameObject starsPrefab;    
    private GameObject star;
    public float respawnTime=40.0f;

    Vector3 bsize,bmax,bmin,plane;
    // Start is called before the first frame update
    void Start()
    {
        StartCoroutine(starsWave());
        Collider bCollider = this.GetComponent<Collider>();

        bsize=bCollider.bounds.size;
        bmax=bCollider.bounds.max;
        bmin=bCollider.bounds.min;

        //Vector3 plane=new Vector3(bmax.x-bmin.x,bmax.y-bmin.y,bmax.z-bmin.z);
    }

    private void spawnStar()
    {
        star =Instantiate(starsPrefab) as GameObject;
        star.transform.position= new Vector2(bsize.x,Random.Range(-bsize.y,bsize.y));
    }
   
    IEnumerator starsWave()
    {
        while (true)
        {
            spawnStar();

            yield return new WaitForSeconds(respawnTime);
        }
    }

    void Update()
    {
        if(star.transform.position.x<bmin.x)
        {
            Destroy(star);
        }
    }

Если я увеличу respawnTime, произойдет та же ошибка; появляется первый клон, доходит до границы, уничтожается, та же ошибка, потом появляется второй клон, доходит до границы, уничтожается, та же ошибка,&hellip

Кажется, что Destroy() применяется к последней клонированной звезде, как я могу применить это к любой клонированной звезде?


person lemmecatch    schedule 25.12.2020    source источник
comment
Вы создаете потенциально много звезд, но помните только последние появившиеся.   -  person BugFinder    schedule 25.12.2020
comment
Есть ли способ запомнить все звезды?   -  person lemmecatch    schedule 25.12.2020
comment
@lemmecatch использует List<GameObject> вместо одной ссылки?   -  person derHugo    schedule 25.12.2020
comment
@derHugo спасибо за ваше предложение, я собираюсь попробовать, я новичок в кодировании и единстве, поэтому я точно не знаю, где искать   -  person lemmecatch    schedule 26.12.2020
comment
Такие слова, как «решено» и «обновлено», не следует помещать в заголовки вопросов Stack Overflow. История изменений указывает, когда сообщение было обновлено, и если на вопрос был дан ответ, ответ, размещенный под вопросом, который лучше всего отвечает на вопрос, должен быть принят (нажмите кнопку с галочкой). Если вы решили вопрос самостоятельно, опубликуйте свой ответ и примите его. Не публикуйте решения в вопросе; это затрудняет их поиск и чтение другими.   -  person Peter Duniho    schedule 30.06.2021


Ответы (1)


Вы уничтожаете star, но все еще проверяете его позицию в Update()

Вы можете легко исправить это, изменив if с помощью

 `if(star!= null)`
{
if(star.transform.position.x<bmin.x)
{
Destroy(star)
}}

Так что, если звезда уничтожена, она больше не проверяется

person Leoverload    schedule 25.12.2020
comment
Здравствуйте, спасибо за быстрый ответ, я только что изменил это, но проблема та же. - person lemmecatch; 25.12.2020
comment
эээ, это потому, что вы сначала проверяете звезду, посмотрите на мой ответ, отредактированный: D @lemmecatch - person Leoverload; 25.12.2020
comment
Нет ошибки. Я уменьшил скорость движения звезды в отрицательном направлении по оси x (скрипт прикреплен к starPrefabs с плавающей скоростью), но ни одна из звезд не разрушится, они продолжают двигаться за пределы bmin.x - person lemmecatch; 25.12.2020
comment
с новым кодом это будет работать, проверьте мое редактирование @lemmecatch - person Leoverload; 25.12.2020
comment
Да, я пробовал с новым кодом, но он работает только по одной, поэтому, если видно более 1 звезды, уничтожение не работает (здесь я играл со скоростью). Если есть только одно прохождение, то код работает ( проходит быстро и уничтожается до появления второй звезды) - person lemmecatch; 25.12.2020
comment
Вы не должны никогда использовать проверку !=null для чего-либо, происходящего от UnityEngine.Object, см., например. здесь или здесь - person derHugo; 26.12.2020