Контроль над проектом на Unity: частные проблемы начинающих разработчиков и пути их решения

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

Рубрика Программирование, компьютеры и кибернетика
Вид статья
Язык русский
Дата добавления 12.08.2020
Размер файла 212,0 K

Отправить свою хорошую работу в базу знаний просто. Используйте форму, расположенную ниже

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

Размещено на http://www.allbest.ru/

Нижнетагильский технологический институт (филиал) Уральского федерального университета имени первого Президента России Б.Н. Ельцина

КОНТРОЛЬ НАД ПРОЕКТОМ НА UNITY: ЧАСТЫЕ ПРОБЛЕМЫ НАЧИНАЮЩИХ РАЗРАБОТЧИКОВ И ПУТИ ИХ РЕШЕНИЯ

Карелова Р.А., Коробейников П.С.

Нижний Тагил

Аннотация

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

Ключевые слова: unity, проблемы архитектуры, оптимизация, Singleton, разработка игры, скрипты, управление методами.

Annotation

компьютерный разработчик библиотека unity

UNITY PROJECT CONTROL: FREQUENT PROBLEMS OF BEGINNING DEVELOPERS AND WAYS OF THEIR SOLUTION

Karelova R.A., Korobejnikov P.S. Nizhny Tagil Technological Institute (branch) of the Ural Federal University named after the first President of Russia B.N. Yeltsin, Nizhny Tagil, Russia

A wide range of cross-platform development tools for computer games makes the Unity development environment one of the most popular today, especially for creating training simulators, interactive didactic materials, human-machine communication systems, etc. The paper highlights the most common problems of novice developers related to project control, in particular, with managing method calls implemented at the Unity library level and resource-intensive method calls. The authors propose ways of solving the problems mentioned above.

Keywords: unity, software architecture issues, optimization, Singleton, game development, scripts.

Введение

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

Следует отметить, что сегодня среда разработки Unity применяется не только для разработки игр, но и для создания обучающих симуляторов [1], [4], [5], интерактивных дидактических материалов [3], систем человеко-машинной коммуникации для лиц с ограниченными возможностями [2], а также для решения задач реконструкции фасадов зданий [6].

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

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

Первая проблема в указанном контексте, на которую следует обратить внимание, заключается в управлении вызовами методов, которые заложены на уровне библиотек Unity. MonoBehaviour является базовым классом, унаследовав который, дочерний класс получает возможность реализации внутренних событий Unity. Класс, который наследуется от MonoBehaviour, может реализовывать такие методы как Update, вызывающий каждый кадр, Start, вызывающийся при инициализации класса, и т.п. (см. Листинг 1).

Листинг 1 Реализация методов событий

using UnityEngine;

public class Test: MonoBehaviour

{

private void Start()

{

// Выполняется при инициализации скриптов

}

private void Update()

{

// Выполняется каждый кадр

}

}

Данные методы не имеют наследования или переопределения, они заложены на стороне библиотек, которые написаны на С++ и вызываются с помощью рефлексии. Вызов этих функций происходит в неизвестной разработчику иерархии. В Unity нет удобного средства управления последовательностью вызова этих событий. Многие начинающие разработчики пренебрегают решением этой проблемы и используют встроенные методы во всех своих скриптах. Это влечет за собой отсутствие контроля над кодом, что негативно скажется на управлении проектом при его увеличении, а также может вызвать непредвиденные ошибки [10].

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

Один из подходов заключается в разработке скрипта, сообщающего классам о вызове методов DontDestroyOnLoad (см. Листинг 2). Этот метод создает сцену (если таковой еще не существует), которая будет существовать на протяжении всей жизни приложения, пока на ней есть какие-либо объекты, и помещает на эту сцену объект, передаваемый в качестве параметра. После этого в созданном классе нужно создать массив из тех, кто заинтересован в прослушивании событий, и при срабатывании того или иного события, вызывать свой метод, который будет являться аналогом события Unity.

Листинг 2 Вызов метода DontDestroyOnLoad

using UnityEngine;

public class Ticker: MonoBehaviour

{

private List<IEnvetsListner> _eventListners = new List<IEnvetsListner>();

private void OnEnable()

{

DontDestroyOnLoad(this);

}

private void Update()

{

foreach(listner in _eventListners)

{

listener.Tick(); // Tick является собственным методом, аналог Update

}

}

private void AddEventListner(IEnvetsListner listner)

{

_eventListners.Add(listner);

}

}

