Спецификаторы
tl; dr
Visible*
/ Edit*
позволяют (как правило, игровому дизайнеру) получать доступ к переменной / изменять ее непосредственно в редакторе Blueprint для быстрой настройкисвойств класса. BlueprintRead*
позволяет получить / установить значение переменной в Графике событий , когда вы выполняете Визуальные сценарии .
Объяснение:
Некоторые названия и пояснения в официальной документации действительно немного двусмысленны, особенно для начинающих.В двух словах, Visible*
/ Edit*
и BlueprintRead*
предоставляют переменную в классе для Unreal Engine , но делают разные вещи.На самом деле, на вопрос 2 и 3 можно ответить через вопрос 1. Давайте посмотрим на ваш вопрос 1:
Поскольку спецификаторы Visible*
уже ограничивают использование только для чтения вЧертежи, почему он используется вместе с 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
basedв этом классе C ++ и откройте этот Blueprint, значения этих 3 переменных можно редактировать на панели Details для этого класса Blueprint, как показано на рисунке:
Конечно,с помощью спецификаторов Visible*
они доступны только для чтения (выделены серым цветом на панели Details ), поэтому вы не можете изменять их значения.
Теперь давайте вернемся к вашему MyActorComponent
,Как я уже сказал, спецификаторы для Component
работают несколько иначе.
Component
отображаются на панели Components вместе с классом владельца в редакторе чертежей, а не на панели сведений , как не Component
переменная. - Если у вас нет ни
Visible*
, ни Edit*
спецификаторов для Component
, этот Component
сам по себе всегда появится в редакторе, но вы не сможетедоступ к свойствам / переменным внутри этого компонента. и Подробная панель для этого Component
будет пустой. Спецификатор Visible*
позволяет получить доступ к Component
.свойства через его Панель сведений , так же, как доступ к 3 переменным в моем классе TpsCharacter_BP
.Однако, когда вы объявите его как Edit*
, на панели Details отобразятся проводные настройки, что позволит вам изменить значение Pointer этого Component
чем его содержание.Это определенно одна вещь, которую вы должны всегда избегать.
Правило для Component
: НИКОГДА не объявляйте их как Edit*
, потому что это позволяет вам изменять значение указателя, чтобы указывать на другие вещи;всегда делай Visible*
.Для не Component
объекта вы можете установить Edit*
.
Теперь гораздо проще понять спецификатор BlueprintRead*
.Это лишнее с наличием Visible*
?BlueprintReadOnly
противоположные Edit*
спецификаторы?Абсолютно нет.Они действительны в другом контексте?Да.Спецификатор BlueprintRead*
позволяет вам читать / записывать переменную в Графике событий в редакторе Blueprint, то есть, когда вы делаете Blueprint Visual Scripting.Для моего класса TpsCharacter
выше, поскольку все 3 переменные объявлены BlueprintReadOnly
, я могу получить их значения в Графике событий , как показано здесь:
Вы можете сделатьто же самое для вашего MyActorComponent
.Используя BlueprintReadWrite
, вы также можете установить значение для этих переменных в График событий .
Я пишу такой длинный ответ, чтобы объяснить, потому что они действительно могут запутать новичков, хотя на самом деле они простыеконцепции.