MissingReferenceException Помогите забороть.

Форум для самых маленьких, а так же тех, кому недосуг читать справку самостоятельно.

MissingReferenceException Помогите забороть.

Сообщение mr.Wolfram 08 янв 2013, 17:57

Приветствую.
Периодически вылезает вот такая ошибка:
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.


Появляется она иногда, и проблема как я понимаю в массиве:

Синтаксис:
Используется csharp
       
private GameObject[] GO_inst = new GameObject[39];

        void Awake(){
...
                GO_inst[inst] = new GameObject("inst_"+inst);
...
}
 


Ошибка вроде бы на строке: GO_inst[inst] = new GameObject("inst_"+inst); Выглядит это так, как если бы не успела пройти инициализация... Такое вообще возможно?
Сначала было так:
Синтаксис:
Используется csharp
GO_inst[inst] = new GameObject();
GO_inst[inst].name = "inst_"+inst; <-- Ошибка на этой строке
 

Ошибка вылезала чаще в этом варианте...

Не совсем понятно как отлавливать ошибки, которые то есть то их нет. От действий юзера ни какой зависимости нет, это происходит при самой загрузке сцены.

Как разруливать?
mr.Wolfram
UNец
 
Сообщения: 41
Зарегистрирован: 03 янв 2012, 15:01

Re: MissingReferenceException Помогите забороть.

Сообщение BornFoRdeatH 08 янв 2013, 18:03

для этого есть Debug, продебаж свои значения, думаю сразу все прояснится.
Не бойся, если ты один, бойся, если ты ноль.
BornFoRdeatH
Адепт
 
Сообщения: 2377
Зарегистрирован: 22 окт 2011, 23:41
Откуда: Украина
Skype: bornfordeath

Re: MissingReferenceException Помогите забороть.

Сообщение mr.Wolfram 08 янв 2013, 18:09

Если бы я еще знал как им в Unity пользоваться грамотно... :)

У меня все сводится к:
Синтаксис:
Используется csharp
GO_inst[inst] = new GameObject();
Debug.Log ("point_1");
GO_inst[inst].name = "inst_"+inst;
Debug.Log ("point_2");
 

Если в лог point_2 не вывелось, то ошибка в строке: GO_inst[inst].name = "inst_"+inst;
mr.Wolfram
UNец
 
Сообщения: 41
Зарегистрирован: 03 янв 2012, 15:01

Re: MissingReferenceException Помогите забороть.

Сообщение BornFoRdeatH 08 янв 2013, 18:17

Синтаксис:
Используется csharp
Debug.Log (inst);
Debug.Log (GO_inst[inst]);
 
Не бойся, если ты один, бойся, если ты ноль.
BornFoRdeatH
Адепт
 
Сообщения: 2377
Зарегистрирован: 22 окт 2011, 23:41
Откуда: Украина
Skype: bornfordeath

Re: MissingReferenceException Помогите забороть.

Сообщение seaman 08 янв 2013, 19:32

Обязательно в Awake? Можно это в Start перенести?
seaman
Адепт
 
Сообщения: 8352
Зарегистрирован: 24 янв 2011, 12:32
Откуда: Самара

Re: MissingReferenceException Помогите забороть.

Сообщение mr.Wolfram 08 янв 2013, 19:42

BornFoRdeatH Сделал, буду уждать пока ошибка вылезет. Пока не было.

seaman: "Можно это в Start перенести?"
Запросто. Главное, чтобы это сделалось 1 раз и перед тем, как выполнится Update. А в чем хоть суть переноса?
Я уже даже разные варианты пробовал. Часть кидал в Awake, часть в Start.
mr.Wolfram
UNец
 
Сообщения: 41
Зарегистрирован: 03 янв 2012, 15:01

Re: MissingReferenceException Помогите забороть.

Сообщение AndreyMust19 08 янв 2013, 19:59

