Гейм-дизайн: как создаются игры — страница 11 из 29

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

Серия Grand Theft Auto – прекрасный пример того, как в основном сюжете или в самом мире делаются отсылки к разным играм или культурным объектам. В ней можно встретить множество отсылок к Back to the Future, более ранним игровым проектам Rockstar, к Apple, Голливуду, драме «Тельма и Луиза», снежному человеку, призракам, особняку Playboy, Хэллоуину, пришельцам и ко многому другому. Во множестве игр сделаны отсылки к ТАРДИС (англ. TARDIS, Time And Relative Dimension In Space) и другим объектам из сериала «Доктор Кто». ТАРДИС встречалась в различных играх, таких как Assassin’s Creed: Origins, когда игрок нырял на определенную глубину в определенном водоеме, оригинальной игре Fallout и Lego Dimensions. Последней примечательной серией игр, которая прославилась добавленными в нее пасхалками, стала Batman: Arkham, в которой делали отсылки к известным комиксам и вселенной Batman. Был один пример, когда разработчики спрятали для игроков яйцо, отсылавшее к очередному проекту Batman в серии, но его так и не нашли. Разработчикам пришлось раскрыть местонахождение тайной комнаты, в которой оно было спрятано. В этой серии вы также обнаружите отсылки к другим персонажам из вселенной DC в виде аудиофайлов, диалогов врагов или собираемых предметов. Добавляя такие отсылки в игру, вы можете проявить свою фантазию, но постарайтесь, чтобы для игрока их поиск был непростым и стимулировал к исследованию мира.

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

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

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

Заключение

В этой главе мы разобрали следующие темы:


1. Проектирование персонажа.

2. Управление персонажем.

3. Способы обзора окружающего мира.

4. Разработка сюжетных линий для игры.


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

Глава 4. Контроллер персонажа от первого лица на Unity

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

Настройка

Прежде чем приступить к созданию проекта, нам потребуется установить Unity. Скачайте Unity Hub с сайта Unity. Он будет выступать базой для всех обновлений, проектов и установок.

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

Завершив настройку, нажмите кнопку Install Editor и выберите желаемую версию Unity. Варианты показаны на рис. 4.1. Я советую использовать версию, рекомендованную Unity, так как она будет самой стабильной и актуальной.


Рис. 4.1. Unity Hub и версии ПО Unity


Я предпочитаю версию 2021.3.8f, но вам для этого урока лучше выбрать версию, рекомендованную Unity. Определившись с версией, выберите модули, которые будет поддерживать Unity. Я работаю на Mac и выбрал установку Visual Studio. Если у вас уже установлен Visual Studio, его может не быть в предложенных вариантах. Если же вы решите использовать другой редактор, снимите отметку с VS. Выберите из предложенного списка Mac Build Support или Windows Build Support, в зависимости от машины, на которой вы работаете. Теперь можно приступать к установке!

После установки ПО можно создавать новый проект. Нажмите синюю кнопку New Project. Слева выберите Core, затем выберите 3D и укажите название проекта, например FSP Test Build. Эти шаги показаны на рис. 4.2. Выполнив их, нажмите Create Project и ожидайте запуска Unity.


Рис. 4.2. Выбор шаблонов в Unity Hub


Шаг 1

Создайте пустой объект Empty Object, как показано на рис. 4.3, и назовите его First Person Player. Затем поместите этот объект в середину сцены.


Рис. 4.3. Unity Hierarchy и создание ассетов


Шаг 2

Под объектом First Person Player нажмите кнопку Add Component в окне Inspector. Далее выберите контроллер персонажа. Нажмите Gizmos в верхнем правом углу сцены, чтобы можно было видеть этот контроллер на сцене, как показано на рис. 4.4.


Рис. 4.4. Представление сцены с контроллером персонажа


Шаг 3

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

Radius (радиус) = 0.6

Height (высота) = 3.8

Шаг 4

Теперь добавим графический элемент, чтобы сделать персонажа реалистичнее. Щелкните правой кнопкой мыши объект First Person Player в окне Hierarchy и добавьте 3D Object – Cylinder, как показано на рис. 4.6. Будет создан объект, выступающий в качестве персонажа.


Рис. 4.5. First Person Player в Inspector


Рис. 4.6. Создание объекта Cylinder в Unity Hierarchy


Шаг 5

Затем установите Scale (Масштаб), как показано ниже, чтобы размер соответствовал объекту First Person Player. Кроме того, удалите Capsule Collider, так как чуть позже мы будем создавать собственные коллизии. Это можно сделать, нажав на шестеренку в верхнем правом углу компонента или щелчком правой кнопки мыши по компоненту Capsule Collider – Remove Component (рис. 4.7).


