[РЕШЕНО] UnityScript странности!

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

[РЕШЕНО] UnityScript странности!

Сообщение webjema 10 авг 2012, 21:29

Друзья! Я в отчаянии. Больше нет сил. Юнити разрывает мне мозг.
Хоть я и 12 лет программирую под web, не могу переварить UnityScript. В могилу меня сведет.
Подскажите, где я не прав или это мегаглюки Unity (он глючит или я?????).

Вопрос первый
Имеем родительский класс:
Синтаксис:
Используется javascript
class CardZone {
        var userSide : String; // my or opponent
        var zoneX = 0.0f; // coordinates of zone
        var zoneZ = 0.0f;
        function CardZone(side : String, x:float, z:float) {
                this.userSide = side;
                this.zoneX = x;
                this.zoneZ = z;
        } // constructor
} // class
 


Есть еще класс, который расширяет CardZone:
Синтаксис:
Используется javascript
class Support extends CardZone {
        function Support(side : String, x:float, z:float) {
                super(side, x, z);
        } // constructor
} // Support
 


Создаем в главном скрипте объект:
var foo = new Support("my", 10.46, -11.73);

При создании, значение "my" записывается как надо в this.userSide и доступно. Далее в коде, при вызове методов объекта foo переменная this.userSide оказывается ПУСТОЙ!!! Ну никак я не могу это понять!
В точно таком же соседнем объекте все ок, а в этом обнуляется. Хотя раньше работало.
Причем я отлаживаю работу в WebPlayer, и это страшная головная боль.
Сейчас пока это писал, подумал, может мне эти костыли ставит мегадолбанный инспектор (Inspector) из самого Unity? Как этого паршивца заставить не залазить куда его не просят (в переменные моих классов)???

Вопрос второй
В главном скрипте есть переменная:
Синтаксис:
Используется javascript
var myObjects = new Dictionary.<int,Transform>();

В одном скрипте я отлично к переменой добираюсь:
Синтаксис:
Используется javascript
var mainGameObject = GameObject.Find("MainGameObject");
var mainScript = mainGameObject.GetComponent(mainscript);
var obj : Transform;
obj = mainScript.myObjects[ id ];


а в другом, эта же конструкция не работает! Не срабатывает строчка obj = mainScript.myObjects[ id ]; хотя вывод mainScript.myObjects работает, и показывает правильный тип. Не работает даже mainScript.myObjects.ContainsKey(id)

Друзья, я уже просто плачу. 10 минут пишу код и часами его отлаживаю, так как перестает работать даже то, что вчера работало и после этого ни кто его не трогал. Скопированный код в соседнюю функцию перестает работать - это жесть! Как можно программировать в таких условиях.

Подскажите, где я не прав. Что я делаю не так.
Спасибо!
Последний раз редактировалось webjema 11 авг 2012, 10:19, всего редактировалось 1 раз.
webjema
UNец
 
Сообщения: 40
Зарегистрирован: 26 июл 2012, 15:00

Re: UnityScript странности!

Сообщение webjema 10 авг 2012, 21:38

По первому вопросу догадка подтвердилась.
Unity после отработки констуктора класса (создания объекта и инициализации его свойств) записывал в переменную объекта значение этой переменной из Inspector (в который я ничего не задавал).
Жуткая штука. Эту фигню я отлаживал часа два, искал как же оно обнуляет переменную объекта.

По второму вопросу у меня вообще даже идей нет.
webjema
UNец
 
Сообщения: 40
Зарегистрирован: 26 июл 2012, 15:00

Re: UnityScript странности!

Сообщение seaman 10 авг 2012, 21:52

1. Не используйте конструкторы классов для скриптов производных от MonoBehaviour!(в JS это видимо ВСЕ скрипты) Для инициализации используйте Awake и Start. Это четко написано в мануале.
2.
эта же конструкция не работает! Не срабатывает строчка obj = mainScript.myObjects[ id ];

Мало данных. Что значит "не срабатывает"?
seaman
Адепт
 
Сообщения: 8352
Зарегистрирован: 24 янв 2011, 12:32
Откуда: Самара

