![](https://habrastorage.org/getpro/habr/upload_files/998/847/4fe/9988474febd2e28b63d5bc76c74ad0c5.jpeg)
Весь цикл статей
Исходники - https://github.com/SalamandrSpb/SurvivalHorror
Теперь приступим к настройке самих виджетов.
Перейдем в WBP_Inventory.
Удалим текст и добавим Canvas Panel:
![](https://habrastorage.org/getpro/habr/upload_files/23b/8ae/d5c/23b8aed5cc067d98f7553f039acb05f6.jpeg)
На Canvas добавим Border и переименуем его в Background:
![](https://habrastorage.org/getpro/habr/upload_files/b09/98f/37b/b0998f37bc1c5c62133ee20d272e8578.jpeg)
Зальем наш Background на всю площадь Canvas. Нужно нажать на "белый квадрат" ЛКМ+CTRL:
![](https://habrastorage.org/getpro/habr/upload_files/795/774/19c/79577419c575dac7de62c7439665f089.jpeg)
Изменим цвет Background на черный и сделаем почти прозрачным. Т.е. когда у нас будет открываться инвентарь, экран будет затемняться.
![](https://habrastorage.org/getpro/habr/upload_files/d96/4a8/d0e/d964a8d0e9e084773f4c6f88c5c2b43f.jpeg)
И добавим небольшое размытие:
![](https://habrastorage.org/getpro/habr/upload_files/dfa/baf/2c9/dfabaf2c9ff70c03d1abbb253b0ded30.jpeg)
Силу размытия можно менять в параметре Blur Strength:
![](https://habrastorage.org/getpro/habr/upload_files/422/6d1/ce1/4226d1ce17e0d763ca548cd1f3199471.jpeg)
Теперь добавим на Canvas нашу сетку инвентаря WBP_InventoryGrid и назовем InventoryGridWidget:
![](https://habrastorage.org/getpro/habr/upload_files/db3/91b/71c/db391b71ca234798ed22babc41bd5d08.jpeg)
Поменяем якорь на справа и в центре:
![](https://habrastorage.org/getpro/habr/upload_files/cbd/986/e42/cbd986e42b7250de6a12c30c12ab5f0a.jpeg)
Установим следующие параметры:
![](https://habrastorage.org/getpro/habr/upload_files/c92/bb9/a4d/c92bb9a4d146c37e2e74861b10145b7f.jpeg)
Size X и Y сейчас не важны, мы будем их потом менять из кода, регулируя размер инвентаря.
Size To Content нужно поставить true.
Теперь переходим в WBP_InventoryGrid. Добавляем Canvas и Border, который называем Grid:
![](https://habrastorage.org/getpro/habr/upload_files/a50/202/0ff/a502020ff194ab6519dbee3c29002e82.jpeg)
Grid ставим по центру:
![](https://habrastorage.org/getpro/habr/upload_files/d7e/93f/57b/d7e93f57b10200fdd6693f6a4599033b.jpeg)
И зададим ему пока такие параметры:
![](https://habrastorage.org/getpro/habr/upload_files/13e/9cd/07b/13e9cd07b816c9f887ae528f28261424.jpeg)
Padding изменим на 0:
![](https://habrastorage.org/getpro/habr/upload_files/f0b/3bd/285/f0b3bd2859ffe072dd75ef4f9f37f766.jpeg)
Цвет изменим на черный и сделаем чуть менее прозрачный, чем Background.
В SHInventoryGridWidget.h объявим функцию InitializeWidget, у которой будет два параметра. Указатель на компонент инвентаря и размер ячейки:
![](https://habrastorage.org/getpro/habr/upload_files/0c1/d7f/469/0c1d7f469d4c7199b875e8f1f5f2e667.jpeg)
Также создадим две приватные переменные:
![](https://habrastorage.org/getpro/habr/upload_files/edf/d69/0f8/edfd690f808047e1dc3e925b7e2f521a.jpeg)
И не забываем про такую строку, заголовочный файл мы подключим в cpp файле:
![](https://habrastorage.org/getpro/habr/upload_files/1fc/baa/2bc/1fcbaa2bcb2af5aff4e139a9131ace37.jpeg)
В теле функции присвоим переменным значения:
![](https://habrastorage.org/getpro/habr/upload_files/7a8/381/257/7a838125758818f9b34e74102a60bd3d.jpeg)
Теперь нам нужно получить доступ к Border(Grid), который мы создавали в виджете WBP_InventoryGrid.
Перейдем в SHInventoryGridWidget.h "забиндим" Grid из виджета на созданный указатель UBorder с именем Grid. Имена обязательно!!! должны совпадать:
![](https://habrastorage.org/getpro/habr/upload_files/d19/94f/82c/d1994f82ce96555abee946fc27248f5e.jpeg)
И опять не забываем:
![](https://habrastorage.org/getpro/habr/upload_files/860/426/88c/86042688cb5dfda7331dc6a263b6a7b1.jpeg)
Также переопределим виртуальную функцию Initialize у UserWidget:
![](https://habrastorage.org/getpro/habr/upload_files/01c/200/674/01c2006744e06ba5f083c184cf22bcdd.jpeg)
В cpp файле:
![](https://habrastorage.org/getpro/habr/upload_files/068/9a9/126/0689a9126a160c7006c859365588b0ba.jpeg)
В Функции InitializeWidget добавим несколько строк для изменения размера ячеек инвентаря.
Сначала посчитаем ширину и высоту ячейки. Из эти значений создадим новый Vector2D.
И уже потом этот вектор подставим в функцию SetSize.
![](https://habrastorage.org/getpro/habr/upload_files/2ac/be9/8b4/2acbe98b47dde4fdaec7ca74f832068e.jpeg)
Теперь перейдем в SHInventoryWidget.h и создадим публичную функцию InitializeInventoryWidget, которая будет принимать компонент инвентаря:
![](https://habrastorage.org/getpro/habr/upload_files/da4/c48/b12/da4c48b12d7a6fa06951b17d84510384.jpeg)
В секции protected опять "забиндим" компонент InventoryGridWidget из виджета:
![](https://habrastorage.org/getpro/habr/upload_files/7ad/80d/ad0/7ad80dad0166a0830cf17d44ece5d43c.jpeg)
И опять не забываем:
![](https://habrastorage.org/getpro/habr/upload_files/4b4/55c/f7b/4b455cf7bfb23ee752d7e67660f9cfd4.jpeg)
Переходим в SHInventoryWidget.срр и в теле функции у InventoryGridWidget вызываем функцию InitializeWidget:
![](https://habrastorage.org/getpro/habr/upload_files/188/7c6/64f/1887c664fbb58b0d81e54059073f0d73.jpeg)
Перейдем в SHPlayerHUD.cpp и в момент открытия инвентаря вызываем у InventoryWidget функцию InitializeInventoryWidget:
![](https://habrastorage.org/getpro/habr/upload_files/7f6/b5f/c9c/7f6b5fc9c8644e4d7fc7697845e36175.jpeg)
Теперь нам нужно сделать линии между ячейками инвентаря.
Перейдем в SHInventoryGridWidget.h и объявим функцию CreateLineSegments:
![](https://habrastorage.org/getpro/habr/upload_files/c03/fe8/c06/c03fe8c06649c17ae4d1c40ac40ee10d.jpeg)
Также создадим структуру FLine. В ней будет два поле типа Vector2D:
![](https://habrastorage.org/getpro/habr/upload_files/3b2/729/f84/3b2729f84e19c0f807f5b71d2439b325.jpeg)
В приватной секции создадим массив TArray с типом нашей структуры и назовем его Lines:
![](https://habrastorage.org/getpro/habr/upload_files/2e5/e7d/394/2e5e7d39459a6c68b1953611094dfc49.jpeg)
Перейдем в cpp файл в Функцию CreateLineSegments.
Здесь нужно создать два цикла в которых мы будем получать координы, по которым нужно рисовать вертикальные и горизонтальные линии.
Начнем с вертикальных.
Пока Index меньше или равен чем значение Column в компоненте инвентаря, цикл будет выполняться.
Находим две точки X и Y для отрисовки линии.
Потом создадим временную переменную Temp типа структуры FLine, куда поместим наши координаты.
И потом добавляем в массив Lines:
![](https://habrastorage.org/getpro/habr/upload_files/f6a/7a7/6b7/f6a7a76b763e29c2f58a10c2ee9362e4.jpeg)
Тоже самое проделываем и с горизонтальными линиями:
![](https://habrastorage.org/getpro/habr/upload_files/bd2/3f6/084/bd23f608459bb23d21005370a35c139f.jpeg)
Теперь перейдем в функцию InitializeWidget и после изменения размера ячеек вызовем функцию CreateLineSegments:
![](https://habrastorage.org/getpro/habr/upload_files/3cf/5fe/f85/3cf5fef854771d1a721b513eff103563.jpeg)
Вернемся в заголовочный файл и переопределим функцию NativePaint:
![](https://habrastorage.org/getpro/habr/upload_files/b91/bde/c38/b91bdec38b9b4152b457d80814e5a1ed.jpeg)
В теле функции сначала создадим переменную Context:
![](https://habrastorage.org/getpro/habr/upload_files/507/1c4/7bc/5071c47bcc578a49be7837c6a17e360f.jpeg)
После этого создадим еще один цикл и будем проходить по массиву Lines.
C помощью функции DrawLine у UWidgetBlueprintLibrary рисуем наши линии:
![](https://habrastorage.org/getpro/habr/upload_files/dd0/dcf/e42/dd0dcfe429d16b8321ba14eadf3ea960.jpeg)
Не забываем подключить заголовочный файл:
![](https://habrastorage.org/getpro/habr/upload_files/451/7d8/1ae/4517d81ae31c313653963de1cc801bff.jpeg)
Теперь перейдем в редактор и изменим размер инвентаря и ячеек в компоненте инвентаря, который мы создали у персонажа:
![](https://habrastorage.org/getpro/habr/upload_files/5bd/361/cab/5bd361cab00950443d5c2be70410fade.jpeg)
И если во время игры нажать Tab у нас появится инвентарь указанных размеров:
![](https://habrastorage.org/getpro/habr/upload_files/db9/437/8f0/db94378f072bb5a46b318a8da1673821.jpeg)
Тоже самое только в видео:
Подпишись:
Discord - discord.gg/CqZTXY4zwG
VK - vk.com/vlakugames
Youtube - vk.cc/cchfQD
Rutube - https://rutube.ru/channel/23334940/