Всем Привет!Такая проблема.Как сделать,чтобы нода ,Remove All Widgets, удаляла не все виджеты.При снятии с паузы удаляется Hud и все Маркеры
Привет!
Нода Remove All Widgets удаляет абсолютно все виджеты в уровне, включая те, что находятся в Actor. То есть, даже если виджет привязан к какому-то Actor, он всё равно исчезнет.
Если тебе нужно удалить только определённый виджет, лучше использовать Remove From Parent. В этом случае в Target нужно передавать референс именно того виджета, который ты хочешь убрать с экрана.
Я задала Ваш вопрос в АИ Студия Гугл вот ответ : Привет! Да, Remove All Widgets удаляет абсолютно все виджеты, что часто нежелательно. Вот несколько способов обойти эту проблему и удалить только определенные виджеты при снятии с паузы:
Способ 1: Создание Переменной для HUD и Маркеров и Удаление По ID:
- Создание Переменной:
- В вашем Blueprint, где вы создаете HUD и маркеры, создайте две переменные типа Widget. Назовите их, например, HUDWidgetRef и MarkerWidgetRef. Тип переменной должен быть Widget.
- Сохранение Ссылки на Виджет:
- После создания HUD и маркеров, сразу же сохраните ссылку на созданный виджет в соответствующие переменные. Например, после Create Widget (HUD) → Set HUDWidgetRef, и после Create Widget (Marker) → Set MarkerWidgetRef.
- Удаление виджетов по ссылке:
-
При снятии с паузы (в Blueprint, который отвечает за паузу), используйте ноду IsValid для проверки, существуют ли виджеты HUD и маркеры.
-
Если они существуют, используйте ноду Remove From Parent для каждого виджета, используя сохраненные ссылки (HUDWidgetRef и MarkerWidgetRef).
# В Blueprint отвечающем за паузу:
# Событие снятия с паузы
Event UnpauseGame:
# Удаление HUD
Branch (IsValid HUDWidgetRef)
True:
HUDWidgetRef -> Remove From Parent
Set HUDWidgetRef to Null # Для предотвращения дальнейших ошибок
# Удаление Маркеров (если у вас несколько маркеров, нужно использовать цикл)
Branch (IsValid MarkerWidgetRef)
True:
MarkerWidgetRef -> Remove From Parent
Set MarkerWidgetRef to Null # Для предотвращения дальнейших ошибок
# Продолжение логики снятия с паузы
Use code with caution.Blueprint
Способ 2: Создание Иерархии Widget Blueprint:
-
Создайте “базовый” виджет (BaseWidget): В нем разместите общие элементы, которые не нужно удалять при снятии с паузы.
-
Создайте виджет HUD (HUDWidget), унаследованный от BaseWidget. В нем разместите элементы HUD, которые нужно удалять.
-
Создайте виджет Marker (MarkerWidget), унаследованный от BaseWidget.
-
В этом случае Remove All Widgets будет удалять только HUDWidget и MarkerWidget, но оставит элементы, находящиеся в BaseWidget.
Способ 3: Использование Custom Events и Dispatchers
- Создайте Event Dispatcher:
-
В виджете, который не должен удаляться создайте Event Dispatcher. Назовите его, например, OnWidgetCreated.
-
При создании HUD и Маркеров, в базовом BP bind к этому Dispatcher-у.
-
Когда хотите удалить виджеты (HUD, Marker), вызовите этот dispatcher.
-
В bind создайте ветвление на основе Enum EWidgetType которое будет передаваться.
# Enum для выбора типа виджета:
enum EWidgetType
EWIDGET_Hud
EWIDGET_Marker
# Dispatcher в BaseWidget:
Event Dispatcher OnWidgetCreated (widget: Widget, type: EWidgetType)
# в BP где создаются HUD и Marker:
Bind Event to OnWidgetCreated
(On Widget Created) -> Branch (Enum == EWIDGET_Hud) -> HUD -> Remove From Parent
(On Widget Created) -> Branch (Enum == EWIDGET_Marker) -> Marker -> Remove From Parent
# в BP где происходит снятие с паузы:
Call OnWidgetCreated (widget: Hud, type: EWIDGET_Hud)
Call OnWidgetCreated (widget: Marker, type: EWIDGET_Marker)
Use code with caution.Blueprint
Какой способ выбрать?
-
Способ 1 (Переменные): Прост в реализации для небольшого количества виджетов. Но становится громоздким, если у вас много разных виджетов, которые нужно контролировать.
-
Способ 2 (Иерархия): Хорошо подходит, если у вас есть четкое разделение на виджеты, которые нужно удалять, и виджеты, которые нужно сохранять. Может потребовать некоторой реструктуризации UI.
-
Способ 3 (Dispatcher): Более гибкий, но и более сложный в реализации. Подходит для более сложных проектов, где требуется динамическое управление виджетами.
Важно:
-
Убедитесь, что после удаления виджета, вы сбрасываете ссылку на него в переменной (Set HUDWidgetRef to Null), чтобы избежать ошибок при повторном снятии с паузы.
-
Если у вас несколько маркеров, используйте цикл For Each Loop для удаления всех маркеров.
Надеюсь, это поможет решить вашу проблему! Если у вас возникнут дополнительные вопросы или потребуется более подробная помощь - спрашивайте.