Страница 1 из 1

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

СообщениеДобавлено: 28 дек 2009, 11:23
Paul Siberdt
Натолкнулся на проблемку, лопачу форумы, ответ, как обратиться к радиусу колижн-сферы, пока не нашел :-\

то, что прокатывало в 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'

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

СообщениеДобавлено: 28 дек 2009, 11:40
Paul Siberdt
Пока решил проблему определением переменной:

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


... но чет не очень мне нравится такой способ...

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

СообщениеДобавлено: 28 дек 2009, 13:54
Kann
Ну, в принципе все правильно, вот тут немного из советов по производительности...
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. }