Выброс предметов в Unity: Object Pool для 2D RPG

Реализация выброса предметов из инвентаря и использование паттерна Object Pool в 2D Pixel Art RPG на Unity. Object Pool повышает производительность, хотя и не является строго необходимым.

Измененные Компоненты

Для реализации функционала выброса и Object Pool были изменены следующие компоненты:

  • AgentsAndPresenter: Презентация сущности предмета в сцене (игровой объект).
  • ItemEjector: Компонент, отвечающий за физику выброса предмета (движение, траектория).
  • ItemPool: Объектный пул для предметов.
  • Inventory: Модифицированный инвентарь.
  • TerrainGenerator: Компонент генерации ландшафта (незначительные изменения).
  • BezierCurveMover: Новый компонент для движения по кривой Безье.

Изменения в Классе Inventory

В класс Inventory внесены следующие изменения:

  • Добавлена ссылка на компонент ItemEjector.
  • При выбросе предмета, Inventory делегирует задачу выброса ItemEjector. ItemEjector забирает предмет из пула, определяет позицию и направление выброса (по умолчанию — вправо от игрока).
<p><code>ItemEjector</code> получает объект из пула, определяет его позицию и направление выброса. Направление может быть изменено (влево, вправо или другое).</p>

Реализация ItemEjector и Object Pool

Компонент ItemEjector переписан с использованием паттерна Object Pool. Вместо создания и удаления игровых объектов, используется механизм активации/деактивации для оптимизации производительности, особенно при частом создании и удалении объектов.

<ul>
  <li><strong>Объектный пул:</strong> Используются два списка: доступных и используемых объектов.</li>
  <li><strong>Запрос объекта:</strong> При запросе, пул проверяет наличие доступных объектов. Если объекты есть, берется один из списка доступных; иначе создается новый.</li>
  <li><strong>Возврат объекта:</strong> После использования, объект возвращается в список доступных.</li>
  <li><strong>Стратегия инициализации:</strong> Пул содержит стратегию инициализации `Presenter` (фабрика), использующую полиморфизм и обеспечивающую правильную инициализацию компонентов.</li>
</ul>

Object Pool эффективен для сложных объектов (с множеством компонентов и сложной иерархией). Для множества мелких объектов его применение может быть менее выгодно.

<p><code>Instantiate</code> заменён на запрос объекта из пула. После получения объекта, <code>ItemEjector</code> определяет начальную позицию, вычисляет итоговую позицию с учетом направления и расстояния, и перемещает объект по кривой Безье с помощью компонента <code>BezierCurveMover</code>.</p>

BezierCurveMover

Компонент BezierCurveMover, инициализируемый через интерфейс, обеспечивает плавное перемещение объекта к точке приземления по кривой Безье. После завершения движения компонент удаляется с объекта.

Проблемы и Будущие Планы

Выявлены проблемы с сохранением объекта между сессиями редактора Unity. Требуется дополнительная проработка. Планируется улучшение системы определения точки приземления, переложив эту ответственность на Item для более точного расчета.

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

Что будем искать? Например,программа