Ошибка в скрипте.

Программирование на Юнити.

Ошибка в скрипте.

Сообщение wild_r 24 июн 2009, 14:22

Аттачинг этого скрипта приводит к падению Эдитора. Он должен заменить все одинаковые объекты на инстансы одного. Одинаковость определяется одинаковым материалом.

Код: Выделить всё
function Start() {
   var objs = new Array();
   var i : Number;
   var k : Number;
   var hash = new Array();
   var trans_pos : Vector3;
   var trans_rot : Quaternion;
   for(i=0; i<objs.length;i++){
      hash[i]=1;
   }
   for(i=0; i<objs.length; i++) {
      if(hash[i]==1){
         for (k=i; k<objs.length; k++) {
            if((hash[k]==1)&&(objs[k].sharedMaterial== objs[i].sharedMaterial)){
               trans_pos=objs[k].gameObject.transform.position;
               trans_rot=objs[k].gameObject.transform.rotation;
               Destroy(objs[k].gameObject);
               objs[k]=Instantiate(objs[i],trans_pos,trans_rot);
               hash[k]=0;
            }   
         }
                        hash[i]=0;
      }
   }
}


Скорее всего, здесь несколько ошибок. Например - у меня возникает вопрос, правильно-ли убиваются объекты, а также общая корректность такого кода. 8-x
Последний раз редактировалось wild_r 24 июн 2009, 15:22, всего редактировалось 2 раз(а).
wild_r
UNITрон
 
Сообщения: 220
Зарегистрирован: 16 апр 2009, 20:46
Откуда: Россия, Санкт - Петербург
  • ICQ

Re: Ошибка в скрипте.

Сообщение Neodrop 24 июн 2009, 14:33

Ну нормально. Вы получаете Transform объекта, потом убиваете объект, а потом пытаетесь использовать его Transform
Малость блондиночная логика, мне кажется. :-?
Добавить neodrop в Skype
Изображение
"Спасибо!" нашему порталу, вы сможете сказать ЗДЕСЬ.
Если проблема не решается честно, нужно её обмануть! || Per stupiditas at Astra!
Страх порождает слабость. Бесстрашных поражают пули.
Протратившись на блядях байтах, на битах не экономят.
Аватара пользователя
Neodrop
Админ
 
Сообщения: 8480
Зарегистрирован: 08 окт 2008, 15:42
Откуда: Питер
Skype: neodrop
  • Сайт

Re: Ошибка в скрипте.

Сообщение wild_r 24 июн 2009, 14:34

А ничего что я трансформ сохраняю? Или оно передастся как ссылка?

P.S. Я уж промолчу про вашу доброту.
wild_r
UNITрон
 
Сообщения: 220
Зарегистрирован: 16 апр 2009, 20:46
Откуда: Россия, Санкт - Петербург
  • ICQ

Re: Ошибка в скрипте.

Сообщение Neodrop 24 июн 2009, 14:40

Конечно как ссылка. Сохранили бы вы его только в случае инстансирования.
Получите Vector3 позицию и вращение замещаемого оригинала и передайте их инстансу. Делов то.
Добавить neodrop в Skype
Изображение
"Спасибо!" нашему порталу, вы сможете сказать ЗДЕСЬ.
Если проблема не решается честно, нужно её обмануть! || Per stupiditas at Astra!
Страх порождает слабость. Бесстрашных поражают пули.
Протратившись на блядях байтах, на битах не экономят.
Аватара пользователя
Neodrop
Админ
 
Сообщения: 8480
Зарегистрирован: 08 окт 2008, 15:42
Откуда: Питер
Skype: neodrop
  • Сайт

Re: Ошибка в скрипте.

Сообщение wild_r 24 июн 2009, 14:42

Понял, спасибо! Ошибся с сутью трансформа.
wild_r
UNITрон
 
Сообщения: 220
Зарегистрирован: 16 апр 2009, 20:46
Откуда: Россия, Санкт - Петербург
  • ICQ

Re: Ошибка в скрипте.

Сообщение wild_r 24 июн 2009, 14:50

Все равно крэш...

