Весь цикл статей

Исходники - 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/

Комментарии (0)