Почему спецификаторы UPROPERTY Visible*/Edit* используются вместе с BlueprintRead*

Unreal Engine 4 предоставляет три спецификатора для управления видимостью и редактируемостью члена класса C++, предоставляемого Blueprint через UPROPERTY(),

Документация в исходном коде UE4 (см. Также вики UE4, документация UE4) гласит следующее относительно возможности редактирования:

  • За VisibleAnywhere, VisibleInstanceOnly, VisibleDefaultsOnly:

    ... не может быть отредактировано вообще.

  • За EditAnywhere, EditInstanceOnly, EditDefaultsOnly:

    ... можно редактировать...

  • За BlueprintReadOnly:

    ... можно читать по чертежам, но не изменять.

    а также BlueprintReadWrite:

    ... может быть прочитан или написан по проекту.

Вопросы:

  1. Так как Visible* Спецификаторы уже ограничивают использование только для чтения в Blueprints, поэтому оно используется в сочетании с BlueprintReadOnly? Не является ли второй спецификатор лишним? Пример:

    UPROPERTY(VisibleDefaultsOnly, BlueprintReadOnly)
    UMyActorComponent* MyActorComponent;
    
  2. Еще более запутанным является использование Edit* спецификаторы, которые позволяют читать и писать в Blueprint вместе с BlueprintReadOnly который ограничивает чтение только в Blueprint. Разве оба спецификатора не противостоят друг другу? Пример:

    UPROPERTY(EditAnywhere, BlueprintReadOnly)
    UMyActorComponent* MyActorComponent;
    
  3. Являются ли Visible* / Edit* Спецификаторы действительны в другом контексте, чем BlueprintRead* спецификаторы? (вопрос не о InstanceOnly (окна свойств для экземпляров), DefaultsOnly (окна свойств для архетипов) и Anywhere (экземпляры и архетипы))

1 ответ

Решение

ТЛ; др

  • Visible* / Edit* Спецификаторы позволяют вам (как правило, разработчику игр) получать доступ к переменной / изменять ее непосредственно в Blueprint Editor для быстрой настройки свойств класса.
  • BlueprintRead* позволяют вам получить / установить значение переменной в графе событий, когда вы делаете визуальные сценарии.

Объяснение:

Некоторые названия и пояснения в официальной документации действительно немного неоднозначны, особенно для начинающих. В двух словах, оба Visible* / Edit* а также BlueprintRead* выставить переменную в классе Unreal Engine, но делать разные вещи. На самом деле, на вопрос 2 и 3 можно ответить через вопрос 1. Давайте посмотрим на ваш вопрос 1:

Так как Visible* Спецификаторы уже ограничивают использование только для чтения в Blueprints, поэтому оно используется в сочетании с BlueprintReadOnly? Не является ли второй спецификатор лишним? Пример:

UPROPERTY(VisibleDefaultsOnly, BlueprintReadOnly) UMyActorComponent* MyActorComponent;

Здесь вы выставляете ActorComponent к двигателю. Здесь я объясню не Component сначала переменная-член, потому что спецификаторы для Component "кажется" работать не так, как Component переменные.

Предположим, у меня есть TpsCharacter класс для персонажа шутера от третьего лица, который имеет следующие 3 float переменные:

// The zooming speed
UPROPERTY(EditDefaultsOnly, BlueprintReadOnly, Category = "Camera Zoom")
float ZoomSpeed;

// The FOV after zoom in
UPROPERTY(EditDefaultsOnly, BlueprintReadOnly, Category = "Camera Zoom")
float ZoomInFov;

// The default FOV
UPROPERTY(EditDefaultsOnly, BlueprintReadOnly, Category = "Camera Zoom")
float DefaultFov;

Они все указаны как EditDefaultsOnly Это означает, что после создания класса Blueprint с именем TpsCharacter_BP на основе этого класса C++ и открытия этого Blueprint значения этих 3 переменных можно редактировать на панели сведений для этого класса Blueprint, как показано на рисунке: Снимок редактора чертежей для TpsCharacter_BP

Конечно, используя Visible* спецификаторы, они доступны только для чтения (выделены серым цветом на панели сведений), поэтому вы не можете изменять их значения.

Теперь вернемся к вашему MyActorComponent, Как я уже сказал, спецификаторы для Component работает несколько иначе.

  1. Component отображаются на панели компонентов вместе с классом владельца в редакторе чертежей, а не на панели сведений, как не Component переменная.
  2. Когда у вас нет ни Visible* ни Edit* спецификаторы для Component, этот Component само по себе всегда будет отображаться в редакторе, но вы не можете получить доступ к свойствам / переменным внутри этого компонента. и панель подробностей для этого Component будет пустым.
  3. Visible* спецификатор позволяет получить доступ к Component свойства через его панель сведений, так же, как доступ к 3 переменным в моем TpsCharacter_BP учебный класс. Однако, когда вы объявляете это как Edit* панель подробностей покажет проводные настройки, что позволит вам изменить значение указателя этого Component а не его содержание. Это, безусловно, одна вещь, которую вы всегда должны избегать.

Эмпирическое правило для Component: НИКОГДА не объявлять их Edit* потому что это позволяет вам изменить значение указателя, чтобы указать на другие вещи; всегда делаю Visible*, Для не Component объект, который вы можете установить Edit*,

Теперь это гораздо проще понять BlueprintRead* спецификатор. Это лишнее с наличием Visible*? Является BlueprintReadOnly сопротивление Edit* спецификаторы? Абсолютно нет. Они действительны в другом контексте? Да. BlueprintRead* спецификатор позволяет вам читать / записывать переменную в графе событий в редакторе чертежей, то есть когда вы выполняете визуальные сценарии Blueprint. Для меня TpsCharacter класс выше, так как все 3 переменные объявлены BlueprintReadOnly Я могу получить их значения в Графике событий, как показано здесь: Получить переменную из Event Graph

Вы можете сделать то же самое для вашего MyActorComponent, Используя BlueprintReadWrite Вы также можете установить значение для этих переменных в Event Graph.

Я пишу такой длинный ответ, чтобы объяснить, потому что они действительно могут запутать новичков, хотя на самом деле они простые понятия.

Другие вопросы по тегам