#pragma strict и инхериты (SphereCollider) в JS

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

#pragma strict и инхериты (SphereCollider) в JS

Сообщение Paul Siberdt 28 дек 2009, 11:23

Натолкнулся на проблемку, лопачу форумы, ответ, как обратиться к радиусу колижн-сферы, пока не нашел :-\

то, что прокатывало в dynamic typing:
Код: Выделить всё
   gameObject.AddComponent ("SphereCollider");
   gameObject.collider.radius = unitScript.sensorDistance_max;
   gameObject.collider.center = Vector3( 0.0,0.0,0.0 );


ругается в статике:
'radius' is not a member of 'UnityEngine.Collider'
Аватара пользователя
Paul Siberdt
Адепт
 
Сообщения: 5317
Зарегистрирован: 20 июн 2009, 21:24
Откуда: Moscow, Russia
Skype: siberdt
  • Сайт

Re: #pragma strict и инхериты (SphereCollider) в JS

Сообщение Paul Siberdt 28 дек 2009, 11:40

Пока решил проблему определением переменной:

Код: Выделить всё
  var myCollider : SphereCollider = gameObject.AddComponent ("SphereCollider");
  myCollider.radius = unitScript.sensorDistance_max;
  myCollider.center = Vector3( 0.0,0.0,0.0 );


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

Re: #pragma strict и инхериты (SphereCollider) в JS

Сообщение Kann 28 дек 2009, 13:54

Ну, в принципе все правильно, вот тут немного из советов по производительности...
1. Использование Статических переменных

При использовании JavaScript наиболее важной оптимизацией является использование статических типов вместо динамических. Unity использует метод, который называется type inference, для автоматической конвертации переменных JavaScript к статическому коду, для этого вам ничего не понадобиться делать.
Код: Выделить всё


   1. var foo = 5; 

var foo = 5;

В приведенном выше примере foo автоматически распознается как переменная типа integer. Таким образом Unity может применить множество оптимизаций времени компиляции, без затратных динамических поисков имени переменной и тд. Это одна из причин, почему Unity JavaScript в среднем в 20 раз быстрее чем какие либо другие реализации JavaScript.

Единственная проблема – не все типы возможно распознать, в таких случаях Unity вернётся обратно к динамическому типу для этих переменных. Использование динамических типов на JavaScript было бы проще для написания кода, тем не менее это бы замедлило его выполнение кода.


Рассмотрим несколько примеров:
Код: Выделить всё

   1. function Start () { 
   2.    var foo = GetComponent(MyScript); 
   3.    foo.DoSomething(); 
   4. } 

function Start () {
   var foo = GetComponent(MyScript);
   foo.DoSomething();
}

В данном варианте foo будет динамически определено, таким образом вызов функции DoSomething длится дольше чем нужно, потому что тип foo неизвестен, и вначале нужно выяснить, поддерживает ли foo функцию DoSomething, и если поддерживает то вызвать её.

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

   1. function Start () { 
   2.  var foo : MyScript = GetComponent(MyScript); 
   3.  foo.DoSomething(); 
   4. } 

function Start () {
var foo : MyScript = GetComponent(MyScript);
foo.DoSomething();
}

Здесь foo у нас имеет определённый тип. Производительность в данном случае будет гораздо лучше.


2. Используйте #pragma strict

Конечно, сейчас проблема состоит в том, что вы обычно не замечаете использование динамической вёрстки. #pragma strict сможет вам помочь. Просто добавьте в начало кода #pragma strict и Unity отключит динамическую вёрстку в данном скрипте, вынуждая вас использовать статическую. Там где тип будет неизвестен, Unity сообщит нам про ошибки компиляции. В этом случае foo будет выдавать ошибку на этапе компиляции:

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

   1. #pragma strict 
   2. function Start () { 
   3.  var foo = GetComponent(MyScript); 
   4.  foo.DoSomething(); 
   5. }

Kann
Старожил
 
Сообщения: 553
Зарегистрирован: 05 ноя 2009, 14:06


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

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

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