Два основных компонента у объекта в Unity3D — это Transform и GameObject.
GameObject
GameObject — основа, контейнер, который содержит в себе все компоненты любой объект в Unity3D. Чтобы удалить, к примеру, игровой объект — удалять нужно именно GameObject этого объекта. Для доступа к GameObject — используется переменная, которая присутствует по умолчанию в любом скрипте, унаследованном от MonoBehaviour (то есть в любом скрипте, созданном через Unity3D).
Получение ссылки на игровой объект
1 2 |
var myGo = gameObject; // мы получили ссылку на GameObject объекта // однако возможно использовать напрямую через gameObject |
Данным способом можно из одного скрипта получить ссылку на другие игровые объекты и управлять ими, их дочерними объектами, а также их компонентами.
Уничтожение игрового объекта
1 |
Destroy(gameObject); // уничтожает данный объект со сцены |
Данным способом можно удалить игровой объект.
Активация/деактивация игрового объекта
1 2 |
gameObject.SetActive(false); // выключает данный объект (и все его дочерние) gameObject.SetActive(true); // включает данный объект (и все его дочерние) |
Деактивация объекта аналогична снятия галочки инспекторе Unity3D, которая обведена красным цветом на скриншоте ниже.
Деактивация элемента деактивирует также все его дочерние объекты и останавливает выполнение в их скриптов.
Добавление новых компонентов и скриптов игровому объекту
1 2 |
gameObject.AddComponent<BoxCollider>(); // добавляет к данному объекту компонент BoxCollider gameObject.AddComponent<Listener>(); // добавляет к данному объекту скрипт Listener |
Таким образом можно добавить абсолютно любой компонент, либо скрипт, который можно добавить в редакторе Unity3D.
Получение доступа к компоненту игрового объекта
1 |
var objectBoxCollider = gameObject.GetComponent<BoxCollider>(); // получение ссылки на компонент BoxCollider |
Таким же образом можно получить доступ к любому компоненту игрового объекта.
Переименование игрового объекта. Считывание имени объекта
1 2 |
gameObject.name = "ObjectNewName"; // меняем имя объекта var objectName = gameObject.name; // считываем имя объекта |
Сделать объект статичным
1 2 |
gameObject.isStatic = true; // делаем объект статичным var isObjectStatic = gameObject.isStatic; // считываем - является ли объект статичным |
Данный код аналогичен установке/снятию галочки в редакторе Unity3D (на скрине ниже).
Установить слои игровому объекту, а также считать их
1 2 |
gameObject.layer = LayerMask.GetMask(new[] {"Environment", "Tree"}); // устанавливает слой var objectLayer = gameObject.layer; // получает числовое представление слоев, к которым относится объект |
Установить тэг игровому объекту, а также его считывание
1 2 |
gameObject.tag = "newTag"; // устанавливает тэг объекту var objectTag = gameObject.tag; // считывает тэг объект |
Transform
С трансформом всё немного проще — этот компонент не является основой, но тем не менее — является основной и, главное, неотъемлемой частью GameObject’а. Он отвечает за месторасположение объекта на сцене, его «вращении», размерах, а также содержит информацию о дочерних и родительском объектах.
Это единственные компонент, который невозможно удалить из GameObject.
Изменение положение объекта
За положение объекта на сцене отвечает элементы transform.position и transform.localPosition.
Они оба являются переменной типа Vector3 и имеют в себе 3 главных составляющих x,y и z, которые соответствуют координатам в трехмерном пространстве. Следует учитывать, что x, y и z невозможно менять напрямую — они только для чтения. Чтобы добавить единичку к x — нужно добавить к самому transform.position новый Vector3, который равен (1,0,0), что добавить к x единицу, а к y и z — нули.
Чем же отличаются transform.position и transform.localPosition?
Их главное (и единственное отличие) заключается в том, что position — показывает и принимает координаты объекта, относительно мировых координат, а localPosition — относительно родительского объекта. Если же игровой объект является «корневым», то есть у него нет родительских объектов, то position и localPosition будут равны.
Движение объекта
Сначала рассмотрим элементарные варианты.
Как мы уже говорили — position (буду далее использовать именно его, так как отличия от localPosition только в том, относительно чего эти координаты) является переменной типа Vector3. Поэтому для его изменения нужно либо прибавить к нему другой вектор, либо вычесть другой вектор, либо заменить его другим вектором.
1 2 3 |
transform.position += new Vector3(1,0,0); // добавляем к X единицу transform.position -= new Vector3(1,1,0); // вычитаем из X и Y единицу transform.position = new Vector3(10,20,30); // устанавливаем объекту координаты 10,20,30 (x,y,z) |
Рекомендуется использовать функцию transform.Translate.
Это уже не переменная, как transform.position — это функция. У неё есть два входящих параметра:
- Vector3, который отвечает за то, в каком направлении будет двигаться объект;
- Space.Self/Space.World — то, относительно чего будет двигаться игровой объект. Space.Self — аналогичен transform.localPosition, а Space.World — аналогичен transform.position.
Вращение объекта
За вращение объекта отвечает компонент transform.rotation, transform.localRotation и функция transform.Rotate.
Здесь все аналогично transform.position. Кроме одного, несмотря на то, что в редакторе Unity3D Rotation представляет собой Vector3, то есть вращение относительно оси X, оси Y, оси Z. Но в коде оно представлено в виде кватернионов. Что такое кватернион — отдельная история. И обычно её изучают в вузах. По факту — знание кватернионов не обязательно для разработки игр. К счастью разработчики Unity3D это понимают и сделали две удобные для программистов вещи:
- Функция transform.Rotate(Vector3 vector, Space.World(либо Self));
- Функция Quaternion.Euler(float x,float y,float z), которая как раз возвращает кватернион;
Меньше слов — больше кода:
1 2 |
var myRotation = Quaternion.Euler(1, 1, 1); //поворачиваем объект по всем трем осям на единицу за такт transform.rotation *= myRotation; // обращаем внимание, что кватернионы не складывают, а умножают. Делить их нельзя. Поэтому для вычета просто делаем значения вектора отрицательными |
Вместо rotation можно применять localRotation, аналогично position.
1 |
transform.Rotate(new Vector3(1,0,0),Space.Self); // либо Space.World |
Такой подход аналогичен transform.Translate и также является более производительным.
Поиск других объектов на сцене
Есть два подхода поиска объекта на сцене.
- GameObject.Find(«имяОбъекта»); Он же «пушка по воробьям». Несмотря на кажущуюся скорость — метод является достаточно прожорливым и при частом использовании на большой сцене может стать большой проблемой. Однако он же самый простой способ (хотя и ненадежный). А ненадежный он потому, что редактор Unity3D позволяет давать одинаковые имена объектам. А GameObject.Find возвращает только один элемент, который он найдет первым.
- transform.FindChild(«имяДочернегоОбъекта») — функция возвращает переменную типа transform нужного объекта. Для доступа к GameObject этого объекта особых усилий прилагать не нужно, так как ссылка на него уже содержится в transform (как и ссылка на transform содержится в GameObject’е).
1 2 3 |
var childTransform = transform.FindChild("myChild1"); var childGameObject = childTransform.gameObject; var anotherTransformLink = childGameObject.transform; |
Также можно запрашивать дочерние элементы по их номеру:
1 2 3 4 5 |
var childCount = transform.childCount; for (var i = 0; i < childCount; i++) { Debug.Log(transform.GetChild(i).name); } |
Также дочерний элемент может запросить родительский, а также родительский родительского и так далее:
1 2 |
var myParent = transform.parent; var rootObject = transform.parent.parent.parent; |
В следующих статьях будет информация о том, что такое private, public, static, отправление сообщений игровым объектам.