unity 2d камера следует за персонажем
Про создание платформера на Unity. Часть вторая, звездная
Я, как и обещал, продолжаю делиться с вами знаниями, приобретенными в процессе освоения 2D-режима Unity. От начинающего, так сказать, начинающим. Систематизирую, улучшаю и прогрессирую вместе с вами. Сегодня мы добавим к содержимому первой статьи управление камерой, сбор бонусов и первый способ умереть в игре. Если вам, как и мне, не терпится приступить, то добро пожаловать под кат.
И да, гифок там еще больше, чем в прошлый раз.
Чтобы камера во время игры не стояла статично, а плавно двигалась за персонажем, используем заранее подготовленный скрипт. Все по-прежнему просто: берем его и перетаскиваем, но уже на камеру.
Сам скрипт очень короткий и выглядит вот так:
Main camera, на которую повешен этот скрипт, следует за объектом, который указан у него (скрипта) в публичной переменной target. К слову — все публичные переменные в скриптах можно изменять прямо из редактора Unity. В нашем случае укажем на храброго носатого героя, запустим игру и проверим.
Теперь можно сделать префаб из платформы (помните как? если нет, смотрите первую статью) и раскидать их по сцене произвольным образом. В моем случае, выглядеть это все будет примерно так:
Прогуляемся по уровню. Прыжок, еще прыжок… Неудачное движение и герой падает в яму и не собирается возвращаться назад. Как нам с этим бороться? Да легко! Основная идея в том, что в пустоте под платформами будут расположены невидимые объекты, при пересечении которых можно будет загрузить уровень заново или вернуть персонажа назад с, допустим, минус одной жизнь. Для этого нам понадобятся пустой объект, которому добавим Box Collider (вытянутый по горизонтали) и поставим на нем в инспекторе галку Is trigger. Триггер в Unity отличается от простого коллайдера тем, что он не является препятствием, но при пересечении с объектом может вызвать какое-то событие. Объект переименуем в dieCollider и напишем немного кода для обработки падения. Вот вам гифка по случаю такого длинного абзаца:
Как можно быстрее найдем во вкладке Assets и, после двойного клика, впервые познакомимся с MonoDevelop в рамках этой серии уроков.
Для обработки пересечения с триггером используется функция OnTriggerEnter2D. Для простого коллайдера аналогично OnCollisionEnter2D.
Добавим следующий код:
Как видите, все логично. Если имя объекта, с которым мы столкнулись, совпадает со строкой «dieCollider», то перезагружаем уровень вполне очевидным методом — загружаем еще раз уровень, который уже загружен.
Теперь можно упасть в яму и…
Отлично, персонаж возвращается на стартовую позицию. Сделаем префаб из dieCollider’а, расставим его копии во всех опасных местах и осмотримся: чего-то явно не хватает. Конечно, бонусов, которые можно собирать! Принцип их создания абсолютно аналогичен созданию областей, которые возвращают нас назад. Мы будем снова использовать триггеры, только теперь будем сталкиваться не с невидимым объектом, а со вполне конкретной звездой. Работает это так:
Теперь вернемся в MonoDevelop и напишем немного кода. Объявим float переменную score (которую на первое время можно сделать публичной, чтобы следить за результатом в процессе создания игры) и добавим следующий код в функцию OnTriggerEnter2D
Он выполняет две простые функции — увеличивает результат на единицу и уничтожает объект, с которым мы столкнулись (в данном случае звезду). Так как из бонуса мы уже сделали префаб, раскидаем немного по уровню и посмотрим что будет, если их собирать. Обратите внимание на переменную score в правом нижнем углу экрана.
Теперь давайте научимся отображать результат на экране, ведь никто не хочет играть в игру прямо в редакторе и смотреть где-то сбоку количество собранных звезд. В этом нам поможет функция OnGUI(), которая прекрасно умеет отрисовывать на экране текстовые блоки, кнопки и прочие полезные вещи.
Проще некуда. Прямо на ДжиЮАе рисуется квадрат с координатой левого верхнего угла (0,0) и размерами 100×100. В нем выводится текст, прямо говорящий нам о количестве собранных звездочек.
Вот так. По итогам двух уроков мы научились создавать игровое окружение, добавили в игру бонусы, возможность умереть и начать заново. В следующий раз я покажу вам как сделать несколько уровней и заставить нашего персонажа бросаться чем-нибудь во что-нибудь. Но этого определенно мало. Поэтому добавим немного интерактивности в наше с вами обучение: голосуйте в прикрепленном опросе и я обязательно добавлю что-то на выбранную вами тему.
И да: напомню, что прямо сейчас проходит конкурс разработчиков игр, в котором можно принять участие и получить Xbox One или Lumia 930!
Управление камерой в 2D проектах Unity
В этой статье попробуем разобрать метод “свободного” перетаскивания 2D камеры на сцене с помощью мыши либо касаний, после прочтения которой вы узнаете как преобразовывать экранные координаты в координаты мира на сцене, как создавать проекции плоскостей и как управлять движением камеры. Примерный результат работы можно увидеть по анимации ниже.
Проекция
Камера
Все действия камеры будем обрабатывать в скрипте CameraControl.
В методе Start будем брать компонент камеры на объекте, а в методе Update обрабатывать действия мыши и перемещения. Для этого добавим еще пару методов: UpdateInput, где будем обрабатывать действия мыши либо касаний, и метод UpdatePosition, где будем совершать само перемещение камеры.
Для обработки действий мыши добавим еще несколько отдельных методов: OnPointDown который будет вызываться при нажатии мышкой либо касании экрана, OnPointMove метод, где будем обрабатывать перемещении мыши по экрану и метод OnPointUp который будет срабатывать при завершении перетаскивания мыши. Также каждый этот метод будет принимать параметры позиции мыши в виде Vector2.
Теперь необходимо в методе UpdateInput обработать события мыши.
Тут все достаточно просто – в зависимости от того какое действие сейчас выполняет мышь, нажатие, движение и тд, вызывается соответствующий метод обработки в который передается позиция мыши на экране. На заметку: действия кнопки мыши под индексом 0 также будут выполняться при обработки касаний.
Добавим несколько переменных для работы скрипта. Первая переменная moveSpeed будет отвечать за скорость перемещения камеры в точку, sensitivity будет отвечать за чувствительность к движениям мыши по экрану, а boolean переменная isDragging будет показывать, что камера перемещается с помощью перетаскивания мыши.
Еще добавим переменную камеры, в которую мы будем помещать сам компонент Camera в методе Start.
И так задача скрипта заключается в следующем: необходимо перемещать камеру в том направлении в котором мы двигаем мышкой либо касанием по экрану. Так как мы уже обрабатываем действия мыши в трех методах OnPointDown, OnPointMove и OnPointUp, необходимо экранные координаты перевести в координаты сцены, то есть мировые, для чего нам и понадобятся рейкасты и проекция Plane. Новый метод GetWorldPoint будет принимать экранные координаты мыши и переводить их в мировые.
Для начала инициируем новую переменную point и переменную ray в которую поместим рейкаст, вызвав метод ScreenPointToRay у компонента камеры. Для создания проекции необходимо указать ее место расположения на сцене – position, и направлении в которую она смотрит normal.
При работе в орфографическом режиме на камере направление чаще всего будет forward, то есть туда же куда смотрит камера. Проекция готова, теперь необходимо пустить в нее луч с помощью метода Raycast и получить мировые координаты точки.
Готово, теперь переходим к обработке действий мыши. В методе OnPointDown будем указывать точку отсчета координат движения мыши.
Во время нажатия левой кнопки мыши по экрану, получаем мировые координаты в в переменной tempCenter, это и станет точкой отсчета перемещения мыши. Теперь опишем действия при окончании перемещения мыши в методе OnPointUp.
Здесь мы просто задаем переменно isDragging значение false, и переходим в метод OnPointMove, где будем обрабатывать движения мыши по экрану.
Для начала проверим условие, что мы сейчас совершаем перетаскивание камеры мышкой используя переменную isDragging. Далее определим текущую мировую координаты позиции мышки с помощью метода GetWorldPoint.
Для того чтобы камера не двигалась при минимальном движении мышки, добавим новое условие, в котором укажем минимальное расстояние для совершения действия перемещения.
После чего можно определить направление в котором необходимо будет переместить камеру с помощью метода normalized.
Перемещать камеру будем в методе UpdatePosition используя текущую позицию камеры, направление движения и чувствительность.
В переменной speed укажем скорость перемещения используя дельту задержки Time.deltaTime и переменную moveSpeed. Дальше с помощью условия определяем текущую чувствительность мыши в переменной tempSens. После чего можно наконец задать новую точку куда следует переместить камеру.
Что такое Сinemachine в Unity?
Он может следить за персонажем, работать в катсценах, накладывать эффект дрожания камеры, делать движения камеры плавными, ограничивать ее движения в пространстве, делать «орбитальную» камеру для игры от 3-го лица, от первого лица и многое, многое другое.
Начинающим разработчикам такая штука точно понравится и уж точно пригодиться, поэтому я постараюсь рассказать так, что-бы было понятно.
Как сделать движение камеры за персонажем.
Начнем с самого часто необходимого, конечно, примеры я буду приводить с 2D игрой, так проще и понятнее.
Синемашина работает с «виртуальными» камерами, еще более виртуальными, чем камера в вашем проекте)
Первое, что необходимо сделать в новом проекте, в котором вы хотите пользоваться синемашиной, ее нужно добавиться в проект.
Теперь пакет установлен и им можно пользоваться.
Находим в меню новый пункт и выбираем 2D Camera.
Выбираем созданный объект и указываем камере за кем нужно следовать.
Теперь, если запустить игру с выбранной виртуальной камерой, то вы увидите оверлей с визуализацией текущих настроек.
В принципе, камера уже следит за игроком, но ее конечно же, можно настроить как вам угодно.
Как настроить Cinemachine для 2D игры
Если ваш персонаж управляется физикой, то если приглядеться камера дергается при движении. Происходит это потому, что слежка камеры в данный момент происходит в Update, то-есть каждый кадр, а физика просчитывается в FixedUpdate, то-есть через определенные промежутки времени, нужно это исправить.
Жмем на MainCamera, на ней автоматически должен был создаться скрипт CinemachineBrain. И меняем Update method и Blend update method на FixedUpdate.
Если дергается камера при движении
После этого камера будет адекватно себя вести.
Выбираем нашу ВИРТУАЛЬНУЮ камеру «CM vcam1«. Я хочу, что-бы камера обгоняла персонажа при движении и позволяла посмотреть немного вперед себя.
Для этого есть 3 пункта для настройки.
С этими настройками камера обгоняет игрока и дает посмотреть, что там впереди.
Далее идут настройки плавности отслеживания.
Плавность
Покрутив настройки можно добиться желаемой плавности перемещения камеры. Я оставлю как есть.
Смещение
Настройки смещения камеры. Позволяет сместить камеру относительно ее положения. А так-же настроить расстояние на котором она будет находиться. В 2D игре расстоянии не заметно, до тех пор пока объекты в зоне видимости камеры.
Мертвая зона
Далее идет так называемая «мертвая зона», зона в которой камера не будет реагировать на движения игрока.
Ограничения мягкой зоны
Это настройка «мягкой зоны». Когда вы настраиваете плавность движения камеры, она может уплыть далеко от цели, что-бы этого не происходило, необходимо настроить эти параметры. Если в момент настройки находиться в окне режиме проигрывания игры, то все изменения будут видны сразу. Для сохранения настроек после выхода из игрового режима нужно поставить галочку выше.
Сохранение настроек в режиме игры
Иногда нужно добавить динамики, тряску камеры, это тоже делается легко. Выбираем Noise, затем нужный профиль и настраиваем его как угодно.
Отлично, мы настроили камеру для игрового персонажа. И заметьте, ни единой строчки кода!
Создание эффекта плавной камеры, следующей за объектом — краткий туториал Статьи редакции
Поэтапное описание реализации эффекта с примером кода.
Пользователь Reddit под ником Awsomelity опубликовал короткий туториал для Unity, в котором показал, как сделать камеру, плавно следующую за объектом. Автор представил код, а также подробно показал все этапа реализации этого эффекта.
На сцене вам понадобится лишь несколько объектов: направленный свет, плоскость, предмет и камера. Сперва нужно создать скрипт.
Затем прикрепите скрипт к камере и откройте его. В этом окне удалите ненужную часть кода.
Затем вам нужно добавить переменную «object» — это объект, за которым следует камера, а также переменную «distanceFromObject» — дистанция камеры относительно объекта. Для этого добавьте следующий код:
Затем нужно добавить функцию «LateUpdate».
Пора добавлять новые переменные: «positionToGo» — переменная, которая указывает на какую позицию переместится камера, «smoothPosition» определяет, насколько плавным будет перемещаться камера. Показатель «t:0.125F» определяет скорость движения камеры — вы можете замедлить или ускорить её, меняя значение. Пример кода:
Затем перетащите камеру, чтобы установить её базовое положение относительно объекта. Когда вы сделаете это, перенесите значение в поле «Distance From Object», которое находится в окне Inspector.
На этом этапе эффект плавной камеры выглядит вот так:
Но это пока не финальная версия эффекта. Теперь нужно сделать так, чтобы камера поворачивалась за объектом. Для этого достаточно всего одной строчки кода:
Вот так выглядит финальная версия эффекта:
Даже по последней гифке видно, что камера нифига не плавно поворачивает.
Автору стоит почитать и понять то как работает lerp, в его варианте каждый вызов ф-ии LateUpdate будет перемещать камеру на 12.5% от требуемого смещения. И чем дальше и быстрее обьект будет удаляться от камеры тем более вырвиглазно это будет выглядеть.
К тому же, константное значение dt в лерпе делает его fps-независимым => на разных fps, результат будет выглядеть по разному.
Движение камеры вслед за персонажем в 2d платформере
Есть скрипт движения камеры вслед за объектом и скрипт движения самого объекта.
Помощь в написании контрольных, курсовых и дипломных работ здесь.
Движение камеры вслед за объектом
Ребята привет. Есть скрипт движения камеры с помощью мышки по X Y Z + вращение, прям как в.
Переход камеры за персонажем когда покидает зону видимости
Здравствуйте, подскажите как сделать переключения камеры за персонажем, у меня есть персонаж и 4.
Движение камеры
Есть сцена, есть пару кнопок и обьекты. Помогите написать код на движение вперед и назад! Вот.
Добавлено через 1 час 0 минут
Как мне подсказали, нужно было в самом спрайте вместо компонента UI использовать 2D Sprite
«transform.position = new Vector3(target.transform.position.x, target.transform.position.y, target.transform.position.z);»
Движение камеры
Добрый вечер! Подскажите как лучше сделать. Я делаю инициализацию разных объектов в позиции.
Движение до края камеры
Добрый день! Такая проблема как проверить прикосновение к левому и правому краю камеры. Если объект.
Движение камеры мышкой
Хочу сделать управление камерой как в шутерах, но что то не так. У меня камера при движени мышкой.
Плавное движение камеры
Мне нужно чтобы была сцена в которой я мог бы пальцем (мышкой) двигать камеру, при этом чтобы были.