# Архитектура движка

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

# Независимость от сцен

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

Все системы Naninovel либо не связаны непосредственно с MonoBehaviour, либо прикреплены к постоянному корневому GameObject.

В зависимости от среды используются следующие корневые объекты:

Naninovel<Runtime> для воспроизведения (сборки и режим воспроизведения редактора); – Naninovel<Editor> для редактора (вне режима воспроизведения).

Все необходимые игровые объекты создаются при инициализации движка, которая выполняется автоматически и асинхронно при запуске приложения (сразу после входа в режим воспроизведения или запуска сборки) с помощью метода RuntimeInitializeOnLoadMethod. Вы можете изменить это поведение, отключив свойство Initialize On Application Load в конфигурации движка и вручную вызвав инициализацию с помощью классов RuntimeInitializer (для среды выполнения) или EditorInitializer (для редактора).

Поскольку процесс инициализации является асинхронным, используйте либо подход async-await при вызове метода InitializeAsync(), либо используйте статическое событие Engine.OnInitialized.

Чтобы полностью отключить и удалить из памяти все системы движка, используйте статический метод Engine.Destroy().

# Ориентированность на сервисы

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

В случае, если вы хотите взаимодействовать с системой движка, вы, скорее всего, захотите использовать сервисы движка. Вы можете получить ссылку на сервис движка, используя статический метод Engine.GetService<TService>(), где TService - это тип (интерфейс) сервиса, на который вы хотите сослаться; например, чтобы получить сервис IScriptPlayer:

var player = Engine.GetService<IScriptPlayer>();
player.Stop();

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

# Высокоуровневая концепция

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

Обновлено: September 29, 2020