Как создать простую игру для Android с Unity

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



Требования:

  • Единство
  • Хороший текстовый редактор, например NotePad ++ (необязательно, но рекомендуется)
  • Android SDK
Если у вас его еще нет, вам следует начать с загрузки и установки Unity SDK, а также Android SDK. Нам нужен Android SDK, чтобы мы могли протестировать APK игры в среде Android.

Запустите Unity и создайте новый проект. Сделайте это 2D-проектом.



Есть несколько панелей, с которыми нужно ознакомиться - панель Иерархия, которая будет содержать все наши элементы сцены (сцена = любой «уровень», над которым вы в настоящее время работаете). Затем есть вкладка Game, которая используется для игры / тестирования вашей игры в редакторе, а справа у вас есть панель Inspector, где вы будете редактировать различные вещи, такие как освещение, физику и т. Д.



Первое, что мы хотим сделать, это создать спрайт - это будет наш главный герой (которым мы управляем). Вы можете нарисовать свой собственный спрайт, например, просто нарисовать квадрат с глазами, или взять спрайт из Интернета - просто убедитесь, что это файл .PNG (прозрачный фон).



Перетащите ваш спрайт в главное окно сцены (самое большое окно) - он также появится на панели Иерархии слева.

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

Так что просто создайте новый квадратный «спрайт» и перетащите его в окно сцены, как вы это делали со своим персонажем-спрайтом.



Теперь нам нужно проинструктировать Unity передать физику нашему главному герою - щелкните по своему главному персонажу-спрайту (он должен стать синим в окне Scene), затем на панели Inspector найдите «GameObjects».

Щелкните «Добавить компонент> Физика 2D> RigidBody2D». Это автоматически добавит физику к вашему спрайту, которую в противном случае вам пришлось бы писать самостоятельно в другом SDK.

Мы хотим, чтобы главный спрайт не выходил из-под контроля - поэтому найдите вкладку «Ограничения» на панели «Инспектор» (при этом основной спрайт все еще выделен в окне «Сцена») и установите флажок «Заморозить вращение по оси Z».

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

Мы также хотим исправить нашу ориентацию, чтобы персонаж не вращался и не раскачивался. Найдите «ограничения» в инспекторе с выбранным игроком и установите флажок, чтобы заморозить вращение Z. Теперь снова нажмите «Играть», и вы должны обнаружить, что теперь ваш игрок падает с неба на свою бесконечную гибель.

Чтобы наш главный спрайт-персонаж не падал бесконечно, нам нужно добавить коллайдер. По сути, это просто сплошной контур фигуры, который мы добавим к основному персонажу спрайта. Выделите свой главный спрайт-персонаж, нажмите «Добавить компонент> Физика 2D> BoxCollider2D».

Теперь проделайте то же самое с платформой, которую вы создали ранее. Ваш главный персонаж-спрайт теперь должен «столкнуться» с платформой и остаться там.

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

Это особенно важно, если вы создаете 3D-бегун , что-то вроде Наклон где вам нужно, чтобы камера постоянно оставалась позади основного игрового объекта (вашего основного персонажа-спрайта).

Теперь перейдите на панель Hierarchy и в списке GameObjects вы хотите перетащить камеру. под главный спрайт-персонаж (Player GameObject). Это сделает главный персонаж спрайта ‘ родитель камеры. Поэтому всякий раз, когда GameObject Player перемещается по экрану, камера должна следовать за ним.

