Задать вопрос

Делаю бесконечную дорогу но вылетает ошибка: MissingReferenceException?

Привет всем , я делаю игру (Ранер) и хочу чтобы у меня была бесконечная дорога и что если персонаж уходит далеко то дорога сзади него уничтожаеться . Скрипт у меня уже есть , но при запуски (Тесте) игры выходит ошибка 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. (Это моя первая игра так что не судите строго если это очень легко решить :) )
коды :
первый
using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class Road : MonoBehaviour
{
    public List<GameObject> blocks; //Коллекция всех дорожных блоков
    public GameObject player; //Игрок
    public GameObject roadPrefab; //Префаб дорожного блока
    public GameObject carPrefab; //Префаб машины NPC
    public GameObject coinPrefab; //Префаб монеты

    private System.Random rand = new System.Random(); //Генератор случайных чисел

    void Update()
    {
        float x = player.GetComponent<Move>().rb.position.x; //Получение положения игрока

        var last = blocks[blocks.Count - 1]; //Номер дорожного блока, который дальше всех от игрока

        if (x > last.transform.position.x - 24.69f * 10f) //Если игрок подъехал к последнему блоку ближе, чем на 10 блоков
        {
            //Инстанцирование нового блока
            var block = Instantiate(roadPrefab, new Vector3(last.transform.position.x + 24.69f, last.transform.position.y, last.transform.position.z), Quaternion.identity);
            block.transform.SetParent(gameObject.transform); //Перемещение блока в объект Road
            blocks.Add(block); //Добавление блока в коллекцию

        }

        foreach (GameObject block in blocks)
        {
            bool fetched = block.GetComponent<RoadBlock>().Fetch(x); //Проверка, проехал ли игрок этот блок

            if (fetched) //Если проехал
            {
                blocks.Remove(block); //Удаление блока из коллекции
                block.GetComponent<RoadBlock>().Delete(); //Удаление блока со сцены
            }
        }
    }

}


второй

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class RoadBlock : MonoBehaviour
{
    public bool Fetch(float x) //Проверка, проехала ли машина игрока этот блок на достаточное расстояние
    {
        bool result = false;

        if (x > transform.position.x + 10f)
        {
            result = true; //Если машина проехала на 10f от блока, то возвращается true
        }

        return result;
    }

    public void Delete()
    {
        Destroy(gameObject); //Удаление блока
    }  

}
  • Вопрос задан
  • 315 просмотров
Подписаться 1 Простой Комментировать
Пригласить эксперта
Ответы на вопрос 2
CHIDWI
@CHIDWI
Unity3D Developer
Пусть каждый блок сам решает удаляться ему или нет и сам себя удаляет. Перед удалением пусть себя же удалит из коллекции. Это совет если не разбираться в коде.
Просто где-то у тебя код пытается получить элемент который уже удален и сыпет тебе ошибку. Проверь в какой конкретно момент ошибка появляется как вариант.
Ответ написан
Комментировать
aDOPPIO
@aDOPPIO
Начинающий c# + Unity программист
Тебе нужно из списков(листов, массивов и т.п) удалять блоки, просто у тебя скорее всего fetch проходит по удалённому блоку.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы