- •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" компилируются последними.
4. Используйте встроенные масивы.
Встроенные массивы быстрые, очень быстрые, так что используйте их.
В то время как классы ArrayList или Array легче для использования т.к. Вы можете легко добавлять элементы, они не имеют такой же производительности elements. Встроенные массивы имеют фиксированный размер, но в большинстве случаев Вы знаете максимальный размер заранее и можете заполнить массив позже. Наилучшее во встроенных массивах то, что они напрямую содержат данные в одном плотном буфере без дополнительной информации о типе данных или других накладных расходов. Т.о. итерация в них очень легка, т.к. они располагаются линейно в памяти.
private var positions : Vector3[];
function Awake () {
positions = new Vector3[100];
for (var i = 0; i < 100; i++)
positions[i] = Vector3.zero;
}
5. Не вызывайте функцию, если Вам это не нужно.
Наиболее простая и лучшая из всех оптимизаций, и требующая наименьших затрат. Например, если враг далеко, в большинстве случаев приемлемо "усыпить" его. Т.е. не делать с ним ничего пока игрок не подойдет ближе. Медленный способ обработки этой ситуации будет выглядеть так:
var target : Transform;
function Update () {
// Early out if the player is too far away.
if (Vector3.Distance(transform.position, target.position) > 100)
return;
// perform real work work...
}
Это не очень хорошее решение, т.к. Unity вызывает функцию update и Вы производите работу каждый кадр. Лучшее решение - отключить поведение пока игрок не приблизится. Есть 3 пути сделать это:
1. Использование OnBecameVisible и OnBecameInvisible. Вызовы этих функций завязаны с системой рендеринга. Когда любая камера может увидеть объект, вызывается OnBecameVisible, когда объект выходит из области видимости всех камер вызывается OnBecameInvisible. В некоторых случаях это очень полезно. Но для AI это не стоит использовать, т.к. враги перестанут действовать, когда Вы отвернете от них камеру.
function OnBecameVisible () {
enabled = true;
}
function OnBecameInvisible () {
enabled = false;
}
2. Использование триггеров. Простой сферический триггер может чудесно работать в данном случае. Вы получите вызовы OnTriggerEnter/Exit при входе/выходе в колайдер
function OnTriggerEnter (c : Collider) {
if (c.CompareTag("Player"))
enabled = true;
}
function OnTriggerExit (c : Collider) {
if (c.CompareTag("Player"))
enabled = false;
}
3. Использование Корутин. Проблема с Unity в том, что она вызывается каждый кадр. Вполне возможно, проверка расстояния до игрока может быть выполнена только каждые 5 секунд. Это позволит сэкономить много времени затраченного процессором на расчеты.
Использование C# и Boo
Помимо синтаксиса, есть некоторые различия при написании сценариев в C # или Boo. Наиболее примечательными являются:
1. Носледование от MonoBehaviour
Все скрипты поведения должны наследоваться от MonoBehaviour (напрямую или через другие скрипты). Это делается автоматически в Javascript, но должно быть указано прямо в C# или Boo. Если Вы создаете Ваш скрипт в Unity через Asset -> Create -> C Sharp/Boo Script menu, the created template will already contain the necessary definition.
public class NewBehaviourScript : MonoBehaviour {...} // C#
class NewBehaviourScript (MonoBehaviour): ... # Boo
