Статьи:Как писать скрипты

Материал из Blitz3D to Unity3D Wiki Project
Перейти к: навигация, поиск

Основа всего - MonoBehaviour

Любой скрипт, который должен давать поведение игровому объекту или хранить о нем какие-то сведения будет так или иначе унаследован от класса MonoBehaviour. Этот скрипт предоставляет все необходимые методы и свойства объекта, к которому он будет добавлен, а так же добавлять поведение этому объекту.

Название скрипта

Название файла скрипта должно совпадать с именем класса скрипта. Если имена отличаются - то Вы не сможете добавить скрипт объекту, а так же получите соответствующее сообщение в консоль. Слава богу начиная с Unity 3.4 имена классов устанавливаются автоматически при создании скриптов. Но если переименовываете либо название класса, либо название файла - не забывайте переименовывать второе.

Сообщения, которые получает скрипт

MonoBehaviour получает следующие сообщения, которые часто зависят от контекста (например наличия на объекте других компонентов, таких как Collider или Rigidbody и т.д.)

  • Update Выполняется каждый кадр, если скрипт включен (enabled).
  • LateUpdate Выполняется каждый кадр, если скрипт включен (enabled), но после того как на всех объектах сработал Update.
  • FixedUpdate Эта функция выполняется фиксированное число раз в серунду, скрипт включен (enabled).
  • Awake Вызывается после создания скрипта при его инициализации.
  • Start Вызывается один раз перед первым выполнением любого из методов Update.
  • Reset Восстанавливает значения переменных скрипта по умолчанию.
  • OnMouseEnter Вызывается, если мышка встала над GUIElement или Collider, имеющийся на этом объекте.
  • OnMouseOver Вызывается каждый кадр, пока мышка находится над GUIElement или Collider имеющихся на этом объекте.
  • OnMouseExit Вызывается, если мышка покинула область GUIElement или Collider имеющихся на этом объекте.
  • OnMouseDown Вызывается, если было выполнено нажатие кнопки мыши над GUIElement или Collider.
  • OnMouseUp Вызывается, если было выполнено отжатие кнопки мыши GUIElement или Collider.
  • OnMouseUpAsButton Вызывается, если было выполнено отжатие кнопки мыши на том же GUIElement или Collider, на котором было выполнено нажатие.
  • OnMouseDrag Выполняется каждый кадр, если нажата клавиша мыши на GUIElement или Collider и не отжата.
  • OnTriggerEnter Происходит, если другой (other) Collider вошел в триггер.
  • OnTriggerExit Происходит, если другой (other) Collider вышел из триггер.
  • OnTriggerStay Выполняется каждый кадр для всех коллайдеров, которые касаются триггера.
  • OnCollisionEnter Выполняется если текущий collider/rigidbody начинает касаться другого rigidbody/collider.
  • OnCollisionExit Выполняется если текущий collider/rigidbody перестает касаться другого rigidbody/collider.
  • OnCollisionStay Выполняется каждый кадр для каждого collider/rigidbody которых касается текущий rigidbody/collider.
  • OnControllerColliderHit Происходит, когда контроллер ударяется о коллайдер при выполнении операции Move.
  • OnJointBreak Вызывается, если joint добавленный текущему объекту ломается.
  • OnParticleCollision Вызывается, когда частица ударяется о колайдер.
  • OnBecameVisible Вызывается, когда renderer становится видим для какой либо камеры.
  • OnBecameInvisible Вызывается, когда renderer становится невидим для всех камер.
  • OnLevelWasLoaded Вызывается, после того, как был загружен уровень.
  • OnEnable Вызывается, когда объект становится включенным и активным.
  • OnDisable Вызывается, когда объект становится выключенным или неактивным.
  • OnDestroy Вызывается, при уничтожении скрипта.
  • OnPreCull Вызывается перед тем, как камера выполнит кулинг (cull).
  • OnPreRender Вызывается перед тем, как камера начнет рендеринг сцены.
  • OnPostRender Вызывается после рендеринга сцены.
  • OnRenderObject Вызывается после того как камера выполнила рендеринг сцены.
  • OnWillRenderObject Вызывается раз для каждой камеры если камера "видит" объект.
  • OnGUI Вызывается для рендеринга GUI и перехвата событий GUI.
  • OnRenderImage Вызывается после завершения рендеринга для рендеринга изображения (используется в полноэкранных эффектах)
  • OnDrawGizmosSelected Вызывается, если объект выбран в Scene. Используется для вывода вспомогательной геометрии в редакторе.
  • OnDrawGizmos Вызывается всегда, если объект находится в Scene. Используется для вывода вспомогательной геометрии в редакторе.
  • OnApplicationPause Вызывается на всех объектах, если плеер перешел в режим паузы.
  • OnApplicationFocus Вызывается на всех объектах, если плеер получил или потерял фокус.
  • OnApplicationQuit Вызывается на всех объектах, до того, как приложение завершиться.
  • OnPlayerConnected Вызывается на сервере, когда новый игрок успешно подсоединился.
  • OnServerInitialized Вызывается когда вызванная команда Network.InitializeServer завершилась.
  • OnConnectedToServer Вызывается на клиенте, когда он успешно подключился к серверу.
  • OnPlayerDisconnected Вызывается на сервере, когда игрок отключился.
  • OnDisconnectedFromServer Вызывается на клиенте при отключении от сервера.
  • OnFailedToConnect Вызывается на клиенте, если не удалось подключиться к серверу.
  • OnFailedToConnectToMasterServer Вызывается на клиентах и серверах при проблемах подключения к мастерсерверу (MasterServer).
  • OnMasterServerEvent Выполняется при получении сообщения от мастерсервера (MasterServer).
  • OnNetworkInstantiate Вызывается на объектах, которые создаются с помощью Network.Instantiate
  • OnSerializeNetworkView Вызывается для кастомной синхронизации переменных скрипта, за которым наблюдает NetworkView.

