Привет! Хотя современный Unity имеет даже не один вариант визуального скриптинга, и кому-то он даже более интересен, я всяк предпочитаю старые добрые рукописные скрипты. Банально потому, что мне это интереснее. Так что сейчас и впредь я буду использовать именно стандартный подход: Visual Studio и C#. Исключениями могут быть пробные заходы и желание попробовать, но за основу визуальный скриптинг брать не хочу.
Останавливаться на разборе VS я тоже не стану, да и по большей мере она будет лишь IDE где я буду писать код, который всяк прикреплю к статье. А вы вместо студии вы можете использовать даже блокнот.
C# является языком для написания скриптов в Unity, так что выбор тут не особо большой. Описывать и разбирать язык не входит в мои планы, так как основной акцент тут будет именно на Unity. Но если вы знакомы с C++ или Java, то обнаружите, что они очень похожи (особенно если брать C# и Java). Стоит также отметить, что как бесплатных (+ документация), так и платных материалов по языку очень много. И если перед погружением в игровой движок вы стремитесь разобрать более досконально C#, то это в ваших силах и не займёт сильно много времени. Я же постараюсь описывать происходящее максимально понятно, но без базовых знаний хоть каких-то ЯП будет сложно.
Итак. А что такое скрипт в Unity? На этот хороший ответ даёт документация, к которой я допишу свои примечания в квадратных кавычках. Поведение игровых объектов контролируется с помощью компонентов (Components), которые присоединяются к ним [Список компонентов объекта вы можете увидеть в инспекторе]. Несмотря на то, что встроенные компоненты Unity могут быть очень разносторонними, вскоре вы обнаружите, что вам нужно выйти за пределы их возможностей, чтобы реализовать ваши собственные особенности геймплея. Unity позволяет вам создавать свои компоненты, используя скрипты. Они позволяют активировать игровые события, изменять параметры компонентов, и отвечать на ввод пользователя каким вам угодно способом. [Т.е. при помощи скриптов мы можем создавать свои компоненты, которые могут использовать другие компоненты, друг друга, ввод и т.д. для создания каких-либо сложных алгоритмов действий, которые не предусмотрены стандартным набором].
Ну, как-то так. Думаю, стало немного понятнее.
Создаём первый скрипт
Не вижу смысла тянуть и предлагаю перейти к созданию скрипта. Для этого в папке Assets пустого проекта создадим папку Scripts, а в ней файл C# Script. Имя скрипта должно быть записано латинскими буквами, может включать цифры (но не первым символом). Пробелов в имени быть не должно! Для простоты назову свой скрипт MyScript. Потому что он мой.
Как вы могли заметить, я уже закинул несколько спрайтов в проект. Их я купил как часть большого бандла со спрайтами на Humble Bundle и взял просто для примера. Особого внимания им не придавайте и используйте что есть.
Открываем файл
Делаем двойной клик по скрипту. В результате этого он должен открыться в дефолтном редакторе. Если вы установили Visual Studio, но Unity не использует её для редактирования скриптов, то проверьте настройки Unity. В пункте External Tools должен быть указан VS как редактор для скриптов.
Ждём запуска студии и видим скрипт:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
using System.Collections; using System.Collections.Generic; using UnityEngine; public class MyScript: MonoBehaviour { // Start is called before the first frame update void Start() { } // Update is called once per frame void Update() { } } |
При создании скрипта Unity генерирует основные зависимости и пару функций: Start и Update. Вместе с ними есть и комментарии, описывающие их суть: Start будет вызван при создании объекта, с самым первым кадром. И будет вызван только один раз. А Update будет вызываться с каждым обновлением кадра.
Родитель скрипта – MonoBehaviour, который является родителем всех компонентов и обязателен для корректной обработки скриптов как компонентов. Также он предоставляет множество полезных функций, о которых вы ещё узнаете.
Импорт сейчас можно почистить, так как из всех нам нужен будет только UnityEngine, а коллекции и дженерики – нет. Поэтому удаляем:
1 2 |
using System.Collections; using System.Collections.Generic; |
Чтобы проверить работоспособность функций я предлагаю вывести в консоль какой-то текст. Это можно сделать при помощи класса Debug и функции Log.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
using UnityEngine; public class MyScript : MonoBehaviour { // Start is called before the first frame update void Start() { Debug.Log("Start! Im Alive!"); } // Update is called once per frame void Update() { Debug.Log("Update!!!"); } } |
Запускаем и открываем окошко Console. Если не смогли найти его среди активных панелей, то можно открыть консоль из меню:
Ничего не отобразилось? Да, это логично. Как было сказано ранее, скрипты должны быть использованы как компоненты, а значит нам нужно повесить свой скрипт на какой-то объект. Пускай пока это будет камера. Чтобы это сделать просто перетяните скрипт на камеру. Как вариант, можно перетащить скрипт в инспектор камеры или добавить при помощи кнопки Add Component.
Запускаем ещё раз.
Если видим вывод:
Значит всё работает! Старт был один, а update продолжает набирать.
Улучшаем скрпит
Давайте сделаем скрипт, который будет центрировать объект, на котором он находится, между двумя другими? Звучит довольно интересно.
В этом нам поможет доступный в MonoBehaviour объект transform. Как вы могли заметить, любой добавленный объект на сцене имеет свой компонент transform. И в скрипте мы можем обратиться к нему для получения положения объекта (координаты, поворот и т.д.). При этом это может быть, как и transform родителя скрипта, так и других объектов.
Добавим две новые глобавльные переменные, которые будут хранить положение начальной и конечной точек, между которыми и нужнно расположить объект:
1 2 |
public Transform transformStartPoint; public Transform transformEndPoint; |
Как их проинициализировать? Если вы откроете Unity сейчас, то увидите, что наш скрипт-компонент получил пару новых полей:
И можно буквально перетянуть туда какие-то объекты сцены. Специально для этой задачи я добавил объекты Start и Finish на сцену. И, конечно же, объект, которым мы будем управлять. Пусть это будет Book.
А скрипт на книге теперь имеет такой вид:
Уже неплохо, но скрипт всё ещё не выполняет поставленной задачи. Зато у него теперь есть всё необходимое.
Удаляем строки для вывода в консоль и обновляем функцию Update. Теперь мы берем положение начальной и конечной точек, суммируем их и делим на два. Таким образом получаем центральную точку между ними. А после этого присваиваем эту точку нашему объекту, т.е. книге.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
using UnityEngine; public class MyScript : MonoBehaviour { public Transform transformStartPoint; public Transform transformEndPoint; void Start() {} void Update() { Vector2 midPosition = (transformStartPoint.position + transformEndPoint.position) * 0.5f; transform.position = midPosition; } } |
Для более наглядного отображения дистанции можно отрисовать линии, которые будут видны только в режиме отладки. Что-то вроде визуального Log, ведь рисовать их тоже нужно через Debug.
Добавим в Update ещё эти строки:
1 2 |
Debug.DrawLine(midPosition, transformStartPoint.position, Color.red); Debug.DrawLine(midPosition, transformEndPoint.position, Color.yellow); |
И весь сегодняшний код:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
using UnityEngine; public class MyScript : MonoBehaviour { public Transform transformStartPoint; public Transform transformEndPoint; void Start() {} void Update() { Vector2 midPosition = (transformStartPoint.position + transformEndPoint.position) * 0.5f; transform.position = midPosition; Debug.DrawLine(midPosition, transformStartPoint.position, Color.red); Debug.DrawLine(midPosition, transformEndPoint.position, Color.yellow); } } |
А на этом пока всё. Сегодня мы написали первый простенький скрипт на Unity. Надеюсь, что было понятно и интересно. Спасибо за внимание!
Пингбэк: Уроки по Unity – GeekStand
Пингбэк: Управление объектом с клавиатуры и Rigidbody 2D – GeekStand