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

Моя цель - предложение широкого ассортимента товаров и услуг на постоянно высоком качестве обслуживания по самым выгодным ценам.
Весь цикл статей
  1. Базовая настройка и импорт ассетов

  2. Управление персонажем и камерой

  3. Анимация движения во все стороны

  4. Пространственный инвентарь(Часть 1)

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

Источник: https://habr.com/ru/post/676644/


Интересные статьи

Интересные статьи

Рано или поздно, каждый пэхапешник, пишущий на битриксе, начинает задумываться о том, как бы его улучшить, чтобы и всякие стандарты можно было соблюдать, и современные инструменты разработки использов...
Когда речь заходит о создании .NET библиотеки, части API которой являются платформозависимыми, приходится думать, как всё это оформить в NuGet пакет, да так, чтобы устано...
Субботний вечер омрачен скандалом - сайт не работает, провайдер негодяй, админы - не специалисты, а сервера - решето. Вызов принят, или почему при всей нелюбви к 1С-Битри...
Большинство тех, кто начинает изучать программирование, начали это из-за желания сделать свою игру. Нууу… я не исключение, но судьба меня занесла в веб разработку. Ч...
Основанная в 1998 году компания «Битрикс» заявила о себе в 2001 году, запустив первый в России интернет-магазин программного обеспечения Softkey.ru.