Разница есть - если запишете в Start, но изначально скрипт будет выключен (enabled = false), то Start не запустится.
Awake запускается всегда.
Нужна помощь? Сами, сами, сами, сами, сами... делаем все сами
AndreyMust19
Адепт
 
Сообщения: 1119
Зарегистрирован: 07 июн 2011, 13:19

Re: MissingReferenceException Помогите забороть.

Сообщение seaman 08 янв 2013, 20:48

Ну так, раздумья... Может массив не инициализировался. Попробуйте непосредственно перед назначением элементов его инициализировать:
Синтаксис:
Используется csharp
void Awake(){
   GO_inst = new GameObject[39];
...

Вот странно, что пишет: destroyed Что тут разрушается непонятно.
seaman
Адепт
 
Сообщения: 8352
Зарегистрирован: 24 янв 2011, 12:32
Откуда: Самара

Re: MissingReferenceException Помогите забороть.

Сообщение mr.Wolfram 08 янв 2013, 21:09

seaman: "Вот странно"
У меня вообще все как-то странно :) Этот глюк ни разу не проявлялся при старте с этой сцены, только при переходе на нее.
С FPS (в GPU Usage) какие-то непонятные вещи происходят... То ~200FPS, то 4000FPS. Причем все упирается в RenderTextute.SetActive, тогда когда 200.

seaman: "Попробуйте непосредственно перед назначением элементов его инициализировать"
Да, так и сделал. И имя теперь не прописываю.
mr.Wolfram
UNец
 
Сообщения: 41
Зарегистрирован: 03 янв 2012, 15:01

Re: MissingReferenceException Помогите забороть.

Сообщение yursiv 08 янв 2013, 21:33

У меня выскакивала эта ошибка при обращению к материалу(который я считал "оригинальным"), а я его до этого сделал (Clone). Предполагаю, что каким-либо образом где-то происходит неявный Destoy.
Аватара пользователя
yursiv
UNIт
 
Сообщения: 130
Зарегистрирован: 09 ноя 2010, 11:51
Откуда: Харьков

Re: MissingReferenceException Помогите забороть.

Сообщение mr.Wolfram 09 янв 2013, 01:23

Нашел потенциальную проблему. У меня переход между сценами сделан через фейд. Есть префаб, в котором есть анимация альфы, в конце анимации стоит метка на функцию в которой вызывается Application.LoadLevel(levelName); Вот так примерно:
Синтаксис:
Используется csharp
       
void sceneExit(string scene_name){
        fade_Out = Instantiate(Resources.Load("Common/fade_Out")) as GameObject;
        fadeOut fadeOutCS = (fadeOut)fade_Out.GetComponent(typeof(fadeOut));
        fadeOutCS.levelName = scene_name;
}

Переменная fade_Out была объявлена внутри sceneExit(). Т.е. так:
Синтаксис:
Используется csharp
GameObject fade_Out = Instantiate(Resources.Load("Common/fade_Out")) as GameObject;

Вытащил ее наружу, буду тестить.
mr.Wolfram
UNец
 
Сообщения: 41
Зарегистрирован: 03 янв 2012, 15:01

Re: MissingReferenceException Помогите забороть.

Сообщение mr.Wolfram 09 янв 2013, 04:09

Все равно ошибка вылезает... Но значительно реже. Самое неприятное, что при этом ничего не падает, все отлично работает. Ессть вариант сделать вид что это просто "особенность" :) Но все же хочется разобраться.
Чую, это из-за анимации все. Логика частично построенная на анимации (т.е. вызов функций через Animation Events) - зло. Хоть и удобно это.
mr.Wolfram
UNец
 
Сообщения: 41
Зарегистрирован: 03 янв 2012, 15:01

Re: MissingReferenceException Помогите забороть.

Сообщение liver9711 09 янв 2013, 08:29

Пхе... Люди, читайте что вам консоль пишет: объект как GameObject был уничтожен/убран, но вы какого-то до сих пор пытаетесь к нему обратиться. Я имею ввиду что вы сначало либо вызвали Destroy, либо удалили из массива, но не из сцены и пытаетесь что-то с ним сделать.