Код: Выделить всё
Stacktrace:

  at (wrapper managed-to-native) UnityEngine.Object.Internal_InstantiateSingle (UnityEngine.Object,UnityEngine.Vector3,UnityEngine.Quaternion) <0x00004>
  at (wrapper managed-to-native) UnityEngine.Object.Internal_InstantiateSingle (UnityEngine.Object,UnityEngine.Vector3,UnityEngine.Quaternion) <0xffffffff>
  at UnityEngine.Object.Instantiate (UnityEngine.Object,UnityEngine.Vector3,UnityEngine.Quaternion) [0x00017] in C:\builds\unity-trunk\unity\Runtime\Export\Generated\BaseClass.cs:50
  at newbehaviourscript.Start () [0x00192] in E:\Uniti projects\pripyat_pro\Assets\Scripts\newbehaviourscript.js:68
  at (wrapper runtime-invoke) staticperformanceoptimization.runtime_invoke_void (object,intptr,intptr,intptr) <0xffffffff>
wild_r
UNITрон
 
Сообщения: 220
Зарегистрирован: 16 апр 2009, 20:46
Откуда: Россия, Санкт - Петербург
  • ICQ

Re: Ошибка в скрипте.

Сообщение Neodrop 24 июн 2009, 14:52

Код то где?
Добавить neodrop в Skype
Изображение
"Спасибо!" нашему порталу, вы сможете сказать ЗДЕСЬ.
Если проблема не решается честно, нужно её обмануть! || Per stupiditas at Astra!
Страх порождает слабость. Бесстрашных поражают пули.
Протратившись на блядях байтах, на битах не экономят.
Аватара пользователя
Neodrop
Админ
 
Сообщения: 8480
Зарегистрирован: 08 окт 2008, 15:42
Откуда: Питер
Skype: neodrop
  • Сайт

Re: Ошибка в скрипте.

Сообщение wild_r 24 июн 2009, 14:54

Выше, щас, я заметил тут одиин скрипт левый затесался. Снес его, теперь репорт другой:

Код: Выделить всё
Stacktrace:

  at (wrapper managed-to-native) UnityEngine.Object.Internal_InstantiateSingle (UnityEngine.Object,UnityEngine.Vector3,UnityEngine.Quaternion) <0x00004>
  at (wrapper managed-to-native) UnityEngine.Object.Internal_InstantiateSingle (UnityEngine.Object,UnityEngine.Vector3,UnityEngine.Quaternion) <0xffffffff>
  at UnityEngine.Object.Instantiate (UnityEngine.Object,UnityEngine.Vector3,UnityEngine.Quaternion) [0x00017] in C:\builds\unity-trunk\unity\Runtime\Export\Generated\BaseClass.cs:50
  at newbehaviourscript.Start () [0x00192] in E:\Uniti projects\pripyat_pro\Assets\Scripts\newbehaviourscript.js:68
  at (wrapper runtime-invoke) newbehaviourscript.runtime_invoke_void (object,intptr,intptr,intptr) <0xffffffff>


68 строка это вот эта:

Код: Выделить всё
objs[k]=Instantiate(objs[i],trans_pos,trans_rot);


З.Ы. Строк так много, ибо там комментарии. Скрипт может трансформироватся для разных задач.
wild_r
UNITрон
 
Сообщения: 220
Зарегистрирован: 16 апр 2009, 20:46
Откуда: Россия, Санкт - Петербург
  • ICQ

Re: Ошибка в скрипте.

Сообщение Neodrop 24 июн 2009, 15:13

А это чего за переменные такие?
var i : Number;
var k : Number;

почему не int ? :-?
Добавить neodrop в Skype
Изображение
"Спасибо!" нашему порталу, вы сможете сказать ЗДЕСЬ.
Если проблема не решается честно, нужно её обмануть! || Per stupiditas at Astra!
Страх порождает слабость. Бесстрашных поражают пули.
Протратившись на блядях байтах, на битах не экономят.
Аватара пользователя
Neodrop
Админ
 
Сообщения: 8480
Зарегистрирован: 08 окт 2008, 15:42
Откуда: Питер
Skype: neodrop
  • Сайт

Re: Ошибка в скрипте.

Сообщение Neodrop 24 июн 2009, 15:14

