Базовая настройка и импорт ассетов Управление персонажем и камерой Анимация движения во все стороны Пространственный инвентарь(Часть 1) Пространственный инвентарь(Часть 2)  Исходники - https://github.com/SalamandrSpb/SurvivalHorror   Всем привет. Вот мы и подошли к созданию инвентаря. Мы будет создавать пространственный инвентарь на С++. В качестве примера я взял инвентарь с этого канала, который сделан на Blueprints. Начнем с создания своего класса HUD, в котором будут создаваться наши виджеты. Создаем новый C++ класс с именем SHPlayerHUD в новой папке UI. В качестве родительского класса выбираем HUD. В новой папке Inventory создаем С++ класс с именем SHInventoryWidget, который наследуем от UserWidget. В этом классе будем прописывать всю логику виджета инвентаря, а в дочернем блюпринт классе будем делать только визуальную часть. Создадим в папке Inventory класс инвентаря SHInventoryComponent, который наследуется от Actor Component: Перейдем в SHCharacter.h и объявим указатель на компонент инвентаря: Перейдем в SHCharacter.cpp и в конструкторе создадим данный компонент: В SHInventoryComponent.h объявим две переменные Column и Row, которые будут отвечать за размер инвентаря: И создадим для этих переменных Get функции в public секции, чтобы мы могли получить их значения в других классах: Создадим еще одну переменную Size, которая будет отвечать за размер ячеек: И также сделаем Get функцию: Если сейчас перейдем в блюпринт персонажа, то увидим компонент инвентаря: И созданные параметры для управления размерами ячеек и инвентаря: Далее, создадим в папке Inventory еще один С++ класс SHInventoryGridWidget, который наследуем от UserWidget. Он будет "отрисовывать" сетку инвентаря. И создадим в папке Blueprints->Inventory виджет WBP_InventoryGrid, наследуясь от SHInventoryGridWidget: В этой же папке создаем виджет WBP_Inventory, который наследуем от SHInventoryWidget: В папке Blueprints создаем Blueprint класс BP_SHPlayerHUD, который наследуем от класса SHPlayerHUD: Переходим в BP_SHGameModeBase и в HUD class ставим наш BP_SHPlayerHUD: Теперь перейдем в заголовочный файл SHPlayerHUD.h. В секции protected с помощью шаблонного класса TSubClassOf создадим две переменные с именем InventoryWidgetClass и InventoryGridWidgetClass, в блюпринте BP_SHPlayerHUD мы укажем нужные классы, которые хотим создать. Также в секции protected объявим функцию BeginPlay: В публичной секции создадим функцию OpenCloseInventory для открытия и закрытия инвентаря, она будет принимать указатель на PlayerController и компонент инвентаря: В приватной секции объявим указатели на виджет инвентаря и сетки инвентаря: Не забываем про: Перейдем в SHPlayerHUD.cpp и сразу подключим заголовочные файлы "Blueprint/UserWidget.h", "Inventory/SHInventoryWidget.h", "Inventory/SHInventoryGridWidget.h" и "Inventory/SHInventoryComponent.h" Определим функцию BeginPlay и в ней создадим виджет инвентаря c помощью функции CreateWidget, а также виджет для сетки инвентаря. В качестве первого параметра передаем указатель на мир, а второй параметр - это класс который мы хотим создать. Определим функцию OpenCloseInventory и пропишем логику включения и отключения инвентаря, а также сделаем чтобы когда был открыт инвентарь появлялся курсор мыши и мы не могли управлять камерой. Сначала проверяем что указатель InventoryWidget не пустой. Потом нам нужно узнать, отображается сейчас на экране инвентарь или нет. Для это вызываем у виджета функцию IsInViewport. Если он возвращает true, нужно убрать инвентарь с помощью RemoveFromParent, а если false - отобразить на экране с помощью AddToViewport. После это вызываем у PlayerController функцию SetInputMode в которую передаем структуру FInputModeDataBase в зависимости от того, открыт инвентарь или нет. Также используем функцию SetShowMouseCursor для отображения и отключения курсора когда открыт и закрыт инвентарь. Перейдем в редактор и добавим новый action mapping с именем Inventory на клавишу Tab: Также перейдем в BP_SHPlayerHUD и укажем наш виджет инвентаря и его сетки: Перейдем в SHCharacter.h и в приватной секции объявим функцию OpenCloseInventory: Определим ее в cpp файле: В секции protected создаем указатель на наш ASHPlayerHUD: И "говорим" компилятору, что заголовочный файл подключим в другом месте: Перейдем в SHCharacter.cpp и подключим заголовочный файл ASHPlayerHUD: Теперь нам нужно привязать mapping Inventory к функции OpenCloseInventory: В теле функции OpenCloseInventory получаем указатель на PlayerController: Теперь с помощью Cast и функции GetHUD у PlayerComtroller получаем указатель на SHPlayerHUD и после этого вызываем у него функцию OpenCloseInventory, куда передаем указатель на контроллер персонажа и компонент инвентаря: Вернемся в редактор и в виджет инвентаря WBP_Inventory для теста добавим текст "Инвентарь": Теперь если запустить игру и нажать на клавишу Tab, появится надпись "Инвентарь": Если нажать Tab еще раз, надпись исчезнет: Тоже самое только в видео: Подпишись: Discord - discord.gg/CqZTXY4zwG VK - vk.com/vlakugames Youtube - vk.cc/cchfQD Rutube - https://rutube.ru/channel/23334940/