Создание расширяемого лазера как в игре Steredenn

 

Один из видов оружия в Steredenn большой синий лазер. Это смертоносное оружие будет замедлять ваш корабль, но так же поможет выпустить гигантский луч энергии во врагов. Да, это круто.

Тем не менее, для создания такого лазера в игре необходим особый подход. Об этом мы и поговорим сегодня.

Итак, давайте начнём!

Для начала, я объясню, как работает большинство лазеров в Steredenn.

tumblr_inline_nceyghkudb1sg1att

Идея заключается в том, что бы написать мини урок по Unity, для повторного использования в другой игре.

К вашему сведению, Unity это название игрового движка, который мы используем для Steredenn. Если вы новичок в Unity, мы рекомендуем к ознакомлению этот урок. (Англ.) 🙂

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

Спрайты.

Первое, что нам нужно это 3 спрайта, что бы сделать лазер.

tumblr_inline_nceyheoieq1sg1att

  • Начальный спрайт, который должен быть помещён в конце оружия.
  • Средний спрайт, который вы можете удлинить и деформировать.
  • Конечный спрайт, что бы показать взаимодействие лазера на цели.

Примечание: средний спрайт должен иметь ширину 1 unit (По умолчанию в Unity это 100px. Посмотрите настройки импорта PixelsToUnit.). Таким образом, мы можем адаптировать его ширину до идеального размера.

Самый простой способ работать с этими спрайтами в Unity, это сделать 3 префаба, по одному для каждого спрайта.

Эти префабы на данный момент должны иметь только компонент SpriteRenderer.

tumblr_inline_nceyhnvnsq1sg1att

Настройка скрипта.

Следующий шаг, создать скрипт. Давайте назовём его LaserScript (так как мы хотим быть оригинальными).

Создайте пустой объект Laser и прикрепите к нему сценарий. Ничего фантастического.

Откройте сценапий в вашем любимом редакторе кода (я уверен, что это MonoDevelop).

Добавьте 3 публичных поля, что бы обработать 3 префаба которые мы создали в предыдущем шаге.

Затем заполните поля в вашем GameObject на сцене. Мы готовы к тому, что будет дальше.

tumblr_inline_nceyhwvgyz1sg1att

Создание начала и середины лазера.

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

Давайте создадим базу для лазера.

В функции Update создадим экземпляр префаба и прикрепим его к объекту лазера. Так же нам необходимо сохранить созданный объект.

Тоже самое мы сделаем для средней части, но конец лазера мы сделаем по другому. Конец создается только тогда, когда лазер касается чего либо.

Запуск и… вы должны быть очень разочарованы:

tumblr_inline_nceyi64baj1sg1att

Оба лазера размещены в координатах (0, 0) и накладываются друг на друга. Не волнуйтесь, эта проблема будет решена ниже.

Длина лазера.

Это интересная часть: как мы знаем длину лазера? — Если мы ничего не касаемся, длина «бесконечная». — В противном случае, это длина между объектом и источником лазера, минус начальный и конечный спрайт.

Raycayst будет нашим другом. Это звучит страшно, но на самом деле просто: физический движок посылает невидимый луч в нужном направлении и говорит вам, если лазер во что нибудь ударил.

Код:

Так, если hit.collider не null, мы коснулись чего-то! в противном случае это бесконечность.

Расстояние от попадания до лазера легко вычислить:

Теперь мы просто должны добавить спрайты.

Примечание: мы считаем, что опорная точка находится в центре спрайта (по умолчанию). Будет немного легче, если вы переместите её в источник лазера.

Вот полный код со всеми функциями.

Тестирование.

Как проверить столкновение с объектом?

Просто добавить новый спрайт с Collider2D, или, может быть с помощью куба (но с Collider2D).

tumblr_inline_nceyimlgg01sg1att

И… готово! Замечательно, не правда ли?

Я надеюсь, что вам понравился этот маленький урок. 🙂

Оригинал.