Плюсом данного подхода является упорядоченность и прямой вызов методов непосредственно из класса, сообщающего о событиях, и отсутствие возможности подписаться на эти события извне. Минусом такого подхода является необходимость связывать выделенную сцену и игровую при их инициализации с помощью GameObject.Find. Данный метод выполняет поиск объектов на сцене, осуществляя проход по каждому из них и сравнивая их имена со строкой, передаваемой в качестве параметра (см. Листинг 3).

Листинг 3 Реализация поиска объекта на сцене

using UnityEngine;

public class Test: MonoBehaviour, IEnvetsListner

{

private Ticker _ticker;

private void Start()

{

var tickerObj = GameObject.Find(''Ticker'');

_ticker = tickerObj.GetComponent<Ticker>();

_ticker.AddEventListner(this);

}

}

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

Другим вариантом решения проблемы является инициализация класса с помощью DontDestroyOnLoad и вызов метода с помощью статического класса или паттерна Singleton, на который впоследствии подпишется головной скрипт сцены и будет самостоятельно сообщать другим классам на сцене, что произошло то или иное событие. Плюсом данного подхода является отсутствие прямой зависимости от объектов сцены и их количества. Это же является и его минусом (особенно если над проектом трудится большое количество разработчиков), так как любой скрипт в проекте может подписаться на данные события. Данную проблему можно решить с помощью интерфейса для класса, который будет осуществлять оповещение объектов на текущей сцене о событии Unity. Это позволит ограничить объекты, которые подписаны на данное событие, и отследить классы, которые ошибочно реализуют данный интерфейс.

Второй часто встречаемой проблемой при построении архитектуры игровой сцены является излишний вызов ресурсозатратных методов. Такими, например, являются методы, вызываемые для создания и уничтожения объектов на сцене в течение работы приложения. Метод Instantiate, который создаёт объект на сцене, так же как и метод Destroy, который удаляет объект со сцены, влекут за собой создание и удаление объектов на уровне кода C++, и такие манипуляции негативно сказываются на времени, затрачиваемом на их выполнение. Даже вызов 10 пустых объектов с небольшой вложенной иерархией занимает много вычислительных ресурсов, что особенно негативно сказывается на производительности, если проект будет запущен на смартфонах (см. Рисунок 1).

Рис. 1 Затраты на создание пустых объектов

Если на этапе инициализации приложения или сцены этим временем часто можно пренебречь, то во время игрового процесса данную проблему нужно решать заранее. Самый частый способ решения данной проблемы - это создание пула объектов (GameObjectPool) (см. Листинг 4) [8], [9]. Вместо удаления со сцены объект помещается в массив ожидания для повторного использования. Если объект необходимо показать снова, он извлекается из массива и снова включается.

Листинг 4 Реализация GameObjectPool

using UnityEngine;

public class GameObjectPool<T>: MonoBehaviour where T: MonoBehaviour

{

private Stack< T > _pool = new Stack< T >();

private void GetObjectFromPool()

{

var obj = _pool.Pop();

If (obj == null)

{

obj = Instantiate(obj);

}

obj.SetActive(true);

return obj;

}

private void ReleaseObject(T obj)

{

obj.SetActive(false);

_pool.Push(obj);

}

}

Данный способ имеет один недостаток. При первом обращении к объекту в любом случае вызывается метод Instantiate, так как данного объекта еще не существует. Во избежание данной проблемы объекты помещаются в GameObjectPool заранее, на этапе инициализации сцены. При реализации данного подхода чаще всего используют статичный класс с методами добавления и изъятия объектов из массива, который заново инициализируют при каждой смене сцены. Самой частой ошибкой при реализации данного подхода является создание единого контейнера для объектов, что вызывает необходимость смены родительского объекта в иерархии сцены. Данная операция зависит от количества дочерних элементов внутри объекта, у которого меняется родительский объект. И чем выше количество вложенных объектов, тем выше время данной операции. Особенно сильно это наносит ущерб производительности, если такая операция происходит внутри Canvas. Canvas - это объект для интерфейса в Unity, в котором отрисовка зависит не от координат, а от положения объекта в иерархии. Смена иерархии влечёт за собой полную перерисовку всего интерфейса, что пагубно отражается на производительности игры (см. рисунок 2).

Рис. 2 Затраты на смену родительского объекта

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

Третей проблемой, с которой чаще всего сталкиваются начинающие разработчики на Unity, - это злоупотребление паттерном Singleton [7]. Данный паттерн позволяет создать в проекте класс, который гарантирует, что он будет иметь единственный экземпляр во всём проекте (см. Листинг 5).

