Top down shooter unity android

Мобильный(а может и нет) top-down shooter на Unity(Unity3D, uNet, top-down shooter, C#, 3D, мехи

Введение:
Приветствую всех игроделов и игроманов. В очередной раз прокручивая маркет я понял, что годнота выходит только по праздникам. Ну и решил я приступить к созданию своего проекта. Прежде чем начать делать хоть что-то я пробежался по литературе. Выбор пал на движок Unity3d (а вы что хотели). Для полного чайника в этом деле думаю подойдет. Подтянул свой шарп начал делать первые шаги, потом появился возможность поучаствовать Ludum Dare 41, это был веселый и познавательный опыт для меня, хотя толком я там ничего не сделал. Вот то, что мы там натворили https://royoyo.itch.io/angrymush . После LD41 забросил юнити на продолжительный срок.
Как я вижу игру:
Это онлайн top-down shooter, для мобильных устройств. Бегаешь и захватываешь точки попутно вырезая вражеских игроков, почти как в Team Fortress 2 или Overwatch. Можно напихать различных режимов и т.д. Игрок управляет мехой(почему мехой, наверно потому что я анимешник), которую можно обмазать вооружением на вкус и цвет. Управление достаточно простое это виртуальный стик для передвижения и тачи по экрану для стрельбы (достаточно спорное решение и требует доработки). Не хотелось бы добавлять уже забитую систему повреждений игрока через хит поинты, хотелось бы систему похожую на war thunder, т.е что бы уничтожить вражескую меху нужно нанести критические повреждения ее модулям, например сломать генератор энергии или еще что-то в этом роде (как это реализовать понятия не имею, даже не думал). Возможно добавить какую-нибудь связь между пилотом и мехой, т.е меха может быть еще боеспособной, а пилот погиб, ну это меня уже понесло. Пока такие вот видения «Игры мечты».
Как она выглядит сейчас:
Смотреть особо не на что. Запилил кое-какую механику (передвижение, стрельба, перезарядка), есть небольшие баги, но это поправлю. Модельку мехи взял с маркета юнити и мой знакомый с LD41 (не перестаю его боготворить) засунул туда анимацию. Начал делать игру через локальную сеть и быстро сломал свои зубки.
Скриншоты:

Мехи рулят 😉 правда не анимешные, а баттлтечные 😉
Демку рано выложил, это не демка.
Совет — глянь в ассетсторе mech consrructor , он дешёвый, 30$ что-ли. Там только модели, но модели в самый раз для прототипа конструктора.

itx
Спасибо за совет. Над нормальной демкой еще работать и работать и работать. Думаю может быть засунуть туда парочку балванчиков,что бы одному по карте не бегать?

Тю, даже на «3д модельера» никто не агрится 🙂

Источник

Создание шутера с LeoECS. Часть 1

Друзья, это первая статья по фреймворку LeoECS из предстоящей серии, которая позволит вам быстрее понять, как работать с LeoECS в Unity и решить некоторые виды проблем, возникающих на практике. Все советы, изложенные в них, не представляют собою какой-то свод правил, способы построения подходов, а скорее набор рекомендаций и best practices, которые помогут вам освоиться в работе с фреймворком. Перед чтением убедитесь, что вы понимаете принцип работы архитектурного паттерна Entity Component System (ECS), и ознакомьтесь с документацией LeoECS, так как в процессе изучения фреймворка мы создадим простую игру жанра Top-Down shooter, рассмотрим часто возникающие проблемы и способы решения, и отвлекаться на различные вопросы, связанные с концепцией ECS, не будем.
Следующая часть

LeoECS – это одна из самых быстрых, легковесных и простых реализаций паттерна Entity Component System на языке C# с опциональной интеграцией с Unity: визуальный дебаггер, эмиттеры событий физики и uGUI, конвертер сцены с GameObject’ами и MonoBehaviour’ами в сущности и компоненты в “мире” ECS. Фреймворк стабильно работает уже долгое время, на нем выпущен далеко не один коммерческий проект.

Читайте также:  Файловый менеджер не видит файлы андроид

Давайте перейдем к практике и начнем с самого главного класса в вашем проекте – EcsStartup. Создайте простой MonoBehaviour класс и прикрепите его к какому-нибудь объекту в сцене – лучше выделить под это отдельный пустой GameObject. Вы можете использовать опциональный интегратор с Unity, тогда EcsStartup и необходимые папки (Components, Systems, Services, UnityComponents) вы можете сгенерировать автоматически.

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

Как видите, мы столкнулись с проблемой. Нам нужно откуда-то взять данные, чтобы передать их в компоненты ECS. Как быть? Первое, что приходит в голову — найти игрока на сцене при помощи тега, названия или даже компонента MonoBehaviour, но давайте копнем глубже.

Эффективный способ разделения внешних данных

Давайте немного абстрагируемся от нашей проблемы и подумаем о том, как нам хранить внешние данные. Самый удобный способ управления – разделить их на три типа: Static Data, Scene Data и Runtime Data.

Static Data представляет собой конфигурацию игры – здесь вы можете сохранять ее настройки, которые не будут меняться в процессе выполнения программы. Это могут быть ссылки на префабы, которые должны быть инстанцированы в рантайме, размеры карты и прочие параметры. Проще всего реализовывать ее через ScriptableObject, ссылка на который хранится в классе EcsStartup.

Scene Data – это настройки конкретной сцены, которые могут отличаться друг от друга в разных сценах. В ней могут быть, например, спавн поинт игрока или других юнитов, название текущего уровня и другие настройки, индивидуальные для каждой сцены в проекте. По сути, это обычный MonoBehaviour класс, прикрепленный к Startup-объекту, а ссылка на него, аналогично со Static Data, хранится в классе EcsStartup.

Runtime Data – это обычный C# класс, куда нужно помещать ссылки на объекты, которые могут потребоваться в системах «здесь и сейчас», а также могут быть изменены в процессе игры. Например, это может быть карта клеток, ссылка на камеру, ссылка на сущность игрока и многое другое. Вы можете хранить эти данные в компонентах, но, тем не менее, если вы уверены, что какой-то единственный объект в своем роде, может понадобиться в различных частях проекта и представляет собою, даже что-то вроде сервиса, вам будет удобнее поместить его в этот вид данных.

Как же нам получить доступ ко всем этим данным в системах? Штатная реализация data injection в LeoECS позволяет нам в одну строку внедрить экземпляр класса в группу систем с помощью рефлексии. Чтобы обратиться к внедренному экземпляру, необходимо создать поле соответствующего типа в классе системы.

Вернемся к LeoECS

Давайте вернемся к PlayerInitSystem и попробуем вложить данные игрока в компоненты ECS.

Настало время реализовать систему передвижения игрока. Это можно реализовать множеством разных способов. К примеру, мы можем в одной системе ловить данные об инпуте, сохранять их в созданный компонент PlayerInputData, а в другой системе двигать персонажа на основе данных из этого компонента.

Для этого необходимо добавить поле в компонент PlayerInputData:

И создать Run-систему, которая каждый кадр будет обновлять значение этого компонента. Не забудьте добавить ее в группу систем в классе EcsStartup.

Читайте также:  Кодеки для мх плеера для андроида

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

Как опытные пользователи Unity, мы знаем, что при взаимодействии с физикой, нам лучше использовать цикл FixedUpdate с фиксированным тикрейтом, чтобы избежать каких-либо проблем с физическими взаимодействиями. Но у нас лишь одна группа систем и запускается она в цикле Update. Выход очевиден – необходимо создать новую группу систем, которая будет работать вызываться в FixedUpdate().

Кстати, не забудьте правильно настроить компонент Rigidbody у объекта и физический материал поверхности, по которой он будет двигаться.

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

Для инициализации, мы можем взять этот параметр из нашего ScriptableObject — StaticData. Для этого поместим в этот класс поле playerSpeed и зададим значение заранее в ассете:

В PlayerInitSystem мы возьмем значение из Static Data и положим его в компонент игрока:

Теперь давайте создадим новую группу систем, которая будет запускаться в FixedUpdate:

Так будет выглядеть система движения игрока:

Давайте теперь сделаем так, чтобы персонаж поворачивался сторону курсора. Задача весьма примитивна, мы можем реализовать эту механику в одной системе — PlayerRotationSystem. Мы могли бы получить доступ к Transform’у игрока через компонент Rigidbody, но давайте лучше прокинем его в компонент в init-системе игрока так же, как и прокинули сам Rigidbody.

Добавим строчку в PlayerInitSystem:

Отлично. Нам также понадобится ссылка на камеру, давайте сохраним ее в SceneData — нужно предварительно назначить ее руками в сцене.

Теперь давайте пополним наш список систем updateSystems новой системой, о которой говорили ранее:

Теперь наш персонаж ходит и поворачивается, но для полноты картины не хватает анимаций. В нашей игре для корректной работы анимаций (когда нужно учитывать и поворот игрока, и вектор движения) необходимо создать Blend Tree в компоненте Animator, чтобы можно было легко смешивать анимации на основе каких-то параметров. Для этого достаточно 5 анимаций: Idle, ходьба вперед, ходьба назад, ходьба влево, ходьба вправо. Вы можете найти как модель персонажа, так и анимации к нему в Unity Asset Store. Я оставлю ссылку на ассет, который использовал, в конце статьи.

В Blend Tree создайте структуру анимаций, как на картинке:

Теперь осталось лишь создать систему для заполнения параметров Horizontal и Vertical на основе вектора движения (или пользовательского ввода) и поворота игрока.

Сначала получим ссылку на Animator так же, как и на Transform и Rigidbody — просто создайте новое поле в компоненте Player типа Animator и добавьте в init-системе игрока строчку, которая заполнит его.

Теперь создадим систему, которая будет задавать параметры Аниматора:

Отлично! Теперь наш персонаж движется, поворачивается в сторону курсора мыши и правильно двигает ногами в зависимости от направления движения!

Заключение

Мы разобрали основные аспекты работы с фреймворком LeoECS и сделали базовое движение персонажа с анимациями. В следующих частях мы разберем более продвинутые механики и рассмотрим примеры совместной работы “мира” ECS и MonoBehaviour-ов.

Источник

Top Down Shooter Unity2D on Mobile — First Project

My plan is to make a top down shooter on mobile using Unity 2D. This is the first game that I am making after doing some online tutorials. I am giving myself 1 month to finish the project. As a little incentive to get it finished in time I will try and enter it in the game jam. https://itch.io/jam/gamedevtv-community-jam

Today I have spent my time getting Unity working with my mobile and getting a touch joystick working.

Читайте также:  Как добавлять фотки с андроида

I believe the important thing on a mobile is that it is playable in portrait and with only one finger as this is the most natural way to hold a mobile device. The problem arises in that you have to move and aim with the same controller.

The first joystick doesn’t have the feel that I would like for the game. If you move the joystick to the left and hold your finger the character will keep moving to the left. I would like character to stop moving when you stop moving your finger. I will have to investigate further.

This is the behaviour that I am looking for.

So I’ve got the controls how I like them and added some basic game functionality.

Basically you can play with one finger and you have a lot of control to dodge bullets. Shooting is hard as you have to get the direction right. I am thinking that it might be an interesting idea to shoot at a different angle depending on where you are standing. I might prototype that idea.

Well I thought that I was happy with the controls but as soon as I added a virtual camera things started going wrong. At first the player ran towards the end of the level. I soon realised that the answer was to subtract the position of the camera from the touch positions but then I had the problem that you had to kind of scroll upwards with your finger all the time.

I finally added a trigger to move slowly forward if your finger is above a certain distance thus avoiding the scrolling with your finger. I’m still not 100% happy but I’ll move on with other features and try to revisit this.

Looking cool and you’ve got this. Getting the camera to feel right is always a struggle that takes time to overcome.

I’m now fairly happy with the controls. I’ve refactored some of the code to make it easier to add enemies and I’ve added different coloured enemies with different abilities. I’ve also got more than one level working. My next steps are to make some power ups. I believe one will be the possibility to change to a forward only shooting gun.

I’ve now got a «switch» mechanic working where if you take the power up you switch between swivel gun and forward facing. I think it will make an interesting mechanic because the forward facing is easier to control but I could place some enemies to the side or behind to force you to switch to be able to kill them.

I’ve also decided to go for a cute type theme as it is a mobile game and should be accessible to all. These are the characters I’ve drawn on inkscape. The yellow one will be the player and the others will be the enemies.

Let me know what you think and I’d love for some more ideas.

Now I’ve got 3 levels working and I would like to let people try out the game to get feedback on the controls, difficulty etc. It’s available on iOS or Android for testing. If anyone is interested add please put your name down here.

Which type of split shots do you prefer? Number 1, 2 or 3?

This topic has been auto-archived and can no longer be posted in because there haven’t been any posts in a while.

Источник

Оцените статью