Created page with "Interfaces (par exemple MeshRenderer ou Canvas plus Colliders) peuvent contenir:" |
Created page with "Une image montrant que les espaces de variables dynamiques avec OnlyDirectBinding sont ignorées excepté par les variables qui sont explicitement dans le même espace." |
||
Line 67: | Line 67: | ||
L'image suivante montre les différence de fixation: | L'image suivante montre les différence de fixation: | ||
[[File:Dynamic_Variables.svg|border| | [[File:Dynamic_Variables.svg|border|Une image montrant que les espaces de variables dynamiques avec OnlyDirectBinding sont ignorées excepté par les variables qui sont explicitement dans le même espace.]] | ||
* | * I: <code>A</code> est connecté à <code>Inner</code> car <code>Inner</code> n'est <u>pas</u> <code>OnlyDirectBinding</code>. | ||
* <span lang="en" dir="ltr" class="mw-content-ltr">II/III: Both variables are bound explicitly.</span> | * <span lang="en" dir="ltr" class="mw-content-ltr">II/III: Both variables are bound explicitly.</span> | ||
* <span lang="en" dir="ltr" class="mw-content-ltr">IV: <code>A</code> ignores <code>Inner</code> because <code>Inner</code> is <code>OnlyDirectBinding</code>.</span> | * <span lang="en" dir="ltr" class="mw-content-ltr">IV: <code>A</code> ignores <code>Inner</code> because <code>Inner</code> is <code>OnlyDirectBinding</code>.</span> | ||
Line 132: | Line 132: | ||
<span lang="en" dir="ltr" class="mw-content-ltr">In a few use-cases, binding may take a small amount of time, before which the dynamic variable can appear to be present, but not be readable or writable.</span> | <span lang="en" dir="ltr" class="mw-content-ltr">In a few use-cases, binding may take a small amount of time, before which the dynamic variable can appear to be present, but not be readable or writable.</span> | ||
<span lang="en" dir="ltr" class="mw-content-ltr">Therefore, if you create a dynamic variable using the [[ProtoFlux:Create Dynamic Variable|Create Dynamic Variable]] or [[ProtoFlux:Write Or Create Dynamic Variable|Write Or Create Dynamic Variable]] ProtoFlux Node, or cause it to be duplicated using the [[ProtoFlux:Duplicate Slot |Duplicate Slot]] ProtoFlux Node, or cause it to be moved using the [[ProtoFlux:Set Parent|Set Parent]] ProtoFlux Node, you may find it necessary to add an [[ProtoFlux:Updates Delay | <span lang="en" dir="ltr" class="mw-content-ltr">Therefore, if you create a dynamic variable using the [[ProtoFlux:Create Dynamic Variable|Create Dynamic Variable]] or [[ProtoFlux:Write Or Create Dynamic Variable|Write Or Create Dynamic Variable]] ProtoFlux Node, or cause it to be duplicated using the [[ProtoFlux:Duplicate Slot |Duplicate Slot]] ProtoFlux Node, or cause it to be moved using the [[ProtoFlux:Set Parent|Set Parent]] ProtoFlux Node, you may find it necessary to add an [[ProtoFlux:Delay Updates|Delay Updates]] or [[ProtoFlux:Updates Delay With Data|Updates Delay With Data]] ProtoFlux Node afterwards in order to ensure the dynamic variables have been bound by the time you use them. A delay of 1 to 3 updates usually suffices. Creating [[Component:DynamicValueVariable|DynamicValueVariables]] on already existing [[Component:DynamicVariableSpace|Dynamic Variable Space]] doesn't require any delays.</span> | ||
<!-- TODO: more precise list of problematic uses cases (e.g. <code>Duplicate Slot</code> of a whole space works totally fine.) --> | <!-- TODO: more precise list of problematic uses cases (e.g. <code>Duplicate Slot</code> of a whole space works totally fine.) --> | ||
Line 168: | Line 168: | ||
*** Dynamic Variables | *** Dynamic Variables | ||
**** logicVar: int (Dynamic variable <code>logicVar</code> of type [[Type:Int|int]]) | **** logicVar: int (Dynamic variable <code>logicVar</code> of type [[Type:Int|int]]) | ||
**** MyProject/Logic: | **** MyProject/Logic: Slot (Dynamic variable <code>Logic</code> of type [[Slot]] for space <code>MyProject</code>, driven with reference to Slot of module to make it accessible to other modules) | ||
*** [[ProtoFlux]] (peut lire, écrire et conduire les variables dynamiques dans l'espace <code>MyProject</code>) | *** [[ProtoFlux]] (peut lire, écrire et conduire les variables dynamiques dans l'espace <code>MyProject</code>) | ||
Revision as of 16:25, 4 June 2024
Aperçu
Les variables dynamiques vous permettent de lire et écrire des information depuis un simple nom. Elles rendent simple la gestion de données dans des systèmes larges; chaque bout de données est étiquetée correctement que vous pouvez décomposer en plusieurs espaces.
Restrictions de noms
En utilisant les variables dynamiques, il y a quelques restrictions sur le nommage sur les variables et espaces.
Les noms de variables et espaces ne peuvent pas contenir:
- Des symboles
- Comme défini en C# avec Char.IsSymbol
- Ponctuation / WhiteSpaces
- Comme défini en C# avec Char.IsPunctuation et Char.IsWhiteSpace
- Excepté pour les points (.), underscore (_) et espaces ( ).
Utilisation
Optionnellement, un nom de variable peut être préfixé avec le nom d'un espace, se finissant avec /, pour choisir un espace de variables. Cela est utile pour distinguer des systèmes indépendants.
Quelques noms valides incluent:
- Vie -- pas d'espaces, juste nommé Vie
- World/Couleur -- nommé Couleur, dans l'espace World
- MonSysteme/Score -- Nommé Score, dans l'espace MonSysteme
Espaces
Les variables dynamiques peuvent être n'importe ou ou sous un slot contenant le composant DynamicVariableSpace.
Donc, une variable sur l'origine du monde peut être utilisée de partout alors qu'une variable dans un espace sur votre avatar ne peut être utilisée que sur votre avatar.
Variables
La manière la plus simple d'utiliser les variables dynamiques est d'utiliser les composants DynamicValueVariable<T> et DynamicReferenceVariable<T>. Ils fonctionnent pour des valeurs (int, float, String...) et references (Slot, Utilisateur...).
Ces components stockent une valeur ou référence directement. Si deux variable ont le même nom, elles auront des valeurs identiques.
Champs
Si vous voulez utiliser un champ ou référence comme contenu d'une variable dynamique, vous pouvez utiliser les composants DynamicField<T> ou DynamicReference<T>. A la place de stocker quelque chose directement, ils pointent a un champ contenant une certaine valeur ou référence.
Comme avec les variables, il y a un pour les champs Type
: DynamicTypeField
(A FAIRE: clarifier les types valeur vs référence)
Pilotes
Vous pouvez utiliser le contenu d'une variable dynamique pour piloter un champ ou référence en utilisant les composants DynamicValueVariableDriver<T> ou DynamicReferenceVariableDriver<T>.
Types non-listés
A la création d'une variable dynamique, vous pouvez choisir depuis une liste de types communs. Si ce que vous voulez n'est pas dans la liste, vous allez devoir entrer le type complexe manuellement.
La Fixation
Créer, dupliquer ou bouger une variable dynamique requiers de fixer cette variable a un espace. C'est un processus automatique mais qui n'est pas parfait.
Dans l'essence, il va chercher un espace de variable dynamique correspondant au slot de la variable dynamique.
Si il n'en trouve pas, il essaye le slot parent, et son parent, ect. jusqu'à ce qu'un espace soit trouvé.
Les variables avec un nom d'espace spécifique ne vont être compatible qu'avec un espace du même nom.
Les variables sans nom d'espace explicite vont s'attacher a n'importe quel espace qui n'est pas OnlyDirectBinding
.
L'image suivante montre les différence de fixation:
- I:
A
est connecté àInner
carInner
n'est pasOnlyDirectBinding
. - II/III: Both variables are bound explicitly.
- IV:
A
ignoresInner
becauseInner
isOnlyDirectBinding
. - V/VI: Both variables are bound explicitly.
- VII/IX: There is no matching dynamic variable space. Both variables are not bound.
- VIII: The variable is explicitly bound to
World
. - I and II share the same value.
- III, IV and VI share the same value.
Attention
In a few use-cases, binding may take a small amount of time, before which the dynamic variable can appear to be present, but not be readable or writable. Therefore, if you create a dynamic variable using the Create Dynamic Variable or Write Or Create Dynamic Variable ProtoFlux Node, or cause it to be duplicated using the Duplicate Slot ProtoFlux Node, or cause it to be moved using the Set Parent ProtoFlux Node, you may find it necessary to add an Delay Updates or Updates Delay With Data ProtoFlux Node afterwards in order to ensure the dynamic variables have been bound by the time you use them. A delay of 1 to 3 updates usually suffices. Creating DynamicValueVariables on already existing Dynamic Variable Space doesn't require any delays.
Example Applications
The following examples will demonstrate a few use-cases of dynamic variables. There is a focus on how to use them to create separate objects
Modules within an object
Dynamic variables within an object allow modularization. Different modules would be connected via dynamic variables within the space located at the root of the object. If all hard-coded references going in or out of a module are eliminated you can replace it with a different variant/version without additional setup. Module-local variables can be created with a dynamic variable space located at the root of the module. Use appropriately named spaces to differentiate between the two. To make available variables more obvious to other people - including you in 6 months - it is recommended to place all dynamic variables within a dedicated slot hierarchy.
Des noms communs pour ces hiérarchies sont:
- DV
- DynVar
- Vars
- etc.
Un objet modulaire pourrait ressembler a ca:
- Project (Espace:
MyProject
)- Dynamic Variables
- projectVar: String (Dynamic variable
projectVar
of type String)
- projectVar: String (Dynamic variable
- Module: Interfaces (par exemple MeshRenderer ou Canvas plus Colliders) peuvent contenir:
- Dynamic Variable Drivers → Visuals
- Button Interactions → Dynamic Variables
- Editors ↔ Dynamic Variables
- Module: Logic (Space:
Logic
)- Dynamic Variables
- ProtoFlux (peut lire, écrire et conduire les variables dynamiques dans l'espace
MyProject
)
- Dynamic Variables
Configurable objects
Les variables dynamiques rendent possible d’accéder aux propriétés d'un autre objet.
Assumant des objets avec un espace de variables dynamiques, un collisionneur et une variable de type string nommée Description
, vous pourriez créer un outil séparé qui lis et montre la Description
de l'objet sur lequel vous pointez. Le même outil pourrait être utilisé pour changer la description.
Le même concept est aussi appliqué sur les Slot modèles utilisés dans un projet. Leurs instances peuvent être interagies avec par les variables dynamiques.
World/User variables
Il y a quelques espaces de variables dynamiques pré-faits:
World
sur Root (OnlyDirectBinding
)User
sur chaque Slot User Root (OnlyDirectBinding
)Dash
sur le Slot de UserSpaceRadiantDash
Elles peuvent être utilisées pour un état partagé par plusieurs objets (par exemple, option jour/nuit, performance) ou pour annoncer des données dans le monde. (BeatLink ou Redprint)
Voir standards de nommages pour une liste plus détaillée.