Почему спецификаторы UPROPERTY Visible*/Edit* используются вместе с BlueprintRead*
Unreal Engine 4 предоставляет три спецификатора для управления видимостью и редактируемостью члена класса C++, предоставляемого Blueprint через UPROPERTY()
,
Документация в исходном коде UE4 (см. Также вики UE4, документация UE4) гласит следующее относительно возможности редактирования:
- За
VisibleAnywhere
,VisibleInstanceOnly
,VisibleDefaultsOnly
:... не может быть отредактировано вообще.
- За
EditAnywhere
,EditInstanceOnly
,EditDefaultsOnly
:... можно редактировать...
За
BlueprintReadOnly
:... можно читать по чертежам, но не изменять.
а также
BlueprintReadWrite
:... может быть прочитан или написан по проекту.
Вопросы:
Так как
Visible*
Спецификаторы уже ограничивают использование только для чтения в Blueprints, поэтому оно используется в сочетании сBlueprintReadOnly
? Не является ли второй спецификатор лишним? Пример:UPROPERTY(VisibleDefaultsOnly, BlueprintReadOnly) UMyActorComponent* MyActorComponent;
Еще более запутанным является использование
Edit*
спецификаторы, которые позволяют читать и писать в Blueprint вместе сBlueprintReadOnly
который ограничивает чтение только в Blueprint. Разве оба спецификатора не противостоят друг другу? Пример:UPROPERTY(EditAnywhere, BlueprintReadOnly) UMyActorComponent* MyActorComponent;
- Являются ли
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, как показано на рисунке:
Конечно, используя Visible*
спецификаторы, они доступны только для чтения (выделены серым цветом на панели сведений), поэтому вы не можете изменять их значения.
Теперь вернемся к вашему MyActorComponent
, Как я уже сказал, спецификаторы для Component
работает несколько иначе.
Component
отображаются на панели компонентов вместе с классом владельца в редакторе чертежей, а не на панели сведений, как неComponent
переменная.- Когда у вас нет ни
Visible*
ниEdit*
спецификаторы дляComponent
, этотComponent
само по себе всегда будет отображаться в редакторе, но вы не можете получить доступ к свойствам / переменным внутри этого компонента. и панель подробностей для этогоComponent
будет пустым. Visible*
спецификатор позволяет получить доступ кComponent
свойства через его панель сведений, так же, как доступ к 3 переменным в моемTpsCharacter_BP
учебный класс. Однако, когда вы объявляете это какEdit*
панель подробностей покажет проводные настройки, что позволит вам изменить значение указателя этогоComponent
а не его содержание. Это, безусловно, одна вещь, которую вы всегда должны избегать.
Эмпирическое правило для Component
: НИКОГДА не объявлять их Edit*
потому что это позволяет вам изменить значение указателя, чтобы указать на другие вещи; всегда делаю Visible*
, Для не Component
объект, который вы можете установить Edit*
,
Теперь это гораздо проще понять BlueprintRead*
спецификатор. Это лишнее с наличием Visible*
? Является BlueprintReadOnly
сопротивление Edit*
спецификаторы? Абсолютно нет. Они действительны в другом контексте? Да. BlueprintRead*
спецификатор позволяет вам читать / записывать переменную в графе событий в редакторе чертежей, то есть когда вы выполняете визуальные сценарии Blueprint. Для меня TpsCharacter
класс выше, так как все 3 переменные объявлены BlueprintReadOnly
Я могу получить их значения в Графике событий, как показано здесь:
Вы можете сделать то же самое для вашего MyActorComponent
, Используя BlueprintReadWrite
Вы также можете установить значение для этих переменных в Event Graph.
Я пишу такой длинный ответ, чтобы объяснить, потому что они действительно могут запутать новичков, хотя на самом деле они простые понятия.