Итак, для этого урока мы просто собираемся создать базовую игру типа бесконечный раннер, что-то вроде Бег 3 , где ваш главный герой будет бегать по экрану и уворачиваться от препятствий (или «игра окончена», если вы столкнетесь с препятствием ». Для этого потребуется несколько сценариев, большинство из которых будет предоставлено в этом руководстве.

Щелкните правой кнопкой мыши папку «Assets» и создайте новую папку - назовите ее Скрипты . Теперь щелкните правой кнопкой мыши эту новую папку и нажмите «Создать> C # Script» и назовите ее. PlayerControls . Этот скрипт будет определять поведение нашего главного персонажа-спрайта.

Если дважды щелкнуть этот новый скрипт, он должен открыть в Visual Studio - в качестве альтернативы (и по моим личным предпочтениям) вы можете отредактировать его в чем-то вроде NotePad ++.

В файле сценария уже должен быть фрагмент «шаблонного» кода внутри - в основном это сценарий, который нужно оставить в покое или просто настроить в соответствии с вашими потребностями, и он сэкономит нам много времени. Итак, мы собираемся добавить новый объект.

Над строкой void Start ():

общественный Rigidbody2D rb;

Следующий фрагмент кода, который нам нужно добавить, будет помещен в Start () и используется для поиска твердого тела - в основном, мы инструктируем Unity найти физику, которую мы прикрепили к GameObjects (наш главный спрайт-персонаж), и Start () будет выполняться при создании нового объекта или скрипта.

Итак, теперь найдите физический объект.

rb = GetComponent< Rigidbody2D > ();

И вы добавите эту строку внутри Update ()

rb.velocity = новый Vector2 (3, rb.velocity.y);

Функция Update () постоянно обновляется, поэтому любой добавленный в нее код будет работать непрерывно (если объект не будет уничтожен). Итак, что мы сделали, так это проинструктировали скрипт, что мы хотим, чтобы у твердого тела был новый вектор с той же скоростью по оси Y (rb.velocity.y), но со скоростью 3 по горизонтальной оси. В будущем вы также можете использовать ‘ FixedUpdate () ’ который похож, но отличается, потому что там вы можете контролировать количество обновлений / обновлений скрипта.

Сохраните скрипт и вернитесь в Unity, затем щелкните своего основного персонажа-спрайта, чтобы выделить его. На панели Inspector перейдите в Add Component> Scripts и добавьте скрипт, который мы только что сохранили. Теперь, когда вы нажимаете кнопку Play, главный персонаж-спрайт должен непрерывно двигаться к краю платформы.

Создание элементов управления вводом игрока

Поскольку это бесконечная игра в стиле раннера с препятствиями, нам нужно добавить элементы управления для игрока, такие как кнопка «прыжок».

Снова откройте скрипт из предыдущего, и мы собираемся добавить этот дополнительный код:

 если (Input.GetMouseButtonDown (0)) {rb.velocity = новый Vector2 (rb.velocity.x, 5); }

Вы собираетесь поместить это в метод Update (), и в основном он сообщает Unity, что, когда игрок нажимает кнопку мыши (что будет переведено как нажатие на экран на Android), главный спрайт-персонаж будет «прыгать» ' в воздухе. Это потому, что мы добавили скорость по оси Y со значением 5 (более высокое значение, конечно, означало бы более высокий прыжок).

Если вы не слишком знакомы с кодированием, мы использовали Если заявление, потому что Если по сути является инструкцией типа «делай или не делай» - буквально говоря ЕСЛИ это произойдет, выполните эту команду . Поэтому, если игрок не щелкает мышью (или не нажимает на экран Android), очевидно, что скрипт не запустится.

Продолжайте и нажмите кнопку «Играть» и убедитесь, что она работает правильно, прежде чем продолжить.

Затем мы добавим наши препятствия (которые могут «уничтожить» спрайт главного героя), счет игры и меню «Игра окончена».

Если вы до сих пор тестировали игру, то единственная проблема, которая у нас есть, заключается в том, что нажатие созданной нами кнопки «прыжок» приведет к прыжку персонажа независимо от того, заземлен он или нет - это в основном Flappy Birds, а не бегун вроде мы хотим. Но мы это исправим.

Добавьте в сценарий этот фрагмент кода выше метод Update ():

 общественный Преобразование GroundCheck; общественный Преобразовать startPosition; общественный   плавать GroundCheckRadius; общественный LayerMask whatIsGround; частный   bool на земле; А затем добавьте эту следующую строку в метод обновления над если инструкция: onGround = Physics2D.OverlapCircle (groundCheck.position, groundCheckRadius, whatIsGround); Затем вы измените эту следующую строку, включив «&& onGround» если (Input.GetMouseButtonDown (0) && onGround) {Итак, весь наш скрипт должен выглядеть примерно так: общественный   класс   PlayerControls : MonoBehaviour { общественный Rigidbody2D rb; общественный Преобразование GroundCheck; общественный Преобразовать startPosition; общественный   плавать GroundCheckRadius; общественный LayerMask whatIsGround; частный   bool на земле; пустота   Начало () {rb = GetComponent (); } пустота   Обновить () {rb.velocity = новый Vector2 (3, rb.velocity.y); onGround = Physics2D.OverlapCircle (groundCheck.position, groundCheckRadius, whatIsGround); если (Input.GetMouseButtonDown (0) && onGround) {rb.velocity = новый Vector2 (rb.velocity.x, 5); }}}

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

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

Теперь щелкните правой кнопкой мыши Иерархию и создайте новый пустой объект и перетащите его так, чтобы он находился под спрайтом главного персонажа в главном окне сцены - поместите этот пустой объект там, где мы хотим, чтобы пол был обнаружен. Переименуйте объект в «Проверить землю», а затем перетащите его под игровой объект игрока, как мы это делали ранее с камерой (чтобы создать отношения родитель-потомок между объектами). Теперь пустой объект будет следовать за спрайтом главного персонажа, как и камера, и постоянно проверять расстояние до пола.

Теперь выберите спрайт главного персонажа и перейдите в панель Inspector - перетащите объект Check Ground в область под названием «GroundCheck». Положение «преобразования» должно быть равно положению этого нового объекта, и там, где указано «Радиус», сделайте его 0,1.

Нам нужно определить слой земли. Просто выберите наземный ландшафт и в Инспекторе найдите кнопку «Слой: по умолчанию» (это раскрывающийся список) и выберите «Добавить слой».

Теперь выберите «земля» в качестве слоя для нашей платформы и повторите это для любых других платформ в окне игры. Там, где на объекте спрайта нашего главного персонажа написано «What is Ground», также выберите слой земли.

Что мы сделали, так это проинструктировали скрипт игрока выполнить проверку - если маленькая точка на экране перекрывает все, что соответствует слою, персонаж будет прыгать, только если это правда.

Игра окончена при столкновении и игровом меню

Итак, чтобы подвести итог, последнее, что мы хотим сделать: A: заставить столкновение с препятствиями приводить к окончанию игры, и B: создать экран меню «игра окончена» с помощью кнопки воспроизведения снова.

В основном вы хотите:

  1. Добавить Игрок объект и назначить жесткое тело и коллайдер по вашему выбору.
  2. Добавить Враг объект и назначить жесткое тело и коллайдер вашего выбора. (и необязательно добавить Тег «Враг» к нему)
  3. Создать новый C # скрипт и добавить его как компонент в Игрок (или используйте любой скрипт, прикрепленный к плееру, нет необходимости создавать новый, если он у вас уже есть)
  4. Добавьте это в свой сценарий:
пустота OnCollisionEnter ( Столкновение coll) { Отлаживать . Журнал («Столкновение»); // Проверяем, регистрирует ли он даже коллизию, если работает, вы можете удалить эту строку если (coll.gameobject. тег == 'Enemy') { // видит, есть ли у объекта, с которым столкнулся игрок, тег под названием 'Enemy