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

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

Документация в исходном коде UE4 (см. Также UE4 wiki , Документация 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 Ответ

0 голосов
/ 25 августа 2018
Спецификаторы

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, как показано на рисунке: Blueprint Editor snapshot for TpsCharacter_BP

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

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

  1. Component отображаются на панели Components вместе с классом владельца в редакторе чертежей, а не на панели сведений , как не Componentпеременная.
  2. Если у вас нет ни Visible*, ни Edit* спецификаторов для Component, этот Component сам по себе всегда появится в редакторе, но вы не сможетедоступ к свойствам / переменным внутри этого компонента. и Подробная панель для этого Component будет пустой. Спецификатор
  3. 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, я могу получить их значения в Графике событий , как показано здесь: Get variable from Event Graph

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

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

...