Листинг 5 Инициализация класса как Singleton

using UnityEngine;

public class Test: MonoBehaviour

{

public static Test Instance;

public int Score {get; private set;}

private void Start()

{

If (Instance == null)

{

Instance = this;

}

else

{

Destroy(gameObject);

}

}

}

После создания экземпляра появляется возможность получить доступ к данному классу из любой точки проекта (см. Листинг 6).

Листинг 6 Получение доступа к Singleton

using UnityEngine;

public class Test2: MonoBehaviour

{

private void SomeAction()

{

Test.Instance.Score++;

}

}

Данным подходом чаще всего злоупотребляют новички в программировании, которые начали своё обучение с Unity. Плюсом данного подхода является скорость реализации на ранних этапах создания проекта, а также простота его применения. Минусы же гораздо более весомые в долгосрочной перспективе. Чем больше разрастается проект, тем менее управляемым он становится, так как Singleton порождает большое количество связей в проекте, а также сводит к минимуму контроль над вызовом его методов, так как его методы может вызывать любой класс в проекте. Вместо использования Singleton лучше уделить больше времени на построение архитектуры приложения и применить паттерны проектирования, которые не связывают все объекты с одним классом. Паттерн Singleton может быть очень полезен для прототипирования приложения (так как цикл жизни прототипа очень низкий, а поддержка отсутствует), либо для централизации событий, о которых говорилось ранее.

Заключение

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

Список литературы

1. Бочкарев Н.А. Подходы к трансформации объектов виртуальных пространств в среде Unity / Н.А. Бочкарев, Р.С. Молотов // Вестник Ульяновского государственного технического университета. 2016. №3. С.38-41.

2. Зенг, В.А. Создание прототипа компьютерного бесконтактного компьютерного интерфейса в Unity 3D / В.А. Зенг // Известия Тульского государственного университета. Технические науки. 2019. Выпуск 12. С. 480-485.

3. Калиниченко А.В. Интерактивные электронные дидактические средства с когнитивной визуализацией / А.В. Калиниченко // Научно-технический вестник информационных технологий, механики и оптики.2017. Т. 17. № 2. С. 359-364. DOI: 10.17586/2226- 1494-2017-17-2-359-364

4. Матвеев П.О. Особенности моделирования светотехники и звуковых эффектов транспортных средств при разработке обучающих симуляторов в среде Unity / П.О. Матвеев, Р.С. Молотов // Вестник Ульяновского государственного технического университета. 2016. № 3. С. 48-52.

5. Сабанчиев А.М. Система визуализации с использованием виртуальной реальности в комплексе симуляции полета / А.М. Сабанчиев, Т.И. Кулиев // Электротехнические и информационные комплексы и системы. 2018. Т.14. № 4. С.80-86. DOI: 10.17122/1999-5458-2018-14-4-80-86

6. Тришин И.Г. Опыт создания программного обеспечения на базе игрового движка Unity 3D для решения задач реконструкции фасадов Георгиевского собора г. Юрьев-Польский (Владимирская область) [Электронный ресурс] / И.Г. Тришин // Историческая информатика. 2018. № 2. С. 68 - 74. URL: https://nbpublish.com/library_read_article.php?id=26602. DOI: 10.7256/2585-7797.2018.2.26602

7. Hipple R. Three ways to architect your game with ScriptableObjects [Электронный ресурс] / R. Hipple. URL: https://unity.com/how-to/architect-game-code-scriptable-objects (accessed: 12.02.2020)

8. Izzo S. Type-safe object pool for Unity [Электронный ресурс] / S. Izzo. URL: https://www.gamasutra.com/blogs/SamIzzo/20180611/319671/Typesafe_object_pool_for_Unity.php (accessed: 02.2020)

9. Placzek M. Object pooling in Unity [Электронный ресурс] / M. Placzek. URL: https://www.raywenderlich.com/847-object-pooling-in-unity (accessed: 12.02.2020)

10. Simonov V. 10000 Update() calls [Электронный ресурс] / V. Simonov. URL: https://blogs.unity3d.com/2015/12/23/1k-update-calls (accessed: 12.02.2020)

Размещено на Allbest.ru

...

