Реализация выброса предметов из инвентаря и использование паттерна 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, что улучшает игровой процесс и оптимизирует производительность игры. В дальнейшем планируется улучшение контроллера игрока и создание квестовой системы.