Re: UnityScript странности!

Сообщение Woolf 10 авг 2012, 21:59

webjema писал(а):По первому вопросу догадка подтвердилась.
Unity после отработки констуктора класса (создания объекта и инициализации его свойств) записывал в переменную объекта значение этой переменной из Inspector (в который я ничего не задавал).
Жуткая штука. Эту фигню я отлаживал часа два, искал как же оно обнуляет переменную объекта.


И что здесь неверного? Все правильно она делает. Когда ей переменную из инспектора устанавливать? До конструктора, что-ли? Не хотите, чтобы инспектором задавались переменные - ставьте ей приват или не наследуйтесь от бихавиора.


Друзья, я уже просто плачу. 10 минут пишу код и часами его отлаживаю, так как перестает работать даже то, что вчера работало


Совет хотите? Пересаживайтесь на сишарп ))
Разработчик theFisherOnline - там, где клюёт
Разработчик Atom Fishing II - Первая 3D MMO про рыбалку
Разработчик Atom Fishing - Рыбалка на поплавок, донку, нахлыст, блесну в постъядерный период.
Аватара пользователя
Woolf
Адепт
 
Сообщения: 7179
Зарегистрирован: 02 мар 2009, 16:59

Re: UnityScript странности!

Сообщение seaman 10 авг 2012, 22:03

Нашел в мануале:
Мануал
Never initialize any values in the constructor or variable initializers in a MonoBehaviour script. Instead use Awake or Start for this purpose. Unity automatically invokes the constructor even when in edit mode. This usually happens directly after compilation of a script because the constructor needs to be invoked in order to retrieve default variable values. Not only will the constructor be called at unforeseen times, it might also be called for prefabs or inactive game objects.

Using the constructor when the class inherits from MonoBehaviour, will make the constructor to be called at unwanted times and in many cases might cause Unity to crash.
Only use constructors if you are inheriting from ScriptableObject.

Так что прежде чем ругаться - почитайте мануал внимательнее.
seaman
Адепт
 
Сообщения: 8352
Зарегистрирован: 24 янв 2011, 12:32
Откуда: Самара

Re: UnityScript странности!

Сообщение webjema 10 авг 2012, 22:06

Спасибо добрый человек за ответ!

seaman писал(а):1. Не используйте конструкторы классов для скриптов производных от MonoBehaviour!(в JS это видимо ВСЕ скрипты) Для инициализации используйте Awake и Start. Это четко написано в мануале.

Понял, не знал. Конструкторы действительно срабатывают до Start()

seaman писал(а):2.
эта же конструкция не работает! Не срабатывает строчка obj = mainScript.myObjects[ id ];

Мало данных. Что значит "не срабатывает"?


"не срабатывает" значит не срабатывает. Т.е. на ней скрипт останавливается. Дальше не идет. После этой строчки дебаг информация не выводится.
Так как работает приложение только в WebPlayer (из-за тесного взаимодействия с HTML страницей, то нормального дебага (узнать причину не отработки строки) у меня нет =(
webjema
UNец
 
Сообщения: 40
Зарегистрирован: 26 июл 2012, 15:00

Re: UnityScript странности!

Сообщение webjema 10 авг 2012, 22:08

Woolf писал(а):
Совет хотите? Пересаживайтесь на сишарп ))


Похоже прийдется.
Просто когда изучал информацию о Unity - все так красиво рассказывали, что там скрипты можно писать на JS.
Но как оказалось, это них_ена не JS =)
webjema
UNец
 
Сообщения: 40
Зарегистрирован: 26 июл 2012, 15:00

Re: UnityScript странности!

Сообщение webjema 10 авг 2012, 22:11

Woolf писал(а):Не хотите, чтобы инспектором задавались переменные - ставьте ей приват или не наследуйтесь от бихавиора.


о, private - выход. Респект!
webjema
UNец
 
Сообщения: 40
Зарегистрирован: 26 июл 2012, 15:00

Re: UnityScript странности!

Сообщение Paul Siberdt 10 авг 2012, 22:21

Woolf писал(а):Совет хотите? Пересаживайтесь на сишарп ))

