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

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

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

  • Для VisibleAnywhere, VisibleInstanceOnly, VisibleDefaultsOnly:
    # P3 #
  • Для EditAnywhere, EditInstanceOnly, EditDefaultsOnly:
    # P4 #
  • # P5 #
    # P6 #
    # P7 #
    # P8 #

Вопросов:

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

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

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

person Roi Danton    schedule 25.08.2018    source источник


Ответы (1)


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

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

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

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

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

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

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

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

person Qi Ye    schedule 25.08.2018