Подумал...:
Ясно всё с вами. Я не знаю как в С#, но в С++ если сделаете new, но забудете delete... или del, не помню точно... то да у вас скорее всего будет скакать фпс, Unity похоже подчищает оперативку, но супер эффективно он это делать не может. Вы вот создаёте в памяти оператором new (ОЧЕНЬ жручий к ресурсам он скажу я вам) новую переменную, она скажем сидит на адресе 0х00000008, забываете сделать del/delete и создаётся новая переменная на адресе 0х00000012, при этом 0х00000008 ещё в памяти и никуда не делась (а куда ей деваться, вы ж её не удалили). С++ так, потому что в любой момент через asm{} можно оратиться к этому адресу и вызволить старую переменную. Короче говоря вы дважды делаете new, и даже больше как я вижу, и учтите, она МНОГО КУШАЕТ!

Оффтоп:
Насчёт адресов у меня была одно интересная история (С++). Массив Char[1000][1000] весит от силы мегабайт, но занимает много адресов. была у меня так же переменная-счётчик - за сколько времени "подсаженная" единица "заразит" всё вокруг собственно тоже единицами. Так вот если попытаться обратиться за пределы массива, к примеру на [-7][-7], то он улетит в абсолютно левый адрес. Так во я решил не ограничивать программу т.к. скорость быстрее, пущай вылетает за границу, автостопщик чёртов (я на тот момент не знал такого безобразия), так удачно получилось, что эта дрянь мне не только изменила счётчик времени заражения, но и, пардон, расхреначила всё цикловые переменные! Поэтому в гибких языках программирования следите за работой с памятью.
liver9711
UNITрон
 
Сообщения: 285
Зарегистрирован: 14 мар 2012, 11:16

Re: MissingReferenceException Помогите забороть.

Сообщение mr.Wolfram 09 янв 2013, 11:49

"Люди, читайте что вам консоль пишет"
Я отлично вижу что мне консоль пишет. Но вся проблема в том, что у меня нет ни одного GameObject, который был бы создан локально. И я ни где ни разу не удаляю GameObject в явном виде, потому как у меня вообще ни один GameObject не должен быть удален до выхода из сцены. Вся работа с объектами сводится с созданию массивов и заполнению их инстансами префаба из Resources. Условно как-то так:
Синтаксис:
Используется csharp
using UnityEngine;
using System.Collections;
using System.Collections.Generic;

public class xxx : MonoBehaviour {
        private GameObject[] GO_inst;
        public static GameObject GO_Grp;
        void Start(){
                GO_inst = new GameObject[50];
                GO_Grp = new GameObject();
                for (int i = 0; i< 50; i++){   
                        GO_inst[i] = Instantiate(Resources.Load("yyy")) as GameObject;
                        GO_inst[i].transform.parent = GO_Grp.transform;
                }
        }
        void Update () {
        }
}


Все что потом делается с GO_Grp, это трансформ. Уже в другом скрипте.

Очень непросто отлавливать ошибку, которая появляется раз в час. Причем при абсолютно одинаковых действиях юзера.
mr.Wolfram
UNец
 
Сообщения: 41
Зарегистрирован: 03 янв 2012, 15:01

Re: MissingReferenceException Помогите забороть.

Сообщение Volandpro 09 янв 2013, 12:08

А если через карутину сделать?) И еще - если никак не получится убрать ошибку(она же у Вас ни на что не влияет, как Вы сказали), запихайте код в Try Catch, а то ошибки - это плохо)
Аватара пользователя
Volandpro
UNITрон
 
Сообщения: 242
Зарегистрирован: 19 авг 2012, 17:07

След.

Вернуться в Почемучка

Кто сейчас на конференции

Сейчас этот форум просматривают: GoGo.Ru [Bot], Google [Bot], Yandex [Bot] и гости: 21


cron