Подобные документы

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

    дипломная работа [2,5 M], добавлен 11.02.2017

  • Платформа Unity 3D как средство разработки компьютерных деловых игр. Рассмотрение реализации взаимодействия между подсистемой проведения деловых игр и модулем визуализации. Формирование игровых уровней на примере компьютерной игры "Проезд перекрестка".

    дипломная работа [2,8 M], добавлен 22.08.2017

  • Особливості Unity у створенні віртуального робочого середовища. Моделювання у віртуальному середовищі навчальних проектів у вигляді лабораторних робіт з фізики, які спрямовані на покращення і спрощення навчального та практичного процесу навчання.

    курсовая работа [74,0 K], добавлен 30.08.2014

  • Знакомство с особенностями применения компьютерных технологий в практике решения задач управления проектом. Этапы создания проекта автоматизированной информационной системы "Аптека", анализ участников. Проблемы планирования производственной программы.

    курсовая работа [294,2 K], добавлен 21.03.2016

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

    курсовая работа [89,9 K], добавлен 24.12.2011

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

    лабораторная работа [310,6 K], добавлен 13.02.2009

  • Особенности решения задач нелинейного программирования различными методами для проведения анализа поведения этих методов на выбранных математических моделях нелинейного программирования. Общая характеристика классических и числовых методов решения.

    дипломная работа [2,4 M], добавлен 20.01.2013

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

    лабораторная работа [70,9 K], добавлен 15.03.2009

  • Web-дизайн, web-страница, основы строения сайта. Текстовые редакторы для разработки Web приложений. Стандартные средства разработки для Unix систем. Профессиональные среды разработки и их ответвления. Визуальные редакторы для разработчиков Web.

    курсовая работа [1,4 M], добавлен 12.08.2015

  • Обзор методов и подходов решения поставленной задачи аппроксимации логического вывода экспертной системы. Разработка и описание метода сетевого оператора для решения данной задачи. Разработка алгоритма решения. Проведение вычислительного эксперимента.

    дипломная работа [1,5 M], добавлен 23.02.2015

  • Математическое описание численных методов решения уравнения, построение графика функции. Cтруктурная схема алгоритма с использованием метода дихотомии. Использование численных методов решения дифференциальных уравнений, составление листинга программы.

    курсовая работа [984,2 K], добавлен 19.12.2009

  • Исследование методов решения задачи о ходе коня. Описание алгоритмов для итеративной и рекурсивной программ. Генерация перестановок элементов по индексам. Построение эйлерова цикла на графе. Поиск кратчайшего пути на графе. Программная реализация задачи.

    курсовая работа [411,6 K], добавлен 25.04.2013

  • Задача о кратчайшем пути как одна из важнейших классических задач теории графов. Общий обзор трех наиболее популярных алгоритмов для решения задачи о кратчайшем пути. Написание программы, которая реализует алгоритм Дейкстры и алгоритм Форда-Беллмана.

    курсовая работа [2,1 M], добавлен 23.06.2014

  • Суть основных идей и методов, особенностей и областей применения программирования для численных методов и решения нелинейных уравнений. Методы итераций, дихотомии и хорд и их использование. Алгоритм метода Ньютона, создание программы и ее тестирование.

    курсовая работа [423,0 K], добавлен 17.02.2010

  • Обзор и сравнительный анализ современных методов и инструментов для разработки Web-сайтов. Разработка модели сайта, его структуры с использованием современных программных средств разработки. Определение экономической эффективности от его внедрения.

    дипломная работа [1,4 M], добавлен 21.06.2013

  • Реализация информационной системы для компаний по продаже недвижимости. Обзор методов решения поставленной задачи. Описание программы для программиста. Диаграмма классов: FlatBase, Flat, House, Commercial, Human, ContH. Способы и алгоритмы решения задачи.

    курсовая работа [1,6 M], добавлен 18.08.2014

  • Итерационные методы решения нелинейных уравнений, системы линейных алгебраических уравнений (СЛАУ). Решение нелинейных уравнений методом интерполирования. Программная реализация итерационных методов решения СЛАУ. Практическое применение метода Эйлера.

    курсовая работа [1,6 M], добавлен 20.01.2010

  • Обзор методов решения в Excel. Рекурентные формулы метода Эйлера. Метод Рунге-Кутта четвертого порядка для решения уравнения первого порядка. Метод Эйлера с шагом h/2. Решение дифференциальных уравнений с помощью Mathcad. Модифицированный метод Эйлера.

    курсовая работа [580,1 K], добавлен 18.01.2011

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

    реферат [319,6 K], добавлен 26.06.2009

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

    дипломная работа [3,4 M], добавлен 12.08.2017

Работы в архивах красиво оформлены согласно требованиям ВУЗов и содержат рисунки, диаграммы, формулы и т.д.
PPT, PPTX и PDF-файлы представлены только в архивах.
Рекомендуем скачать работу.