Scale: X = 1.2 Y = 1.8 Z = 1.2

Рис. 4.7. Cylinder в Inspector и удаление компонента Capsule Collider


Шаг 6

Следующий шаг – закрепление камеры на персонаже, чтобы игра воспринималась от первого лица. Перетащите основную камеру сцены на объект Player. Затем сбросьте настройки положения объекта – в Inspector выберите опцию Transform и нажмите Reset. Перетащите камеру в точку, где будет находиться голова персонажа, чтобы она располагалась на уровне его глаз (рис. 4.8).


Рис. 4.8. Перетаскивание камеры под объект First Person Player


Шаг 7

Теперь настроим скрипт, который позволит персонажу смотреть вокруг. Обзор будет работать по осям X и Y с блокировкой в определенных точках, чтобы голова персонажа поворачивалась на адекватную величину угла, а не на все 360 градусов. Это называется ограничение (clamping).

В разделе Inspector камеры нажмите Add Component и введите MouseLook. Так вы создадите новый скрипт C# с этим именем. После этого откройте редактор двойным щелчком по созданному скрипту. Затем добавьте в скрипт следующий код:

public class MouseLook: MonoBehaviour 

{ 

    public float mouseSensitivity = 100f; 

    public Transform playerBody; 

    float xRotation = 0f; 

    void Start() 

    {x 

       Cursor.lockState = CursorLockMode.Locked; 

    } 

    void Update () 

    { 

       float mouseX = Input.GetAxis(«Mouse X») * mouseSensitivity 

       * Time.deltaTime; 

       float mouseY = Input.GetAxis(«Mouse Y») * mouseSensitivity 

       * Time.deltaTime; 

       xRotation – = mouseY; 

       xRotation = Mathf.Clamp(xRotation, – 90f, 90f); 

       transform.localRotation = Quaternion.Euler(xRotation, 0f, 0f); 

       playerBody.Rotate(Vector3.up * mouseX); 

    } 

} 

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

mouseSensitivity
, позволяющее изменять чувствительность движений мыши. Во время
Start Event (void Start)
мы блокируем курсор, чтобы его не было видно в игре во время тестирования/игрового процесса. (Если во время игры вы захотите его вернуть, нажмите клавишу Escape.)
mouseX
и
mouseY
– входные значения из библиотеки Unity, которым уже присвоены кнопка или жест. Кроме того, они настроены так, чтобы при движении мыши вверх или вниз игрок смотрел в этих направлениях.
Mathf.Clamp(xRotation, – 90f, 90f
) блокирует величину угла, на которую персонаж может смотреть вверх/вниз. Ни один человек не способен вращать головой на 180 градусов, значит, и персонаж не должен иметь такой возможности.

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

Шаг 8

Теперь перейдите в объект Player и создайте новый скрипт PlayerMovement. Отличие этого скрипта в том, что для него нам не требуется void Start Event. Так что удалите его, чтобы остался только компонент void Update. После этого откройте скрипт в редакторе и добавьте следующий код:

public class PlayerMovement : MonoBehaviour

{

    public CharacterController controller;

    public float speed = 12f;

    public float gravity = -9.81f;

    Vector3 velocity;

    void Update()

    {

       float x = Input.GetAxis(«Horizontal»);

       float z = Input.GetAxis(«Vertical»);

       Vector3 move = transform.right * x + transform.forward * z;

       controller.Move(move * speed * Time.deltaTime);

       velocity.y += gravity * Time.deltaTime;

       controller.Move(velocity * Time.deltaTime;

    }

}

Рассмотрим некоторые детали и этого скрипта.

CharacterController
относится к компоненту, к которому мы прикрепили объект Player в самом начале, и отвечает за движения персонажа. Значения
public float
для скорости и гравитации установлены по умолчанию, и позже их можно при необходимости изменить. Поскольку статус этих переменных –
public
, их значения можно редактировать в Inspector, не открывая скрипт движения.

Значения

float X
и
float Z
описывают движение персонажа вперед и направление его взгляда. По аналогии с
Mouse X
и
Mouse Z
эти функции встроены в библиотеку Unity и привязаны к клавишам стрелок и WASD. Далее,
Vector3 move = transform.right * x + transform.forward * z
означает умножение функций друг на друга для создания движения. Представьте, что у персонажа работает только одна нога, но для движения нужны обе.

Если вы все сделали правильно, у вас получится рабочий скрипт передвижения. Тем не менее для тестирования этого скрипта нам потребуется поверхность, по которой персонаж сможет перемещаться. Посмотрите на рис. 4.9. Чтобы создать простой объект поверхности, щелкните правой кнопкой мыши окно Hierarchy, перейдите к 3D Object и выберите Plane. Назовите объект Environment. Вы создали 2D-поверхность, по которой персонаж сможет ходить. Обязательно выровняйте эту поверхность так, чтобы персонаж на ней стоял.


Рис. 4.9. Создание объекта Plane в меню Hierarchy


Шаг 9

Теперь создадим объект Ground Check, который позволит персонажу взаимодействовать с поверхностью в случае прыжка. Эта функция будет работать как точная проверка коллизии и обеспечивать взаимодействие персонажа с поверхностью под ним. Создать ее можно несколькими способами, но я приведу простой, который используется не только для 3D-игр в Unity, но и для разработки 2D-игр. Щелкните правой кнопкой мыши пункт Player в окне Hierarchy и создайте пустой объект Empty Game Object. Перетащите его в нижнюю часть объекта Player на сцене и переименуйте его в Ground Check в Inspector, как показано на рис. 4.10.


Рис. 4.10. Создание пустого объекта для Ground Check в меню Hierarchy


Шаг 10

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

public class PlayerMovement: MonoBehaviour

{

