Updating to match new version of source page |
TheJebForge (talk | contribs) Created page with "Динамические переменные также по умолчанию являются глобальными. Если вы управляете динамической переменной, значение переменной становится локальным. Если у вас есть другая версия этой перменной где-либо, которой вы не управляете, это приведет к синх..." |
||
Line 134: | Line 134: | ||
Таким образом, если вы создаете динамическую переменную с помощью [[ProtoFlux:Create Dynamic Variable|Create Dynamic Variable]] или [[ProtoFlux:Write Or Create Dynamic Variable|Write Or Create Dynamic Variable]] ProtoFlux нод, или дублируете её с помощью [[ProtoFlux:Duplicate Slot |Duplicate Slot]] ProtoFlux ноды, или перемещаете её с помощью [[ProtoFlux:Set Parent|Set Parent]] ProtoFlux ноды, возможно, вам потребуется добавить [[ProtoFlux:Updates Delay|Updates Delay]] или [[ProtoFlux:Updates Delay With Value|Updates Delay With Value]] ProtoFlux ноду после действия, чтобы убедиться, что динамические переменные были привязаны к моменту их использования. Обычно достаточно задержки на 1-3 обновления. Создание [[Component:DynamicValueVariable|DynamicValueVariable]] на уже существующих [[Component:DynamicVariableSpace|Dynamic Variable Space]] не требует каких-либо задержек. | Таким образом, если вы создаете динамическую переменную с помощью [[ProtoFlux:Create Dynamic Variable|Create Dynamic Variable]] или [[ProtoFlux:Write Or Create Dynamic Variable|Write Or Create Dynamic Variable]] ProtoFlux нод, или дублируете её с помощью [[ProtoFlux:Duplicate Slot |Duplicate Slot]] ProtoFlux ноды, или перемещаете её с помощью [[ProtoFlux:Set Parent|Set Parent]] ProtoFlux ноды, возможно, вам потребуется добавить [[ProtoFlux:Updates Delay|Updates Delay]] или [[ProtoFlux:Updates Delay With Value|Updates Delay With Value]] ProtoFlux ноду после действия, чтобы убедиться, что динамические переменные были привязаны к моменту их использования. Обычно достаточно задержки на 1-3 обновления. Создание [[Component:DynamicValueVariable|DynamicValueVariable]] на уже существующих [[Component:DynamicVariableSpace|Dynamic Variable Space]] не требует каких-либо задержек. | ||
Динамические переменные также по умолчанию являются глобальными. Если вы [[drive|управляете]] динамической переменной, значение переменной становится локальным. Если у вас есть другая версия этой перменной где-либо, которой вы не управляете, это приведет к синхронизации значения переменной между всеми клиентами в сессии, что заставит значение этой переменной скакать между разными значениями хаотично. | |||
Revision as of 18:50, 5 June 2024
Обзор
Динамические переменные позволяют вам читать и писать данные по имени в контексте иерархии слотов. Это упрощает управление данными в больших системах; каждый бит данных четко помечен, и вы можете разбивать данные на несколько пространств, чтобы разделять ваши системы.
Ограничения именования
При использовании динамических переменных существуют некоторые ограничения на именование пространств и переменных внутри этих пространств.
Пространства и имена переменных не могут содержать:
- Любые символы
- Как определено в C# Char.IsSymbol
- Любую пунктуацию / Пустые строки
- Как определено в C# Char.IsPunctuation и C# Char.IsWhiteSpace
- За исключением точки (.), нижнего подчеркивания (_) и пробела ( ).
Использование
При желании к имени может быть добавлен префикс в виде пространства заканчивающийся символом /, чтобы выбрать конкретное пространство для использования переменной. Это полезно для того, что различать несвязанные системы, в которых используют динамические переменные.
Некоторые допустимые имена:
- Health -- нет определенного пространства, имя Health
- World/Color -- имя Color, в пространстве World
- MyCoolSystem/Score -- имя Score, в пространстве MyCoolSystem
Пространства
Динамические переменные могут находиться в слоте содержащий компонент DynamicVariableSpace или в его дочерних слотах.
Таким образом, пространство для переменных находящиеся в корневом слоте мира можно использовать из любого места, но пространство для переменных на вашем аватаре можно использовать из всех слотов, что хранятся в вашем аватаре.
Переменные
Самый простой способ использовать динамические переменные - это использовать компоненты DynamicValueVariable<T> и DynamicReferenceVariable<T>. Они предназначены для значимых (int, float, String, etc.) и ссылочных (Slot, User, etc.) типов, соответственно. Компонент DynamicTypeVariable существует для хранения типов.
Эти компоненты хранят значение или непосредственно ссылку на него. Если два компонента содержат одинаковые имена, то они будут иметь одинаковое содержимое.
Поля
Если вы хотите использовать существующее поле или ссылку на него в качестве содержимого динамической переменной, вы можете использовать компоненты DynamicField<T> или DynamicReference<T>. Вместо того чтобы сохранять что-либо напрямую, они указывают на поле, содержащее значение или ссылочный тип, соответственно.
Как и в случае с переменными, существует вариант для полей содержащие Тип
: DynamicTypeField
(TODO: уточнить разницу между значимыми и ссылочными типами)
"Драйверы"
Вы можете использовать содержимое динамической переменной для управления полем или ссылкой, используя компоненты DynamicValueVariableDriver<T> и DynamicReferenceVariableDriver<T>.
Не представленные типы
При создании компонента динамической переменной вам будет предоставлен список "распространённых типов". Если нужного вам типа нету в этом списке, вам придется ввести его вручную. Смотрите Сложные типы в компонентах.
Привязка
Создание, дублирование или перемещение динамической переменной требует привязки этой переменной к пространству. Это процесс, который выполняется автоматически, но пока что еще не совершенен. (cмотри Предупреждение)
По сути, компонент начинает поиск подходящего пространства для динамической переменной в слоте в котором находится переменная.
Если совпадений нет, он попробует поискать в родительском слоте, затем в родителе родителя и так далее, пока подходящее пространство не будет найдено.
Переменные с явно заданными именами динамического пространства соответствуют только пространствам с таким же именем.
Переменные без явного указания имени пространства соответствуют всем пространствам, в которых не включен OnlyDirectBinding
.
На следующем изображении показаны различия в привязке:
- I:
A
связана сInner
потому что в пространствеInner
не включенOnlyDirectBinding
. - II/III: Обе переменных привязаны явно.
- IV:
A
игнорирует пространствоInner
потому что в пространствеInner
включенOnlyDirectBinding
. - V/VI: Обе переменных привязаны явно.
- VII/IX: Нет соответствующего пространства для динамических переменных. Обе переменных не привязаны.
- VIII: Переменная привязана к пространству
World
. - I и II имеют одно и тоже значение.
- III, IV и VI имеют одно и тоже значение.
Предупреждение
В некоторых случаях привязка может занять небольшое время, до истечения которого динамическая переменная может казаться существующей, но недоступной для чтения или записи. Таким образом, если вы создаете динамическую переменную с помощью Create Dynamic Variable или Write Or Create Dynamic Variable ProtoFlux нод, или дублируете её с помощью Duplicate Slot ProtoFlux ноды, или перемещаете её с помощью Set Parent ProtoFlux ноды, возможно, вам потребуется добавить Updates Delay или Updates Delay With Value ProtoFlux ноду после действия, чтобы убедиться, что динамические переменные были привязаны к моменту их использования. Обычно достаточно задержки на 1-3 обновления. Создание DynamicValueVariable на уже существующих Dynamic Variable Space не требует каких-либо задержек.
Динамические переменные также по умолчанию являются глобальными. Если вы управляете динамической переменной, значение переменной становится локальным. Если у вас есть другая версия этой перменной где-либо, которой вы не управляете, это приведет к синхронизации значения переменной между всеми клиентами в сессии, что заставит значение этой переменной скакать между разными значениями хаотично.
Примеры использования
В следующих примерах будет продемонстрировано несколько вариантов использования динамических переменных. Основное внимание уделяется тому, как использовать их для создания отдельных объектов
Модули внутри объекта
Динамические переменные внутри объекта допускают модульность. Различные модули будут соединены с помощью динамических переменных в пространстве, расположенном в корне объекта. Если все жестко запрограммированные ссылки, входящие в модуль или исходящие из него, удалены, вы можете заменить его другим вариантом/версий без дополнительной настройки. Модуль-локальные переменные могут быть созданы так же с помощью динамических переменных, с расположенном в корне модуля пространством. Используете различное наименование пространств, чтобы отличить их друг от друга. Чтобы сделать доступные переменные более очевидными для других людей, в том числе и для вас через 6 месяцев, рекомендуется поместить все динамические переменные в специальную иерархию слотов.
Обычно для таких иерархий используются следующие названия:
- DV
- DynVar
- Vars
- etc.
Модульный объект мог бы выглядеть следующим образом:
- Project (Пространство:
MyProject
)- Dynamic Variables
- projectVar: String (Dynamic variable
projectVar
of type String)
- projectVar: String (Dynamic variable
- Module: UI (например MeshRenderer или Canvas а так же Коллайдеры), может содержать:
- Dynamic Variable Drivers → Visuals
- Button Interactions → Dynamic Variables
- Editors ↔ Dynamic Variables
- Module: Logic (Space:
Logic
)- Dynamic Variables
- ProtoFlux (может читать, записывать или даже управлять динамическими переменными пространства
MyProject
)
- Dynamic Variables
Настраиваемые объекты
Динамические переменные позволяют получать доступ к свойствам других объектов.
Предположим, что у объектов есть динамическое пространство, коллайдер и строковая переменная с именем Описание
. Тогда, вы могли бы создать отдельный инструмент, который считывает и отображает Описание
в объекте на который применяется инструмент. Этот же инструмент можно было бы расширить для редактирования описаний.
Эта же концепция может быть применена и к шаблонам слотов, используемым в рамках проекта. С их экземплярами можно взаимодействовать с помощью динамических переменных.
Мировые и Пользовательские переменные
Уже существуют заранее созданные пространства для динамических переменных:
World
в Корне мира (OnlyDirectBinding
)User
в каждом слоте Корня Пользователя (OnlyDirectBinding
)Dash
в слоте из UserSpaceRadiantDash
Они могут использоваться для определения состояний, которые являются общими для многих объектов (например, переключение для и ночи, статистика производительности), или для трансляции информации в окружающий мир. (BeatLink, объекты "библиотеки", например такие как менеджер Redprint)
Смотрите Стандарт именования динамических переменных для большой информации.