Четыре Метода Быстрой Разработки С Unity3D

Больше гибкости, меньше кода — более продуктивная разработка.



Четыре метода быстрой разработки с Unity3D

Уже давно Юнити3D — мой любимый инструмент для разработки игр, которым я пользуюсь уже более 8 лет — как для профессиональных продуктов, так и для личных проектов, и при преподавании программирования и игрового дизайна .

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

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

Гейм-джем обычно длится от 24 до 72 часов, но бывают и более длительные – напр.

GitHub: игра отключена , который длится весь ноябрь.

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

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

  1. Защита от ошибок: чем меньше размер кода, тем меньше вероятность ошибки.

  2. Экономия времени: каждый раз, когда код меняется, необходимы обновления и тесты, а это требует времени.

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

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

Для справки: Unity 3D Technologies мне ничего не заплатила (пока).



1. Сериализация классов и структур

Сериализация — это процесс автоматического преобразования структур данных или состояний объектов в другой формат. В случае с Unity это упрощает хранение и реконструкцию данных.

Сорт И состав можно пометить как сериализуемый, указав [Сериализуемый] над именем.

Ниже приведен пример.

из документации Unity :

  
  
  
  
   

[Serializable] public struct PlayerStats { public int movementSpeed; public int hitPoints; public bool hasHealthPotion; }

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



Четыре метода быстрой разработки с Unity3D

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

То же самое можно сделать и для трансферы (их использование улучшает безопасность типов ) и более сложные конструкции - напр.

спрайты .

Оба случая показаны на изображении и в коде ниже:

Четыре метода быстрой разработки с Unity3D

Список характеристик игрока со спрайтами и перечислениями в инспекторе Unity

public enum PlayerType { ARCHER, KNIGHT } [Serializable] public struct PlayerStats { public int movementSpeed; public int hitPoints; public bool hasHealthPotion; public Sprite face; public PlayerType type; }

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



2. Используйте RequireComponent везде, где это возможно.

Сценарии с зависимостями компонентов являются общими.

Например, скрипт контроллера игрока, скорее всего, будет зависеть от Rigidbody и коллайдеров игрока.

Самый безопасный способ гарантировать, что игровой объект имеет все свои зависимости во время работы скрипта, — это пометить его.

Атрибут RequireComponent .

Этот атрибут имеет три основные функции:

  1. Убедитесь, что игровой объект имеет необходимые компоненты.

  2. Заблокируйте удаление необходимых компонентов.

  3. Автоматически добавлять необходимые компоненты к игровому объекту при прикреплении к нему скрипта.

Пример кода с использованием RequireComponent показан ниже:

[RequireComponent(typeof(Rigidbody))] public class PlayerScript : MonoBehaviour { Rigidbody rigidbody; void Awake() { rigidbody = GetComponent<Rigidbody>(); } }

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

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

С точки зрения прототипирования такой подход ускоряет подготовку объектов.

Более того, на занятия И структуры атрибутов может быть несколько ТребоватьКомпонент сразу.

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

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



Четыре метода быстрой разработки с Unity3D



3. Кнопки интерфейса для нескольких событий

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

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

Само по себе это неплохо, но в обоих случаях есть сильная зависимость от изменений в кодовой базе – которые обязательно произойдут. Лучше всего перечислить все эффекты кнопки непосредственно в списке событий OnClick: она может иметь столько событий, сколько вам нужно, и к ним легче получить доступ и изменить их.

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

Для этих конкретных задач не требуется никакого дополнительного кода: отобразить панель ( setActive(true) ), воспроизвести звук ( play() ) и вызвать аниматор ( setTrigger() ).

Примеры вызова этих методов приведены ниже.



Четыре метода быстрой разработки с Unity3D

Пример списка с событиями OnClick Довольно часто такой подход используется для программирования навигации по меню.

Каждое меню активирует следующее и деактивирует само себя.

При возврате или закрытии меню каждое из них снова деактивируется и активирует предыдущее.

Самое приятное то, что вам не нужно ни одной строчки кода.

Повторюсь: меньше кода — меньше ошибок, быстрее работа.



4. Широкое использование событий Unity.

В Unity есть специальный класс под названием UnityEvent , который ведет себя как метод По щелчку Кнопки интерфейса Unity .

Переменная UnityEvent , к которому имеет доступ скрипт, предоставляет тот же интерфейс, что и метод OnClick:

Четыре метода быстрой разработки с Unity3D

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

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

UnityEvent в скрипт и как написать простую функцию вызова Вызов :

using UnityEngine; using UnityEngine.Events; public class CallEventsScript : MonoBehaviour { public UnityEvent eventsToBeCalled; public void CallEvents() { eventsToBeCalled.Invoke(); } }

Метод CallEvents вызывает список событий для переменной UnityEvent .

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

В этих двух случаях нет необходимости писать код для доступа к методу — все делается простым перетаскиванием.



Четыре метода быстрой разработки с Unity3D

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

Это можно легко реализовать с помощью UnityEvent:

[RequireComponent(typeof(Collider))] public class TriggerBoxScript : MonoBehaviour { public UnityEvent eventsToBeCalledOnCollision; public List<string> objectsTagToActivate; private void OnCollisionEnter(Collision other) { if (OtherHasWantedTag(other.gameObject)) { InvokeEvents(); } } private void OnTriggerEnter(Collider other) { if (OtherHasWantedTag(other.gameObject)) { InvokeEvents(); } } private bool OtherHasWantedTag(GameObject other) { var found = objectsTagToActivate.Find(other.CompareTag); return found != null; } private void InvokeEvents() { eventsToBeCalledOnCollision.Invoke(); } }

Пример выше работает для триггеры , и для коллайдеры без триггера (метод также вызывается через Онтриггерэнтер и через OnCollisionEnter ).

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



Четыре метода быстрой разработки с Unity3D

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

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

Заключение

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

В случае событий ( По щелчку И UnityEvent ) разработчику не нужно беспокоиться о настройке зависимостей объектов (методы объектов можно вызывать непосредственно из списков) и проверке их валидности (в список можно связывать только действительные существующие объекты).

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

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

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

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

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

Спасибо за внимание.



Четыре метода быстрой разработки с Unity3D

Побережье, коричневый песок.

Альберт Одельфельт (1935) [USEUM]

О переводчике

Статью перевел Alconost. Алконост помолвлен локализация игры , приложения и сайты на 70 языках.

Нативные переводчики, лингвистическое тестирование, облачная платформа с API, непрерывная локализация, менеджеры проектов 24/7, любые форматы строковых ресурсов.

Мы также делаем рекламные и обучающие видеоролики — для сайтов продающих, имиджевых, рекламных, образовательных, тизеров, объяснителей, трейлеров для Google Play и App Store. Теги: #Разработка игр #программирование #unity #сериализация #разработка мобильных игр #unity3d #alconost

Вместе с данным постом часто просматривают:

Автор Статьи


Зарегистрирован: 2019-12-10 15:07:06
Баллов опыта: 0
Всего постов на сайте: 0
Всего комментарий на сайте: 0
Dima Manisha

Dima Manisha

Эксперт Wmlog. Профессиональный веб-мастер, SEO-специалист, дизайнер, маркетолог и интернет-предприниматель.