Как сделать партиклы в unity 2d

Обновлено: 17.07.2024

Я пытался получить доступ к GetComponentsInChildren и пометить дочерние элементы PS разными тегами, прежде чем создавать из них массив. Как я уже говорил, я могу успешно остановить PS, пометив основной и используя GetComponent

для каждого объекта в массиве, прежде чем использовать функцию Stop() . Но по какой-то причине я не могу перезапустить его так же, с помощью функции Start() .

В этом последнем разделе кода я отключаю оба индикатора и PS. Поскольку часть освещения работает отлично, я бы хотел, чтобы вы смотрели только на ParticleSystem.

Это была моя последняя попытка, которая также не смогла повторно включить PS. Как вы можете догадаться из этого, PS имеет свою мать PS и 4 детей в нем.

Факелы появляются с активным PS. Первый вызванный таймер останавливает PS успешно. Второй таймер должен перезапустить его, создав цикл включения и выключения с указанными таймерами, но он этого не делает. Я пробовал много вещей, в том числе с включением выбросов, но, похоже, ничего не работает. Заранее спасибо!

2 ответа

Вы постоянно добавляете вызов . каждый кадр, поэтому спустя 20 секунд в течение следующих двадцати секунд вы, вероятно, получите вызванный метод, который противоречит тому, что вы хотели сделать.

Мне кажется, вы хотите выключить свет на 20 секунд, а затем включить их на 20 секунд все время, верно?

Я бы предложил использовать один метод, как

Таким образом, вы можете сделать это с помощью InvokeRepeating

Или вы также можете использовать Coroutine как

Или если вы хотите придерживаться метода Update , используйте таймер, например

В общем, старайтесь избегать повторных вызовов GetComponent и GetComponentsInChildren ! Скорее позвоните один раз, например в Awake и повторно использовать ссылки, такие как

🏓 Создаем 2D-игру на Unity: инструкция для новичка

Недавно мы рассказали о том, как научиться разработке игр на Unity . Продолжим тему на практике и покажем, как новичку создать на этой платформе первую 2D-игру.

Если вы хотите получить более систематическое образование в области разработки игр, мы рекомендуем рассмотреть факультет разработки игр онлайн-университета GeekBrains.

Двумерные игры сравнительно просты: для них не требуется сложных 3D-моделей, программный код по сравнению с 3D-проектами выглядит понятнее. Такие игры популярны как на десктопах, так и на мобильных устройствах. Unity также позволяет разрабатывать игры и для браузеров.

За последние годы вышло много популярных двумерных игр:

Программная реализация 2D-игр проще не только из-за отсутствия третьего измерения: на самой сцене меньше объектов, вместо трехмерных моделей плоские спрайты, вместо скелетной анимации – покадровая. А еще 2D-игры проще портировать на другие платформы – легче найти новую аудиторию.

Давайте создадим простую игру в жанре пинг-понг 🏓 . Перед тем как приступить к созданию игры, продумайте, какой именно результат хотите получить. На первых этапах рекомендуется использовать схематические шаблоны, чтобы быстрее получить работающий результат. В этой инструкции мы так и поступим. Графических ресурсов использовать не будем: и ракетки, и отбиваемый мяч будем пока отображать простыми белыми спрайтами.

Предварительно рассмотрим основные понятия Unity, без понимания которых будет проблематично создать игру:

Предполагаем, что вы уже установили редактор и создали аккаунт на портале Unity.

В первую очередь создадим новый проект и откроем его настройки (Edit → Project Settings). Во вкладке Editor установим параметр Default Behaviour Mode в значение 2D

Настройка проекта Детальная настройка проекта

Следующим шагом сохраним текущую активную сцену, назвав ее, например, Scene1. Теперь создадим основные игровые объекты: ракетку, мяч и менеджер игры, в котором будет храниться основная логика игры.

1. Создаем пустой объект, переименовываем в GameManager.

Создаем пустой объект

Создаем пустой объект

3. Создаем квадратный спрайт, называем его Pad (Assets → Create → Sprites → Square). Аналогично создаем круглый спрайт Ball (Assets → Create → Sprites → Circle). Масштабируем спрайт Pad со следующими параметрами – x:0.5, y:2.5, z:1.

Создаем спрайты

Создаем спрайты

4. Создаем префабы для Pad и Ball, после чего добавляем к ним компонент Box Collider 2D (включаем параметр Is Trigger) и компонент Rigidbody 2D (выставляем параметр Body Type в значение Kinematic).

Добавляем .компонент Box Collider 2D Настраиваем.компонент Box Collider 2D Добавляем компонент Rigidbody 2D Масштабируем спрайты

6. Заполняем скрипты следующим кодом.

