Классификация виджетов

Всем Привет!Такая проблема.Как сделать,чтобы нода ,Remove All Widgets, удаляла не все виджеты.При снятии с паузы удаляется Hud и все Маркеры

Привет!
Нода Remove All Widgets удаляет абсолютно все виджеты в уровне, включая те, что находятся в Actor. То есть, даже если виджет привязан к какому-то Actor, он всё равно исчезнет.

Если тебе нужно удалить только определённый виджет, лучше использовать Remove From Parent. В этом случае в Target нужно передавать референс именно того виджета, который ты хочешь убрать с экрана.

Я задала Ваш вопрос в АИ Студия Гугл вот ответ : Привет! Да, Remove All Widgets удаляет абсолютно все виджеты, что часто нежелательно. Вот несколько способов обойти эту проблему и удалить только определенные виджеты при снятии с паузы:

Способ 1: Создание Переменной для HUD и Маркеров и Удаление По ID:

  1. Создание Переменной:
  • В вашем Blueprint, где вы создаете HUD и маркеры, создайте две переменные типа Widget. Назовите их, например, HUDWidgetRef и MarkerWidgetRef. Тип переменной должен быть Widget.
  1. Сохранение Ссылки на Виджет:
  • После создания HUD и маркеров, сразу же сохраните ссылку на созданный виджет в соответствующие переменные. Например, после Create Widget (HUD) → Set HUDWidgetRef, и после Create Widget (Marker) → Set MarkerWidgetRef.
  1. Удаление виджетов по ссылке:
  • При снятии с паузы (в 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:

  1. Создайте “базовый” виджет (BaseWidget): В нем разместите общие элементы, которые не нужно удалять при снятии с паузы.

  2. Создайте виджет HUD (HUDWidget), унаследованный от BaseWidget. В нем разместите элементы HUD, которые нужно удалять.

  3. Создайте виджет Marker (MarkerWidget), унаследованный от BaseWidget.

  4. В этом случае Remove All Widgets будет удалять только HUDWidget и MarkerWidget, но оставит элементы, находящиеся в BaseWidget.

Способ 3: Использование Custom Events и Dispatchers

  1. Создайте 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 для удаления всех маркеров.

Надеюсь, это поможет решить вашу проблему! Если у вас возникнут дополнительные вопросы или потребуется более подробная помощь - спрашивайте.