tl; dr
- _1 _ / _ 2_ спецификаторы позволяют вам (обычно разработчику игр) получать доступ / изменять переменную непосредственно в редакторе Blueprint Editor для быстрой настройки свойств класса.
BlueprintRead*
позволяют получать / устанавливать значение переменной в графике событий, когда вы выполняете Визуальный сценарий.
Объяснение:
Некоторые наименования и пояснения в официальной документации действительно немного двусмысленны, особенно для начинающих. Вкратце, и _4 _ / _ 5_, и BlueprintRead*
предоставляют переменную в классе Unreal Engine, но делают разные вещи. Фактически, на вопрос 2 и 3 можно ответить с помощью вопроса 1. Давайте посмотрим на ваш вопрос 1:
Поскольку спецификаторы Visible*
уже ограничивают использование в Blueprints параметром только для чтения, почему он используется вместе с BlueprintReadOnly
? Второй спецификатор не лишний? Пример:
UPROPERTY(VisibleDefaultsOnly, BlueprintReadOnly)
UMyActorComponent* MyActorComponent;
Здесь вы выставляете ActorComponent
Engine. Здесь я сначала объясню переменную-член, не являющуюся 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, как показано на рисунке: ![Снимок редактора Blueprint Editor для TpsCharacter_BP](https://i.stack.imgur.com/eGMXR.jpg)
Конечно, при использовании спецификаторов Visible*
они доступны только для чтения (выделены серым цветом на панели сведений), поэтому вы не можете изменить их значения.
А теперь вернемся к вашему MyActorComponent
. Как я уже сказал, спецификаторы для Component
работают несколько иначе.
Component
отображается на панели компонентов вместе со своим классом-владельцем в редакторе схем, а не на панели сведений, как переменная, отличная от Component
.
- Если у вас нет ни
Visible*
, ни Edit*
спецификаторов для Component
, сам этот Component
будет всегда отображаться в редакторе, но вы не можете получить доступ к свойствам / переменным внутри этого Компонента., и панель сведений для этого Component
будет пуста.
- Спецификатор
Visible*
позволяет вам получить доступ к свойствам Component
через его панель сведений, точно так же, как доступ к трем переменным в моем классе TpsCharacter_BP
. Однако, если вы укажете его как Edit*
, на панели сведений отобразятся параметры проводной связи, что позволит вам изменить значение указателя этого Component
, а не его содержимое. Этого определенно следует всегда избегать.
Практическое правило для Component
: НИКОГДА не объявляйте их как Edit*
, потому что это позволяет вам изменять значение указателя, чтобы указывать на другие объекты; всегда делаю Visible*
. Для объекта, отличного от Component
, вы можете установить Edit*
.
Теперь понять спецификатор BlueprintRead*
стало намного проще. Это лишнее при наличии Visible*
? BlueprintReadOnly
противостоят Edit*
спецификаторам? Абсолютно нет. Действительны ли они в другом контексте? да. Спецификатор BlueprintRead*
позволяет вам читать / записывать переменную в Графике событий в редакторе Blueprint Editor, то есть когда вы выполняете Visual Scripting Blueprint. Для моего класса TpsCharacter
выше, поскольку все 3 переменные объявлены BlueprintReadOnly
, я могу получить их значения внутри графика событий, как показано здесь: ![Получить переменную из графика событий](https://i.stack.imgur.com /i846C.jpg )
Вы можете сделать то же самое для своего MyActorComponent
. Используя BlueprintReadWrite
, вы также можете установить значение для этих переменных в Графике событий.
Я пишу такой длинный ответ, чтобы объяснить, потому что они действительно могут сбить с толку новичков, хотя на самом деле это простые концепции.
person
Qi Ye
schedule
25.08.2018