GameManager.cs Ball.cs Pad.cs

6. Добавляем к префабу Ball и Pad теги с аналогичными именами. Выделив префабы, в инспекторе мы можем видеть выпадающий список тегов. Там же расположены и кнопки для добавления и редактирования тегов.

7. В настройках камеры выставляем параметр Projection в значение Orthographic, а параметр Clear Flag – в значение Solid Color.

Настройка камеры

Настройка камеры

8. Настраиваем кнопки, как показано на следующих скриншотах (Edit → Project Settings → Input Manager).

Настройка ввода, основное Настройка ввода, первый игрок Настройка ввода, второй игрок

Вот и всё, игра готова!

Пинг-понг, итоговый результат

Пинг-понг, итоговый результат

Билд для платформы Windows

1. Официальный туториал от Unity, где детально рассмотрен процесс создания roguelike RPG.

2. Youtube-канал Brackeys , где можно найти серию видеоуроков по созданию 2D-платформера.

3. Youtube-канал N3K EN содержит множество уроков как по отдельным компонентам Unity, так и полноценные серии уроков по созданию игр с нуля.

Если у вас мало опыта в разработке игр на Unity, мы рекомендуем обратить внимание на факультет разработки игр GeekBrains . Материал хорошо структурирован и содержит все необходимое для того, чтобы стать профессиональным Unity-разработчиком.

В числе прочего вы разработаете 2D-платформер с физическими загадками и динамическим освещением, научитесь портировать его на мобильные устройства. Кроме того, разработаете полноценную браузерную стратегию, а также игру в жанре двухмерных гонок.

По окончании обучения вы будете иметь портфолио из 4 игр, которое можно показать на собеседовании. Если же какая-то часть материала будет непонятна, вы всегда можете обратиться к персональному преподавателю.

Простая реализация многоступенчатого прыжка 2D-символа в Unity

Краткое введение

В платформерных 2D-играх очень распространены навыки двойного и тройного прыжков персонажа. Некоторые игры даже допускают большее количество прыжков. В этой статье реализована простая функция мульти-прыжков для 2D-персонажей в Unity, которую можно настроить вручную, чтобы разрешить количество прыжков.

Может быть в моемБиблиотека GithubилиБиблиотека облака кодаЗагрузите, основной код управления ролями Asset/Scene/Example/ExamplePlayerController.cs 。

Ниже показан эффект тройного прыжка в сцене Example в проекте:

Конфигурация проекта

2D-характер этого проекта принимаетUnity Asset StoreО материале. Если читатель хочет попрактиковаться в коде, как описано в этой статье, вы можете открыть тестовую сцену.В этой сцене, помимо кода, были настроены анимация персонажей, эффекты частиц и управление камерой.


Среди них Main Camera и CM vcam1 - это контент, связанный с камерой, Ground и Platforms - это карты, BlackBall - это 2D-персонаж, а его подобъект Texture - это спрайт 2D-персонажа, Particle System - эффект замыкающих частиц и Cloud. - это когда 2D-персонаж прыгает в воздухе. Объект облачного эффекта по умолчанию находится в неактивном состоянии, и реализация облачного эффекта будет рассмотрена позже в этой статье. Конечный автомат анимации BlackBall имеет 3 параметра SpeedH 、 SpeedV 、 IsGrounded , Соответственно укажите горизонтальную скорость, вертикальную скорость и возможность касания земли.

Я установил [Edit] - [Project Settings] - [Physics2D] - [Gravity] - [y] равным -49.05 вместо значения по умолчанию -9.81. Это сделано для улучшения динамизма прыжка 2D-персонажа по сравнению со значением по умолчанию, При этой настройке 2D-персонаж более подвижен при падении.

Реализация горизонтального движения

Прежде чем реализовывать прыжок, давайте реализуем базовое управление горизонтальным движением. Горизонтальное движение реализует, по крайней мере, следующие аспекты: получение ввода с клавиатуры, управление движением персонажа влево и вправо в соответствии с вводом и управление персонажем для поворота влево и вправо. согласно вводу.

Создайте PlayerController Скрипт добавлен в объект BlackBall, код следующий:

Установите соответствующий в окне инспектора moveSpeed Ценить. На этом этапе должно быть возможно управлять горизонтальным перемещением персонажа с помощью клавиш со стрелками влево и вправо.

Осуществление прыжка

Прежде всего, реализуйте одну из простейших функций прыжка: нажмите кнопку прыжка, и персонаж сможет прыгать.

Добавьте следующие поля:

в Update() Добавьте следующий код:

Создайте следующие методы для управления прыжками:

к FixedUpdate() Добавьте следующий код:

Установите соответствующий в окне инспектора jumpUpSpeed Ценить. На этом этапе вы можете прыгать с помощью клавиши пробела.

С помощью этих нескольких строк кода персонаж может совершить очень простой прыжок, но есть большая проблема - каждый раз, когда вы нажимаете клавишу перехода, персонаж может прыгать. Это не то, что мы хотим. Мы надеемся, что количество раз персонаж может прыгать ограничено., и это настраивается. Это ключевой момент многоступенчатого прыжка. Мы анализируем прыжки в следующих ситуациях:

Предположим, что персонажу разрешено совершить n последовательных прыжков.

Если n 0, персонажу разрешается совершить прыжок хотя бы один раз. Поскольку взлет с земли нужно подсчитывать один раз, допустимое количество прыжков в воздухе равно n-1, а общее количество прыжков в воздухе после того, как персонаж отрывается от земли, равно k.

  • Когда персонаж касается земли, в это время k = 0, персонаж может прыгать.
  • Когда персонаж в воздухе
    -Если k = n -1, персонаж не может продолжать прыгать.

Согласно приведенному выше анализу, для достижения настраиваемых многоступенчатых прыжков необходимо реализовать следующие части: обнаружение касания персонажа (то есть, чтобы определить, находится ли персонаж на земле), запись и управление количеством прыжков в воздухе. .

Обнаружение приземления

Реализация обнаружения касания в Unity очень проста. Основная идея состоит в том, чтобы определить расстояние между нижней частью персонажа и землей. Когда расстояние достаточно мало, мы думаем, что персонаж касается земли, в противном случае мы думаем, что персонаж находится в воздухе. В основном полагаться на Physics2D.OverlapCircle(Vector2 point, float radius, int layerMask) Метод реализуется при point против layer для layerMask Расстояние между объектами меньше radius Время означает point Достаточно близко к объекту конкретная реализация выглядит следующим образом:

Добавьте пустой подобъект GroundCheck для объекта BlackBall и поместите его внизу персонажа, как показано в форме ромба:


Добавьте слой "Земля" в окне инспектора и установите для слоя всей травы и платформы в сцене значение "Земля".

Добавьте следующие поля:

в FixedUpdate() Добавьте следующий код:

И изменим код переключения состояний анимации:

Устанавливается отдельно в окне Инспектора whatIsGround против groundCheck Для наземного слоя и объектов GroundCheck. На этом этапе, когда игра запущена, должна воспроизводиться соответствующая анимация, когда персонаж перемещается по земле горизонтально.

Многоступенчатая реализация

В предыдущем анализе мы пришли к выводу, что количество прыжков в воздухе необходимо регистрировать и управлять им, а количество разрешенных прыжков необходимо указывать извне, поэтому добавляются следующие поля:

в Start() инициализация airJumpCount 0

Когда персонаж падает на землю, необходимо сбросить счетчик прыжков в воздухе.

модифицировать Jump() Методы, указанные ниже:

Измените код переключения состояния анимации следующим образом:

Установить в окне инспектора allowJumpTimes , На данный момент настраиваемая многошаговая функция в основном завершена.

Сделай прыжок красивее

В игре с прыжками с платформы, такой как Super Mario, мы обнаружили, что падение персонажа часто происходит быстрее, чем прыжок. На картинке ниже показан скриншот прыжка Марио. Каждый прыжок занимает 18 кадров для прыжка вверх и 10 кадров для падения. Кадр, падение Быстрее.


В нашей реализации время прыжков вверх и вниз одинаковое.Очевидно, прыжки в стиле Марио обладают большей маневренностью и игровым процессом. Так как же сделать падение быстрее? —— Ускорение падения персонажа больше, чем ускорение, когда он поднимается.

Конкретная реализация выглядит следующим образом:

в FixedUpdate() Добавьте следующий код

Приведенный выше код делает ускорение персонажа при падении ускорением при подъеме. fallGravityMultiplier Когда значение больше 1, персонаж падает быстрее, чем когда он поднимается.

В начале статьи упоминается, что подобъект Cloud of BlackBall используется для демонстрации эффекта прыжков персонажа в воздухе. Это может добавить некоторой визуальной обратной связи к прыжкам персонажа в воздухе и улучшить игровой процесс.

У объекта Cloud есть анимация взрыва, которая воспроизводится всякий раз, когда персонаж прыгает в воздух.

Конкретная реализация выглядит следующим образом:

Добавьте следующие поля

в Start() Добавьте следующий код

Создайте новый метод сопрограммы

И в Jump() Добавьте код для запуска сопрограммы в части кода, прыгающей в воздухе

После добавления приведенного выше кода эффект анимации облачного объекта будет срабатывать, когда персонаж подпрыгивает в воздухе.


