Среда, 27 Ноября 2024, 04:07

Приветствую Вас Гость

[ Новые сообщения · Игроделы · Правила · Поиск ]
  • Страница 1 из 1
  • 1
Удаление объекта из массива
labinzevvДата: Пятница, 31 Июля 2020, 20:18 | Сообщение # 1
частый гость
Сейчас нет на сайте
Всем привет. Следующий вопрос:
есть массив GameObject[] mChased (используется для преследования)
В определенный момент объекты из массива удаляются, после этого ошибка:

MissingReferenceException: The object of type 'Transform' 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.
UnityEngine.Transform.get_position () (at <d1422b3fc93746018c92eda852993b93>:0)
controlWolf.Update () (at Assets/Scripts/controlWolf.cs:100)

Вопрос: как из массива удалить поля missing, чтобы избежать ошибки
Пробовал в update запускать цикл for, который заново заполняет массив, ошибка исчезает но в этом случае
объект который потерял цель преследования перестаёт работать вообще.
Подскажите решение плиз.
Вот скрипт:
Код

public Transform[] chased;            
public Transform[] patrolPoint;     

public GameObject[] mChased = { };   
public GameObject[] mPoint = { };     

    void Start()
    {
        mChased = GameObject.FindGameObjectsWithTag("characters");   
        chased = new Transform[mChased.Length];                     
                    
        for (int i = 0; i < mChased.Length; i++)                     
        {                    
            chased[i] = mChased[i].transform;                      
        }                    

        mPoint = GameObject.FindGameObjectsWithTag("point");        
        patrolPoint = new Transform[mPoint.Length];                 
                    
        for (int i = 0; i < mPoint.Length; i++)                     
        {                    
            patrolPoint[i] = mPoint[i].transform;                   
        }                    

        randomPoint = Random.Range(0, patrolPoint.Length);
        randomchased = Random.Range(0, chased.Length);
    }
       
    void Update()
    {
        if (chased[0] == false)
        {
            Patroling();
            wolf.SetBool("wolf_attack", false);
            wolf.SetBool("wolf_walk", true);
        }
               
        float distance = Vector3.Distance(chased[randomchased].position, transform.position);

        if (distance > chaseRadius)                    
        {                    
            Patroling();                    
        }                    
        else if (distance <= chaseRadius)          
        {                    
            ChasePlayer();                    
        }         
    }           
}


3d modeling, unfolding, and texturing. My works: https://vk.com/labinzevv

Сообщение отредактировал labinzevv - Пятница, 31 Июля 2020, 20:19
DESOLДата: Пятница, 04 Сентября 2020, 04:22 | Сообщение # 2
участник
Сейчас нет на сайте
Собственно в тексте ошибки все ясно написано, если вкратце: вы пытаетесь обратится к объекту Transform, который был уничтожен.
В вашем скрипте я не увидел метода, который бы очищал массив.
Перед очисткой массива, проверяйте обращаются ли какие либо методы к массиву.


Unity, Blender, Zbrush, Substance Designer/Painter, TopoGun, RizomUV, Studio One 4

Сообщение отредактировал DESOL - Пятница, 04 Сентября 2020, 04:22
IlyaKosДата: Пятница, 04 Сентября 2020, 06:45 | Сообщение # 3
участник
Сейчас нет на сайте
Лучше подключи System.Linq, и используй динамические листы List<T> вместо массивов.
Как я понял, у тебя элементы массива, объекты, удаляются, и ты получаешь нулевую ссылку.
Почистить нулы можно так:
- если продолжишь использовать массив: mChased = mChased.ToList ().FindAll (x => x != null).ToArray ();
- если будешь использовать List: mChased.RemoveAll (x => x == null);
  • Страница 1 из 1
  • 1
Поиск:

Все права сохранены. GcUp.ru © 2008-2024 Рейтинг