А что изменит переход на сишарп в ситуации оверрайда переменной из поля инспектора?

Если хотите сохранить область видимости, но запретить влияние инспектора, добавьте к переменной атрибут:
Код: Выделить всё
@System.NonSerialized var myVar : int;
Аватара пользователя
Paul Siberdt
Адепт
 
Сообщения: 5317
Зарегистрирован: 20 июн 2009, 21:24
Откуда: Moscow, Russia
Skype: siberdt
  • Сайт

Re: UnityScript странности!

Сообщение webjema 10 авг 2012, 22:24

Paul Siberdt писал(а):А что изменит переход на сишарп в ситуации оверрайда переменной из поля инспектора?


Друзья, первый вопрос решили, спасибо вам огромное.
Подскажите, что не так со всторым? Какую информацию еще дать?
Почему из соседнего аналогичного JS-объекта этот код работает, а тут нет?
Причем код как видим от объекта, в котором исполняется никак не зависит =(((((((
webjema
UNец
 
Сообщения: 40
Зарегистрирован: 26 июл 2012, 15:00

Re: UnityScript странности!

Сообщение webjema 10 авг 2012, 22:27

Paul Siberdt писал(а):Если хотите сохранить область видимости, но запретить влияние инспектора, добавьте к переменной атрибут:
Код: Выделить всё
@System.NonSerialized var myVar : int;


отличный выход, инспектор больше не видит то, что ему не положено видеть =)
webjema
UNец
 
Сообщения: 40
Зарегистрирован: 26 июл 2012, 15:00

Re: UnityScript странности!

Сообщение Paul Siberdt 10 авг 2012, 22:28

По второму вопросу проследите, где вы геткомпонентите в Awake, где в Start... возможно, нарушена очередность вызовов и кто-то раньше положенного получает null заместо ссылки на класс или на ваш нерожденный Dictionary.

Если у вас new Dictionary срабатывает в Старте, вы можете через некоторые скрипты из их Старта геткомпонентнуть раньше времени.

Решение обычное - инитить в Awake, обращаться в Start.
Решение адванстнутое - обращаться из скрипта, где произошел инит (то бишь, эдакий менеджер)
Решение спорное - в настройках Script Execution Order разбросать последовательность запусков скриптов по вкусу.
Аватара пользователя
Paul Siberdt
Адепт
 
Сообщения: 5317
Зарегистрирован: 20 июн 2009, 21:24
Откуда: Moscow, Russia
Skype: siberdt
  • Сайт

Re: UnityScript странности!

Сообщение webjema 10 авг 2012, 22:38

Paul Siberdt писал(а):По второму вопросу проследите...


обращения идут в основном цикле уже (после реакции пользователя).
Т.е. для обоих JS-объектов условия одинаковые.

Перед ошибкой вывожу mainScript.myObjects - все нормально, тип как объявлен во время инициализации. И что интересно, даже не работает mainScript.myObjects.ContainsKey(id) (на этой конструкции выполнение скрипта тоже обрывается!)
webjema
UNец
 
Сообщения: 40
Зарегистрирован: 26 июл 2012, 15:00

Re: UnityScript странности!

Сообщение Paul Siberdt 10 авг 2012, 22:52

Я хрен знаю, что такое Dictionary :)
Никогда в руках не держал и как они в JS работают - тож не знаю.

Сделайте пэкэдж с глюком, вложите в сообщение - мож так пойму что есть что.
Аватара пользователя
Paul Siberdt
Адепт
 
Сообщения: 5317
Зарегистрирован: 20 июн 2009, 21:24
Откуда: Moscow, Russia
Skype: siberdt
  • Сайт

Re: UnityScript странности!

Сообщение webjema 10 авг 2012, 22:55

Paul Siberdt писал(а):Я хрен знаю, что такое Dictionary :)
Никогда в руках не держал и как они в JS работают - тож не знаю.


хе-хе =)
Dictionary на msdn.microsoft.com
webjema
UNец
 
Сообщения: 40
Зарегистрирован: 26 июл 2012, 15:00

След.

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

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

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