Больше гибкости, меньше кода — более продуктивная разработка.
Уже давно Юнити3D — мой любимый инструмент для разработки игр, которым я пользуюсь уже более 8 лет — как для профессиональных продуктов, так и для личных проектов, и при преподавании программирования и игрового дизайна .
Более того, почти на каждом геймджеме, в котором я участвовал, я писал на Unity, что позволило создать ядро игры всего за несколько часов.
Как вы, наверное, знаете, игровой джем — соревнование по разработке игр, участники которого за короткий промежуток времени создают игру с нуля.
Гейм-джем обычно длится от 24 до 72 часов, но бывают и более длительные – напр.
GitHub: игра отключена , который длится весь ноябрь.
После участия в различных игровых джемах, в том числе с самодельным движком C++ моей группы ( к сожалению, это только на португальском языке ), я составил список правил быстрого прототипирования, который вскоре стал моим руководящим принципом при разработке программного обеспечения: меньше кода, быстрее работа.
Основная идея написания меньшего количества кода (или, другими словами, сохранения меньшей кодовой базы) решает две проблемы:
- Защита от ошибок: чем меньше размер кода, тем меньше вероятность ошибки.
- Экономия времени: каждый раз, когда код меняется, необходимы обновления и тесты, а это требует времени.
В этой статье я поделюсь несколькими приемами, которые упрощают реализацию этого принципа в Unity3D и тем самым ускоряют прототипирование и создание игр в целом.
Для справки: Unity 3D Technologies мне ничего не заплатила (пока).
1. Сериализация классов и структур
Сериализация — это процесс автоматического преобразования структур данных или состояний объектов в другой формат. В случае с Unity это упрощает хранение и реконструкцию данных.Сорт И состав можно пометить как сериализуемый, указав [Сериализуемый] над именем.
Ниже приведен пример.
Основное преимущество этого подхода заключается в том, что он обеспечивает прямой доступ к соответствующим свойствам через инспектор , что особенно удобно при использовании списки И массивы .[Serializable] public struct PlayerStats { public int movementSpeed; public int hitPoints; public bool hasHealthPotion; }
Список характеристик игрока в Unity Property Inspector Скорее всего, в вашем проекте будут повторяющиеся структуры: например, задания , предметы или даже диалоги - они могут быть реализованы как сериализованные занятия или структуры , что позволит вам легко изменить их список значений в инспектор .
То же самое можно сделать и для трансферы (их использование улучшает безопасность типов ) и более сложные конструкции - напр.
спрайты .
Оба случая показаны на изображении и в коде ниже:
Список характеристик игрока со спрайтами и перечислениями в инспекторе 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(typeof(Rigidbody))]
public class PlayerScript : MonoBehaviour
{
Rigidbody rigidbody;
void Awake()
{
rigidbody = GetComponent<Rigidbody>();
}
}
Данная функциональность существенно повышает безопасность кода и снижает вероятность непредвиденных исключения нулевого указателя при попытке доступа к недействительным или несуществующим компонентам.
Компоненты можно прикреплять непосредственно в окне редактора или получать с помощью методов Бодрствующий или Начинать , как показано в примере кода выше.
С точки зрения прототипирования такой подход ускоряет подготовку объектов.
Более того, на занятия И структуры атрибутов может быть несколько ТребоватьКомпонент сразу.
Достаточно указать их в скрипте, а затем просто добавить в игровой объект - и все компоненты будут прикреплены.
А поскольку эти компоненты никогда не будут недействительными при нормальных обстоятельствах, сценарию не нужно проверять значение null, а это означает, что нужно писать меньше кода.
3. Кнопки интерфейса для нескольких событий
Это, пожалуй, самый простой и эффективный из рассматриваемых приемов: используйте тот же Кнопка пользовательского интерфейса Unity для нескольких мероприятий одновременно.Многие люди, плохо знакомые с Unity, используют кнопки либо для выполнения одной задачи, либо, что еще хуже, для вызова определенного метода в скрипте, который обрабатывает логику кнопки.
Само по себе это неплохо, но в обоих случаях есть сильная зависимость от изменений в кодовой базе – которые обязательно произойдут. Лучше всего перечислить все эффекты кнопки непосредственно в списке событий OnClick: она может иметь столько событий, сколько вам нужно, и к ним легче получить доступ и изменить их.
При таком подходе вы можете, например, использовать onClick одной кнопки для отображения Панели единства , воспроизвести звук и запустить анимацию.
Для этих конкретных задач не требуется никакого дополнительного кода: отобразить панель ( setActive(true) ), воспроизвести звук ( play() ) и вызвать аниматор ( setTrigger() ).
Примеры вызова этих методов приведены ниже.
Пример списка с событиями OnClick Довольно часто такой подход используется для программирования навигации по меню.
Каждое меню активирует следующее и деактивирует само себя.
При возврате или закрытии меню каждое из них снова деактивируется и активирует предыдущее.
Самое приятное то, что вам не нужно ни одной строчки кода.
Повторюсь: меньше кода — меньше ошибок, быстрее работа.
4. Широкое использование событий Unity.
В Unity есть специальный класс под названием UnityEvent , который ведет себя как метод По щелчку Кнопки интерфейса Unity .
Переменная UnityEvent , к которому имеет доступ скрипт, предоставляет тот же интерфейс, что и метод OnClick:
Одна переменная UnityEvent с именем EventsToBeCalled. Такая переменная используется почти таким же образом, за исключением того, что она выполняет список событий этой переменной.
UnityEvent его необходимо вызвать через скрипт. В приведенном ниже фрагменте кода показано, как добавить переменную.
UnityEvent в скрипт и как написать простую функцию вызова Вызов : using UnityEngine;
using UnityEngine.Events;
public class CallEventsScript : MonoBehaviour
{
public UnityEvent eventsToBeCalled;
public void CallEvents()
{
eventsToBeCalled.Invoke();
}
}
Метод CallEvents вызывает список событий для переменной UnityEvent .
Это общедоступный метод, поэтому к нему могут получить доступ другие сценарии, в том числе сигналы шкалы времени И анимационные мероприятия .
В этих двух случаях нет необходимости писать код для доступа к методу — все делается простым перетаскиванием.
Временная шкала анимации с добавленным событием, вызывающим метод 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 ).
Однако его можно использовать только игровые объекты , у которых есть коллайдер.
Пример необходимых компонентов для триггерного блока Пример выше показывает игровой объект с триггерным полем используя этот подход. В этом примере всякий раз, когда игровой объект «Игрок» сталкивается с объект - триггерное поле , последний издаст звуковой сигнал и отключится.
Возможности этой структуры практически безграничны: активация врагов, смена фоновой музыки, точек появления, точек сохранения и т. д.
Заключение
Если коротко, то два основных результата использования описанных подходов — это сокращение объема кода и увеличение возможностей инспектора Unity. Большая гибкость означает больше возможностей для действий.В случае событий ( По щелчку И UnityEvent ) разработчику не нужно беспокоиться о настройке зависимостей объектов (методы объектов можно вызывать непосредственно из списков) и проверке их валидности (в список можно связывать только действительные существующие объекты).
Конечно, есть случаи, когда данные подходы лучше не использовать: они усложнят работу.
Например, если одну и ту же серию задач необходимо выполнить над разными элементами, имеет смысл передать ее определенному методу и вызвать его, а не перечислять все задачи для каждого элемента.
Это относится непосредственно к кнопки интерфейса Unity, для которого в таких ситуациях может быть удобно назначить определенные методы.
В любом случае гибкость описанных подходов, скорее всего, перевесит их недостатки — и, конечно, их легко игнорировать или устранить.
Более того, эти методы позволяют быстро создать прототип и протестировать идею, прежде чем переходить к написанию более стабильного и эффективного кода.
Спасибо за внимание.
Побережье, коричневый песок.
Альберт Одельфельт (1935) [USEUM]
О переводчике
Статью перевел Alconost. Алконост помолвлен локализация игры , приложения и сайты на 70 языках.Нативные переводчики, лингвистическое тестирование, облачная платформа с API, непрерывная локализация, менеджеры проектов 24/7, любые форматы строковых ресурсов.
Мы также делаем рекламные и обучающие видеоролики — для сайтов продающих, имиджевых, рекламных, образовательных, тизеров, объяснителей, трейлеров для Google Play и App Store. Теги: #Разработка игр #программирование #unity #сериализация #разработка мобильных игр #unity3d #alconost
-
Как Купить Linux Vps Сервер
19 Oct, 24 -
Apple Mobileme Для Windows!
19 Oct, 24 -
Машина Тьюринга По Формулам Excel
19 Oct, 24