Весь цикл статей
Исходники - 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/