Найти тему
VlaKu

[4] Создание Survival Horror в стиле RE2 на Unreal Engine и С++. Пространственный инвентарь(Часть 1)

Всем привет.

Вот мы и подошли к созданию инвентаря.

Мы будет создавать пространственный инвентарь на С++. В качестве примера я взял инвентарь с этого канала, который сделан на Blueprints.

Начнем с создания своего класса HUD, в котором будут создаваться наши виджеты.

Создаем новый C++ класс с именем SHPlayerHUD в новой папке UI. В качестве родительского класса выбираем HUD.

-2

В новой папке Inventory создаем С++ класс с именем SHInventoryWidget, который наследуем от UserWidget. В этом классе будем прописывать всю логику виджета инвентаря, а в дочернем блюпринт классе будем делать только визуальную часть.

-3

Создадим в папке Inventory класс инвентаря SHInventoryComponent, который наследуется от Actor Component

-4

Перейдем в SHCharacter.h и объявим указатель на компонент инвентаря

-5

Перейдем в SHCharacter.cpp и в конструкторе создадим данный компонент

-6

В SHInventoryComponent.h объявим две переменные Column и Row, которые будут отвечать за размер инвентаря

-7

И создадим для этих переменных Get функции в public секции, чтобы мы могли получить их значения в других классах

-8

Создадим еще одну переменную Size, которая будет отвечать за размер ячеек

-9

И также сделаем Get функцию

-10

Если сейчас перейдем в блюпринт персонажа, то увидим компонент инвентаря

-11

И созданные параметры для управления размерами ячеек и инвентаря

-12

Далее, создадим в папке Inventory еще один С++ класс SHInventoryGridWidget, который наследуем от UserWidget.

Он будет "отрисовывать" сетку инвентаря.

-13

И создадим в папке Blueprints->Inventory виджет WBP_InventoryGrid, наследуясь от SHInventoryGridWidget

-14

В этой же папке создаем виджет WBP_Inventory, который наследуем от SHInventoryWidget

-15

В папке Blueprints создаем Blueprint класс BP_SHPlayerHUD, который наследуем от класса SHPlayerHUD

-16

Переходим в BP_SHGameModeBase и в HUD class ставим наш BP_SHPlayerHUD

-17

Теперь перейдем в заголовочный файл SHPlayerHUD.h

В секции protected с помощью шаблонного класса TSubClassOf создадим две переменные с именем InventoryWidgetClass и InventoryGridWidgetClass, в блюпринте BP_SHPlayerHUD мы укажем нужные классы, которые хотим создать.

-18

Также в секции protected объявим функцию BeginPlay

-19

В публичной секции создадим функцию OpenCloseInventory для открытия и закрытия инвентаря, она будет принимать указатель на PlayerController и компонент инвентаря

-20

В приватной секции объявим указатели на виджет инвентаря и сетки инвентаря

-21

Не забываем про

-22

Перейдем в SHPlayerHUD.cpp и сразу подключим заголовочные файлы "Blueprint/UserWidget.h", "Inventory/SHInventoryWidget.h", "Inventory/SHInventoryGridWidget.h" и "Inventory/SHInventoryComponent.h"

-23

Определим функцию BeginPlay и в ней создадим виджет инвентаря c помощью функции CreateWidget, а также виджет для сетки инвентаря

В качестве первого параметра передаем указатель на мир, а второй параметр - это класс который мы хотим создать.

-24

Определим функцию OpenCloseInventory и пропишем логику включения и отключения инвентаря, а также сделаем чтобы когда был открыт инвентарь появлялся курсор мыши и мы не могли управлять камерой.

Сначала проверяем что указатель InventoryWidget не пустой.

Потом нам нужно узнать, отображается сейчас на экране инвентарь или нет. Для это вызываем у виджета функцию IsInViewport.

Если он возвращает true, нужно убрать инвентарь с помощью RemoveFromParent, а если false - отобразить на экране с помощью AddToViewport.

После это вызываем у PlayerController функцию SetInputMode в которую передаем структуру FInputModeDataBase в зависимости от того, открыт инвентарь или нет.

Также используем функцию SetShowMouseCursor для отображения и отключения курсора когда открыт и закрыт инвентарь.

-25

Перейдем в редактор и добавим новый action mapping с именем Inventory на клавишу Tab

-26

Также перейдем в BP_SHPlayerHUD и укажем наш виджет инвентаря и его сетки

-27

Перейдем в SHCharacter.h и в приватной секции объявим функцию OpenCloseInventory

-28

Определим ее в cpp файле

-29

В секции protected создаем указатель на наш ASHPlayerHUD

-30

И "говорим" компилятору, что заголовочный файл подключим в другом месте

-31

Перейдем в SHCharacter.cpp и подключим заголовочный файл ASHPlayerHUD

-32

Теперь нам нужно привязать mapping Inventory к функции OpenCloseInventory

-33

В теле функции OpenCloseInventory получаем указатель на PlayerController

-34

Теперь с помощью Cast и функции GetHUD у PlayerComtroller получаем указатель на SHPlayerHUD и после этого вызываем у него функцию OpenCloseInventory, куда передаем указатель на контроллер персонажа и компонент инвентаря

-35

Вернемся в редактор и в виджет инвентаря WBP_Inventory для теста добавим текст "Инвентарь"

-36

Теперь если запустить игру и нажать на клавишу Tab, появится надпись "Инвентарь"

-37

Если нажать Tab еще раз, надпись исчезнет

Подпишись:

Discord - discord.gg/CqZTXY4zwG

VK - vk.com/vlakugames

Youtube - vk.cc/cchfQD

Rutube - https://rutube.ru/channel/23334940/