И в коде так и не заменен убиенный transform.
Добавить neodrop в Skype
Изображение
"Спасибо!" нашему порталу, вы сможете сказать ЗДЕСЬ.
Если проблема не решается честно, нужно её обмануть! || Per stupiditas at Astra!
Страх порождает слабость. Бесстрашных поражают пули.
Протратившись на блядях байтах, на битах не экономят.
Аватара пользователя
Neodrop
Админ
 
Сообщения: 8480
Зарегистрирован: 08 окт 2008, 15:42
Откуда: Питер
Skype: neodrop
  • Сайт

Re: Ошибка в скрипте.

Сообщение wild_r 24 июн 2009, 15:23

Neodrop писал(а):А это чего за переменные такие?
var i : Number;
var k : Number;

почему не int ? :-?


А чем намберы плохи?
wild_r
UNITрон
 
Сообщения: 220
Зарегистрирован: 16 апр 2009, 20:46
Откуда: Россия, Санкт - Петербург
  • ICQ

Re: Ошибка в скрипте.

Сообщение Mr_Anderson 24 июн 2009, 15:36

Нафига Number если числовой тип заранее известен (int), лишние тормоза и непонятки... Киньте исправленный код, приводящий к крешу, затестим ;)
Mr_Anderson
UNIт
 
Сообщения: 143
Зарегистрирован: 16 апр 2009, 13:32

Re: Ошибка в скрипте.

Сообщение wild_r 24 июн 2009, 20:31

Исправил скрипт и кое-что на сцене. Скрипт сработал как надо, получил прибавку в 3-4 фпс.

Вот сам скрипт:

Код: Выделить всё
@script ExecuteInEditMode()

function Start() {
   var objs = new Array();
   var i : int;
   var k : int;
   var hash = new Array();
   var trans_pos : Vector3;
   var trans_rot : Quaternion;
   objs = FindObjectsOfType(MeshRenderer);

   for(i=0; i<objs.length;i++){
      hash[i]=1;
   }

   for(i=0; i<objs.length; i++) {
      if(hash[i]==1){
         for (k=i; k<objs.length; k++) {
            if((hash[k]==1)&&(objs[k].sharedMaterial== objs[i].sharedMaterial)){
               trans_pos=objs[k].gameObject.transform.position;
               trans_rot=objs[k].gameObject.transform.rotation;
               DestroyImmediate(objs[k].gameObject);
               objs[k]=Instantiate(objs[i],trans_pos,trans_rot);
               hash[k]=0;
            }   
         }
         hash[i]=0;
      }
   }
}


Код на ЖабеСкрипт, ибо мне не важна скорость (он работает в эдиторе), а помимо этого там еще под сотню закомментированых строк.

З.Ы. Я правильно понял, что конструкция SendMesssage это аналог Visitor pattern?
wild_r
UNITрон
 
Сообщения: 220
Зарегистрирован: 16 апр 2009, 20:46
Откуда: Россия, Санкт - Петербург
  • ICQ

Re: Ошибка в скрипте.

Сообщение Neodrop 24 июн 2009, 22:02

SendMessage это аналог прямого вызова функции. Про паттерны не знаю.
3-4 fps это сколько в процентах в вашем случае? :-?
Добавить neodrop в Skype
Изображение
"Спасибо!" нашему порталу, вы сможете сказать ЗДЕСЬ.
Если проблема не решается честно, нужно её обмануть! || Per stupiditas at Astra!
Страх порождает слабость. Бесстрашных поражают пули.
Протратившись на блядях байтах, на битах не экономят.
Аватара пользователя
Neodrop
Админ
 
Сообщения: 8480
Зарегистрирован: 08 окт 2008, 15:42
Откуда: Питер
Skype: neodrop
  • Сайт

Re: Ошибка в скрипте.

Сообщение wild_r 24 июн 2009, 22:40

Neodrop писал(а):SendMessage это аналог прямого вызова функции. Про паттерны не знаю.
3-4 fps это сколько в процентах в вашем случае? :-?


В тяжелых моментах от 10 до 20 процентов. Примерно. В легких не считал.

P.S. Прирост на моем железе, но тоже неплохо.
wild_r
UNITрон
 
Сообщения: 220
Зарегистрирован: 16 апр 2009, 20:46
Откуда: Россия, Санкт - Петербург
  • ICQ


Вернуться в Скрипты

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

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 8