    public CharacterController controller;

    public float speed = 12f;

    public float gravity = -9.81f;

    public Transform groundCheck;

    public float groundDistance = 0.4;

    public LayerMask groundMask;

    Vector3 velocity;

    bool isGrounded;

    void Update()

    {

       isGrounded = Physics.CheckSphere(groundCheck.position,

       groundDistance, groundMask);

       if(isGrounded && velocity.y < 0)

       {

           velocity.y = -2fp;

       }

       float x = Input.GetAxis(“Horizontal”);

       float z = Input.GetAxis(“Vertical”);

      Vector3 move = transform.right * x + transform.forward * z;

       controller.Move(move * speed * Time.deltaTime);

       velocity.y += gravity * Time.deltaTime;

       controller.Move(velocity * Time.deltaTime;

    }

}

Чтобы завершить этот шаг, нажмите и перетащите объект Ground Check из Hierarchy в Inspector под Ground Check float (рис. 4.11).


Рис. 4.11. Свойства объекта First Person Player в Inspector и применение объекта Ground Check


Шаг 11

Теперь настроим слой для основания, с которым персонаж будет взаимодействовать при прыжке. Для создания нового слоя перейдите в раздел Layer справа и выберите Add Layer, как показано на рис. 4.12.


Рис. 4.12. Изменение типа слоя объекта First Person Player в окне Inspector


Создайте новый слой Ground в блоке Builtin Layer, как показано на рис. 4.13.


Рис. 4.13. Настройки слоя на вкладке Inspector для создания нового слоя Ground


Вернитесь к объекту Player, а затем из выпадающего списка для свойства Ground Mask в окне Inspector выберите созданный слой Ground, как показано на рис. 4.14.

Чтобы обеспечить возможность взаимодействия с окружением, нажмите на объект окружения, по которому ходит персонаж, и измените его слой на Ground, как показано на рис. 4.15.


Рис. 4.14. Свойства объекта First Person Player в окне Inspector и применение слоя Ground к скрипту PlayerMovement


Рис. 4.15. Свойства объекта Environment в окне Inspector и применение слоя Ground


Шаг 12

В конце урока добавьте персонажу способность прыгать. Для этого вернитесь в скрипт PlayerMovement и вставьте в него следующий код, выделенный жирным:

public class PlayerMovement: MonoBehaviour

{

    public CharacterController controller;

    public float speed = 12f;

    public float gravity = -9.81f;

    public float jumpHeight = 3f;

    public Transform groundCheck;

    public float groundDistance = 0.4;

    public LayerMask groundMask;

    Vector3 velocity;

    bool isGrounded;

    void Update()

    {

       isGrounded = Physics.CheckSphere(groundCheck.position,

       groundDistance, groundMask);

       if(isGrounded && velocity.y < 0)

       {

          velocity.y = -2fp;

       }

       float x = Input.GetAxis("Horizontal");

       float z = Input.GetAxis("Vertical");

       Vector3 move = transform.right * x + transform.forward * z;

       controller.Move(move * speed * Time.deltaTime);

       if(Input.GetButtonDown("Jump") && isGrounded)

       {

          velocity.y = Mathf.Sqrt(jumpHeight * -2f * gravity);

       }

       velocity.y += gravity * Time.deltaTime;

       controller.Move(velocity * Time.deltaTime;

    }

}

Теперь можно запускать игру! У вас должен быть полностью функциональный контроллер персонажа от первого лица, с которого можно начинать создавать новую игру в жанре FPS.

Бонусный уровень: распространенные термины Unity