Как создать правильно определение функции обработки сообщения

Для того, чтобы правильно сделать определение функции приемника сообщения - кликаем по функции, переходми на официальную справку и копируем из примера функцию обработчик.

Например для сообщения OnTriggerEnter верным будет следующее определение функции:

// other - переменная типа Collider, это тот коллайдер, который вошел в триггер
void OnTriggerEnter(Collider other) 
{
     // обработка события  
}

Модификатор функции может быть как public так и internal или private или protected. Выбирайте по необходимости любой. Тип возвращаемого значения - всегда void, за исключением того если функция используется как сопрограмма (Coroutine). В таком случае тип возвращаемой функции IEnumerator. Но в таком случае должна быть хотя бы одна операция yield return ХХХ. Но прежде чем сделать функцию корутиной - проверьте, можно ли. Для этого в той же справке посмотрите, нет ли где строки "ХХХ cannot be a co-routine." Это значит что данная функция не может быть вызвана как сопрограмма. Сопрограммами не могут быть Awake, Update, OnGUI и т.д.

Как создавать параметры скриптов

Каждый скрипт (компонент) может содержать как внешние параметры (видимые пользователю в редакторе), так и внутренние. Внешние параметры сериализуются Unity (сохраняются). Внешние параметры должны быть объявлены с модификатором public. Все остальные параметры считаются внутренними (не отображаются пользователю), но могут сериализоваться, если им указан атрибут SerializeField.

Unity может сриализовать (сохранять) следующие типы данных на объектах:


Пример:

using System;
using System.Collections.Generic;
using UnityEngine;

// скрипт требует наличия компонента CharacterController
// это значит что при добавлении скрипта объекту будет 
// автоматически добавлен компонент CharacterController
[RequireComponent(typeof(CharacterController))]
public class SerializationExample : MonoBehaviour
{
    // публичная переменная типа string, сериализуется
    public string userName;

    // приватная переменная типа int не сериализуется и не отображается
    private int _status;

    // приватная переменная типа bool - сериализуется и отображается
    [SerializeField]
    private bool _flag;


    // публичная переменная типа int сериализуется, но не отображается
    [HideInInspector]
    public int life;


    // публичный массив типа GameObject[], сериализуется
    public GameObject[] objects;

    // публичный список трансформов, сериализуется
    public List<Transform> waypoints;

    // сериализуемый класс, который можно использовать для группировки параметров
    [Serializable]
    public class MyDataClass
    {
        public List<AudioClip> sounds;
        public float soundVolume;
    }

    // публичная переменная типа MyDataClass, сериализуется
    public MyDataClass soundOptions;

}


Результат отображения скрипта в инспекторе:

Serialization example.png