Статья удалена
Предыдущие части:
Рефакторим код и добавляем сбор предметов.
Рефакторим код и обновляем параметры
Так как изначально я писал всё это чисто для себя, я не слишком следил за именами переменных и прочим (к тому же, писал на C# второй раз в жизни).
После многочисленных... Комментария от неравнодушного Капитана (он, кстати, написал очень интересную статью Частицы по типу поверхности в Unity), я решил отрефакторить свой код, и, наконец, завести репу под это дело.
Код после рефакторинга доступен по ссылке.
Обновлены имена переменных и методов, в обоих файлах изменена логика работы с координатами.
PlayerBehaviour
В PlayerBehaviour ускорение игрока теперь задаётся через Vector2.
Значения для местоположения игрока берутся из playerVelocity.x и playerVelocity.y соответственно.
Для Player Velocity проставлены значения по-молчанию. Вы можете использовать их, либо подставить свои.
CameraBehaviour
В CameraBehaviour ограничение движения камеры теперь тоже задаётся через Vector2 - нужно выбрать координаты левого нижнего и правого верхнего углов.
Значения по-умолчанию, так-же, заданы. Но так как они у вас и у меня будут различаться, не забудьте проставить свои значения.
Кстати. Вопрос о том, есть ли какие то другие решения для ограничения движения камеры остаётся открытым. Наверняка как-то можно задать програмно, или при помощи какого-то инструмента.
Добавляем и анимируем собираемые монетки
Находим необходимый спрайт по пути Assets/BayatGames/Free Platform Game Assets/Coin Animation/png/2x/image 1.png и добавляем его в сцену.
Сразу переименуем нужный объект в Coin.
Как оказалось, монетка сильно больше персонажа. Исправим это.
Ткнём на наш спрайт (именно спрайт, а не игровой объект Coin), и при помощи шифта выделяем все спрайты с монетами в папке.
Ставим значение Pixels Per Unit на 256 и жмякаем apply.
Превосходно.
Создадим в Assets/Animations новую анимацию c именем coinRoll, и привяжем её к объекту Coin, перетянув на Coin в иерархии.
В опциях coinRoll проставим галочку на Loop Time, чтобы анимация не заканчивалась.
Откроём вкладку Animation, в иерархии выберем объект Coin.
При помощи временной шкалы подберём подхоядщую нам скорость.
Проверяем.
Монета вращается, но хочу попробовать добавить ей движение по вертикали вверх - вниз для большей динамики.
Добавим вертикальное "плавание" монеты
Если вы хотите полностью понять код движения монеты, то изучите ссылки ниже =)
Создадим скрипт CoinBehaviour, и привяжем его к нашей монете.
В скрипте добавим специальный слайдер для выбора дистанции, которую будет проходить монета при движении.
В Unity это будет выглядеть так:
В хуке Start получим текущее значение вертикального расположения монеты, и инициализируем этим значением переменную initialCoinVerticalPosition.
Отлично. Изначальное положение монеты у нас есть. Осталось добавить само движение.
Для этого добавляем метод CalculateCoinVerticalPosition, который мы вызываем в хуке Update.
Проверим, как всё работает.
При изменении значения, монета проделывает больший, или меньший путь. Успех =)
Монета должна исчезнуть, когда её соберёт игрок
Добавим объекту Player тэг, а затем применим его.
Теперь перейдем к объекту Coin.
Добавим Box Collider 2D (для расчета столкновений).
Отмечаем наш Box Collider, как триггер (Is Trigger), чтобы монета не сдвигалась и не оказывала физического воздействия на игрока при столкновении.
Настроим его чуть меньше по ширине - когда монета стоит ребром, она становится уже.
Кстати, я ведь могу изменить ширину коллайдера програмно, относительно ширины спрайта, в соответствии с текущей анимацией? Надо попробовать.
Теперь добавим проверку на столкновения в CoinBehaviour.
Теперь монета должна исчезать при столкновении с игроком.
Иии... Все работает.
Код текущей части доступен здесь.
Пока не уверен, что будет в следующий раз. Идея уже есть, но она пока в разработке =) Нужно подробнее изучить вопрос.