В этом посте мы рассмотрим как можно применить подход Двигателя на Тёмной Материи для создания бесконечного 2D фона.

Если вы сталкивались с мобильными играми в общественном транспорте, то наверняка могли заметить, что одними из самых популярных в поездке являются игры жанра Endless runner, например, Subway Surfers, а для любителей археологии примером может послужить Электроника ИМ23 “Автослалом”. Основным признаком данного жанра является бесконечно перемещающийся элемента(персонаж или другой объект), который обычно самостоятельно движется вперёд навстречу препятствиям, а управление даётся только для возможности эти препятствия избегать. Бесконечное перемещение подразумевает бесконечное пространство доступное для движения игрока, создание которых является не самой простой задачей, как могло бы показаться на первый взгляд. Этим постом мы открываем цикл, в котором рассмотрим элементы, которые помогут создать такие бесконечные, в каком-то смысле, миры.

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

Проблематика

Первым что приходит в голову, когда вас просят сделать корабль, который перемещается в пространстве, это добавить модель корабля, задать ему вектор скорости, привязать к нему камеру, подложить фон и начать сдвигать корабль вдоль вектора, помноженного на Time.deltaTime . Если откинуть очевидные вещи с ограниченными размерами фона, которые в любом случае придётся решать, главной проблемой бесконечного перемещения окажется координатное пространство Unity, которое привязано к переменным типа float и с увеличением координат точность будет падать. Для более точного описания проблемы вы можете посмотреть вот это видео "64 Bit In Kerbal Space Program".

Dark Matter Engine

Для решения данного вопроса можно использовать подход, с помощью которого работает Двигатель на Тёмной Материи из “Футурамы”. Если коротко описать принцип его действия, то двигатель двигает не корабль, а пространство вокруг корабля. То есть, в нашем случае вместо того чтобы двигать вдоль вектора скорости наш корабль мы будем двигать все объекты вокруг него в противоположном направлении. Таким образом, если наша камера привязана к кораблю, то мы всегда будем оставаться в точке начала координат и наша точность не будет падать из-за увеличения расстояния. Да и в целом для решения вопроса с бесконечным перемещением, выбрать началом координат наше положение выглядит более красивым решением, нежели привязываться к какой-либо другой точке в пространстве.

Задача

Сделать перемещение космического корабля вдоль бесконечного 2D фона. Корабль можно поворачивать вокруг оси Z при помощи клика по правой/левой стороне экрана. Камера всегда будет сонаправлена с вектором движения корабля.

Решение

Я не буду распространять ассеты, которые используются для примера. Найти подходящие вам ресурсы это тоже большая работа и я предлагаю вам в этом потренироваться, если не знаете с чего начать, то можно посетить бесплатный itch.io или поискать в интернете "Free game assets" .

Нам понадобится текстура для корабля и текстура для фона. Основное требование к фону будет его зацикленность как в вертикальном, так и в горизонтальном направлении.

  1. Добавьте в проект текстуры корабля и фона, для фона необходимо выставить Mesh type - Full rect и Wrap mode - Repeat
  2. Создайте структуру объектов такого содержания
  3. Добавьте текстуру для корабля
  4. Добавьте текстуру для фона, выставите Draw mode - Tiled и Order in Layer = -1
  5. Создайте скрипт UniverseHandler, добавьте его к объекту Universe

Результат

Как можно увидеть в результирующей гифке объект фона смещается в начальное положение по направлению, в котором достигается сдвиг на изначальный размер фона, за счёт чего достигается визуальная бесшовность его перемещения.

Альтернативные решения

Программирование - это такая область, в которой в целом нет абсолютно правильных решений, перед программистом при решении практически любой задачи открывается довольно большой выбор методов, при помощи которых будут выполняться поставленные условия. В данном случае также можно поступить несколькими способами. Например, можно вместо спрайта сделать объект типа quad и настроив материал, который также использует тайловую структуру управлять её смещением, что избавит нас от перемещения объекта совсем. Если же вернуться к более классическому варианту, то можно скомбинировать обычное перемещение объекта и сдвиг центра координат для всей сцены сразу, по достижению каких-либо пределов.

Заключение

Когда мы задумываемся о создании бесконечных пространств подход Двигателя на Тёмной Материи является основным средством обхода ограничений точности для Unity. Совмещённый с обычными передвижениями сдвиг центра координат тоже можно отнести в эту же группу. Приведённый же пример прекрасно подходит для создания фонов и эффекта параллакса. Однако, работа с более сложными объектами требует иных подходов и для создания реальных неограниченных пространств необходимо ввести множество других механик. Эти вопросы мы рассмотрим в следующих статьях цикла про бесконечные миры. Пока! =)

Читайте также: