- •Unity Script
- •Глава 1 Введение
- •Глава 2 Сценарии
- •Глава 3 Основные понятия
- •1. Назначение ссылочных типов переменных при помощи инспектора
- •2. Расположение объектов в окне иерархии
- •3. Имена и теги
- •4. Принятие в качестве параметра
- •5. Все скрипты одного типа
- •1. Используйте статическую типизацию.
- •2. Используйте #pragma strict
- •3. Кешируйте найденные компоненты.
- •4. Используйте встроенные масивы.
- •5. Не вызывайте функцию, если Вам это не нужно.
- •1. Носледование от MonoBehaviour
- •2.Использование функций Awake или Start для инициализации.
- •3. Имя класса должно соответствовать имени файла.
- •4. Корутины имеют иной синтаксис в c#.
- •5. Не используйте пространства имен.
- •6. Только публичные поля сериализуются и показываются в инспекторе.
- •7. Избегайте использования конструкторов или инициализации переменных.
- •1. Все скрипты в "Standard Assets", "Pro Standard Assets" или "Plugins" компилируются первыми.
- •2. Все скрипты в "Standard Assets/Editor", "Pro Standard Assets/Editor" или "Plugins/Editor" компилируются далее.
- •3. Все другие скрипты вне "Editor" компилируются далее.
- •4. Все скрипты в папке "Editor" компилируются последними.
1. Используйте статическую типизацию.
Когда Вы пишете на JavaScript наиболее важная оптимизация - использование статической типизации вместо динамической. Unity использует технику, называемую "type inference" для автоматического конвертирования JavaScript конструкций в статически типизированный код без необходимости Вам проделывать эту работу.
var foo = 5;
В примере выше foo будет автоматически преобразована в целый тип. Т.о. Unity может использовать множество оптимизаций времени компиляции, без дорогостоящего поиска типа переменной. Это одна из причин почему реализация JavaScript в Unity в среднем в 20 раз быстрее чем другие реализации.
Единственная проблема, что иногда не все может быть преобразовано таким образом, что возвращает Unity к динамической типизации. Из-за динамической типизации писать код на JavaScript проще, однако это же делает код медленнее.
Давайте посмотрим на некоторые примеры.
function Start () {
var foo = GetComponent(MyScript);
foo.DoSomething();
}
Здесь foo будет динамически типизировано, т.о. вызов функции DoSomething будет намного более долгим, чем необходимо - из-за того, что тип foo неизвестен нужно выяснить поддерживается ли он функцией DoSomething и если да - вызвать ее.
function Start () {
var foo : MyScript = GetComponent(MyScript);
foo.DoSomething();
}
Тут мы напрямую указываем тип foo. Вы при этом получите намного более хорошую производительность.
2. Используйте #pragma strict
Теперь проблема, что Вы можете не заметить, что используете динамическую типизацию. #pragma strict - Ваше спасение! Просто добавьте #pragma strict на самый верх скрипта, и Unity запретит динамическую типизацию в этом скрипте, силой заставляя Вас использовать статическую. Когда при компиляции тип не может быть определен, Unity выведет ошибку компиляции. Так в этом случае, foo произведет ошибку при компиляции:
#pragma strict
function Start () {
var foo : MyScript = GetComponent(MyScript) as MyScript;
foo.DoSomething();
}
3. Кешируйте найденные компоненты.
Еще одна оптимизация - кэширование компонентов. Эта оптимизация, к сожалению, требует некоторых усилий при кодировании и не всегда стоит затраченных на нее усилий. Но если Ваш скрипт действительно использует их множество и Вам нужно получить последний кусочек производительности, это может быть очень хорошей оптимизацией.
Когда бы Вы не получали компонент через GetComponent или переменную доступа, Unity находит правильный компонент в игровом объекте. Время на этот поиск может быть сохранено кэширование ссылки на компонент в приватной переменной.
Просто замените это:
function Update () {
transform.Translate(0, 0, 5);
}
на это:
private var myTransform : Transform;
function Awake () {
myTransform = transform;
}
function Update () {
myTransform.Translate(0, 0, 5);
}
Последний код будет работать намного быстрее, т.к. Unity не нужно искать компонент transform в игровом объекте каждый кадр. Это же применимо для компонентов - скриптов, где Вы используете GetComponent вместо transform или других свойств.
