Élément interactif [expérimental] — MRTK2
Point d’entrée centralisé simplifié du système d’entrée MRTK. Contient les méthodes de gestion d’état, la gestion des événements et la logique de paramètre d’état pour les états d’interaction principaux.
Interactive Element est une fonctionnalité expérimentale prise en charge dans Unity 2019.3 et versions ultérieures, car il utilise une fonctionnalité nouvelle d’Unity 2019.3 : Sérialiser la référence.
Inspecteur d’élément interactif
En mode lecture, l’inspecteur élément interactif fournit des commentaires visuels qui indiquent si l’état actuel est actif ou non. Si un état est actif, il est mis en surbrillance avec une couleur cyan. Si l’état n’est pas actif, la couleur n’est pas modifiée. Les nombres en regard des états de l’inspecteur sont les valeurs d’état. Si l’état est actif, la valeur est 1, si l’état n’est pas actif, la valeur est 0.
États principaux
Interactive Element contient des états principaux et prend en charge l’ajout d’états personnalisés. Un état de base est un état qui a déjà la logique de paramètre d’état définie dans BaseInteractiveElement
. Voici une liste des états principaux actuels pilotés par les entrées :
États principaux actuels
États principaux de l’interaction proche et éloignée :
Près des états principaux d’interaction :
États principaux de l’interaction far :
Autres états principaux :
Comment ajouter un état de base via Inspector
Accédez à Ajouter un état principal dans l’inspecteur de l’élément interactif.
Sélectionnez le bouton Sélectionner l’état pour choisir l’état principal à ajouter. Les états du menu sont triés par type d’interaction.
Ouvrez le pliage Configuration de l’événement pour afficher les événements et les propriétés associés à l’état.
Comment ajouter un état de base via un script
Utilisez la AddNewState(stateName)
méthode pour ajouter un état de base. Pour obtenir la liste des noms d’état principaux disponibles, utilisez l’énumération CoreInteractionState
.
// Add by name or add by CoreInteractionState enum to string
interactiveElement.AddNewState("SelectFar");
interactiveElement.AddNewState(CoreInteractionState.SelectFar.ToString());
Structure interne des états
Les états dans Interactive Element sont de type InteractionState
. Un InteractionState
contient les propriétés suivantes :
- Nom : nom de l’état.
- Valeur : valeur d’état. Si l’état est activé, la valeur d’état est 1. Si l’état est désactivé, la valeur d’état est 0.
- Actif : indique si l’état est actif ou non. La valeur de la propriété Active est true lorsque l’état est activé, false si l’état est désactivé.
-
Type d’interaction : le type d’interaction d’un état est le type d’interaction auquel un état est destiné.
-
None
: ne prend pas en charge aucune forme d’interaction d’entrée. -
Near
: Prise en charge de l’interaction proche. L’entrée est considérée comme une interaction proche lorsqu’une main articulée a un contact direct avec un autre objet de jeu, c’est-à-dire que la position de la main articulée est proche de la position de l’objet de jeu dans l’espace du monde. -
Far
: prise en charge des interactions distantes. L’entrée est considérée comme une interaction à distance lorsque le contact direct avec l’objet de jeu n’est pas requis. Par exemple, l’entrée via le rayon ou le regard du contrôleur est considérée comme une entrée d’interaction éloignée. -
NearAndFar
: englobe la prise en charge des interactions proches et éloignées. -
Other
: prise en charge de l’interaction indépendante du pointeur.
-
- Configuration d’événement : la configuration d’événement d’un état est le point d’entrée du profil d’événements sérialisés.
Toutes ces propriétés sont définies en interne dans le State Manager
contenu dans Interactive Element. Pour modifier les états, utilisez les méthodes d’assistance suivantes :
Méthodes d’assistance des paramètres d’état
// Get the InteractionState
interactiveElement.GetState("StateName");
// Set a state value to 1/on
interactiveElement.SetStateOn("StateName");
// Set a state value to 0/off
interactiveElement.SetStateOff("StateName");
// Check if a state is present in the state list
interactiveElement.IsStatePresent("StateName");
// Check whether or not a state is active
interactiveElement.IsStateActive("StateName");
// Add a new state to the state list
interactiveElement.AddNewState("StateName");
// Remove a state from the state list
interactiveElement.RemoveState("StateName");
L’obtention de la configuration d’événement d’un état est spécifique à l’état lui-même. Chaque état de cœur a un type de configuration d’événement spécifique qui est décrit ci-dessous sous les sections décrivant chaque état de cœur.
Voici un exemple généralisé d’obtention de la configuration d’événement d’un état :
// T varies depending on the core state - the specific T's are specified under each of the core state sections
T stateNameEvents = interactiveElement.GetStateEvents<T>("StateName");
État par défaut
L’état Par défaut est toujours présent sur un élément interactif. Cet état ne sera actif que lorsque tous les autres états ne le sont pas. Si un autre état devient actif, l’état Par défaut est désactivé en interne.
Un élément interactif est initialisé avec les états Par défaut et Focus présents dans la liste des états. L’état par défaut doit toujours être présent dans la liste des états.
Obtention d’événements d’état par défaut
Type de configuration d’événement pour l’état par défaut : StateEvents
StateEvents defaultEvents = interactiveElement.GetStateEvents<StateEvents>("Default");
defaultEvents.OnStateOn.AddListener(() =>
{
Debug.Log($"{gameObject.name} Default State On");
});
defaultEvents.OnStateOff.AddListener(() =>
{
Debug.Log($"{gameObject.name} Default State Off");
});
État du focus
L’état Focus est un état d’interaction proche et lointain qui peut être considéré comme la réalité mixte équivalente au pointage. Le facteur de distinction entre l’interaction proche et éloignée pour l’état Focus est le type de pointeur actif actuel. Si le type de pointeur pour l’état Focus est le pointeur Poke, l’interaction est considérée comme une interaction proche. Si le pointeur principal n’est pas le pointeur Poke, l’interaction est considérée comme une interaction à distance. L’état Focus est présent dans l’élément interactif par défaut.
État du focus
État du focus Inspecteur
Obtention d’événements d’état focus
Type de configuration d’événement pour l’état focus : FocusEvents
FocusEvents focusEvents = interactiveElement.GetStateEvents<FocusEvents>("Focus");
focusEvents.OnFocusOn.AddListener((pointerEventData) =>
{
Debug.Log($"{gameObject.name} Focus On");
});
focusEvents.OnFocusOff.AddListener((pointerEventData) =>
{
Debug.Log($"{gameObject.name} Focus Off");
});
Focus Near vs Focus Far Comportement
État proche du focus
L’état Focus Near est défini lorsqu’un événement focus est déclenché et que le pointeur principal est le pointeur Poke, une indication d’une interaction proche.
Focus Near State Behavior
Focus Near State Inspector
Obtention d’événements d’état FocusNear
Type de configuration d’événement pour l’état FocusNear : FocusEvents
FocusEvents focusNearEvents = interactiveElement.GetStateEvents<FocusEvents>("FocusNear");
focusNearEvents.OnFocusOn.AddListener((pointerEventData) =>
{
Debug.Log($"{gameObject.name} Near Interaction Focus On");
});
focusNearEvents.OnFocusOff.AddListener((pointerEventData) =>
{
Debug.Log($"{gameObject.name} Near Interaction Focus Off");
});
État à distance du focus
L’état Focus Far est défini lorsque le pointeur principal n’est pas le pointeur Poke. Par exemple, le pointeur de rayon du contrôleur par défaut et le pointeur GGV (Gaze, Gesture, Voice) sont considérés comme des pointeurs d’interaction éloignée.
État de l’état de focus
Focus Far State Inspector
Obtention d’événements d’état éloigné du focus
Type de configuration d’événement pour l’état FocusFar : FocusEvents
FocusEvents focusFarEvents = interactiveElement.GetStateEvents<FocusEvents>("FocusFar");
focusFarEvents.OnFocusOn.AddListener((pointerEventData) =>
{
Debug.Log($"{gameObject.name} Far Interaction Focus On");
});
focusFarEvents.OnFocusOff.AddListener((pointerEventData) =>
{
Debug.Log($"{gameObject.name} Far Interaction Focus Off");
});
État tactile
L’état Tactile est un état d’interaction proche qui est défini lorsqu’une main articulée touche directement l’objet. Un contact direct signifie que l’index de la main articulée est très proche de la position mondiale de l’objet. Par défaut, un NearInteractionTouchableVolume
composant est attaché à l’objet si l’état Touch est ajouté à la liste des états. La présence d’un NearInteractionTouchableVolume
composant ou est NearInteractionTouchable
requise pour la détection des événements Touch. La différence entre NearInteractionTouchableVolume
et NearInteractionTouchable
est que NearInteractionTouchableVolume
détecte un contact tactile basé sur le collisionneur de l’objet et NearInteractionTouchable
détecte le toucher dans une zone définie d’un plan.
État tactile Comportement
Composant
Obtention d’événements d’état tactile
Type de configuration d’événement pour l’état tactile : TouchEvents
TouchEvents touchEvents = interactiveElement.GetStateEvents<TouchEvents>("Touch");
touchEvents.OnTouchStarted.AddListener((touchData) =>
{
Debug.Log($"{gameObject.name} Touch Started");
});
touchEvents.OnTouchCompleted.AddListener((touchData) =>
{
Debug.Log($"{gameObject.name} Touch Completed");
});
touchEvents.OnTouchUpdated.AddListener((touchData) =>
{
Debug.Log($"{gameObject.name} Touch Updated");
});
Sélectionner l’état lointain
L’état Sélectionner loin est le IMixedRealityPointerHandler
surfaced. Cet état est un état d’interaction à distance qui détecte le clic d’interaction à distance (appui aérien) et maintient la conservation via l’utilisation de pointeurs d’interaction à distance tels que le pointeur de rayon du contrôleur par défaut ou le pointeur GGV. L’état Sélectionner loin a une option sous le pli de configuration d’événement nommée Global
. Si Global
a la valeur true, le IMixedRealityPointerHandler
est inscrit en tant que gestionnaire d’entrée global. Il n’est pas nécessaire de se concentrer sur un objet pour déclencher des événements système d’entrée si un gestionnaire est inscrit comme global. Par exemple, si un utilisateur souhaite savoir à quel moment le mouvement air-tap/select est effectué quel que soit l’objet dans le focus, définissez Global
sur true.
Sélectionner Le comportement de l’état
Sélectionner l’inspecteur d’état lointain
Obtention d’événements d’état lointain sélectionnés
Type de configuration d’événement pour l’état SelectFar : SelectFarEvents
SelectFarEvents selectFarEvents = interactiveElement.GetStateEvents<SelectFarEvents>("SelectFar");
selectFarEvents.OnSelectUp.AddListener((pointerEventData) =>
{
Debug.Log($"{gameObject.name} Far Interaction Pointer Up");
});
selectFarEvents.OnSelectDown.AddListener((pointerEventData) =>
{
Debug.Log($"{gameObject.name} Far Interaction Pointer Down");
});
selectFarEvents.OnSelectHold.AddListener((pointerEventData) =>
{
Debug.Log($"{gameObject.name} Far Interaction Pointer Hold");
});
selectFarEvents.OnSelectClicked.AddListener((pointerEventData) =>
{
Debug.Log($"{gameObject.name} Far Interaction Pointer Clicked");
});
État cliqué
L’état Cliqué est déclenché par un clic d’interaction distante (Sélectionner l’état Éloigné) par défaut. Cet état est activé en interne, appelle l’événement OnClicked, puis est immédiatement désactivé.
Notes
Les commentaires visuels dans l’inspecteur en fonction de l’activité d’état ne sont pas présents pour l’état Cliqué, car il est activé, puis désactivé immédiatement.
Comportement de l’état
Inspecteur d’état cliqué
Exemple d’état proche et lointain
L’état cliqué peut être déclenché via des points d’entrée supplémentaires à l’aide de la interactiveElement.TriggerClickedState()
méthode . Par exemple, si un utilisateur souhaite qu’une interaction tactile proche déclenche également un clic sur un objet, il ajoute la TriggerClickedState()
méthode en tant qu’écouteur à l’état tactile.
Obtention d’événements d’état cliqués
Type de configuration d’événement pour l’état cliqué : ClickedEvents
ClickedEvents clickedEvent = interactiveElement.GetStateEvents<ClickedEvents>("Clicked");
clickedEvent.OnClicked.AddListener(() =>
{
Debug.Log($"{gameObject.name} Clicked");
});
Activer et désactiver l’état
Les états Activer et Désactiver sont une paire et les deux doivent être présents pour le comportement du bouton bascule. Par défaut, les états Activer et Désactiver sont déclenchés par un clic d’interaction loin (Sélectionner un état lointain). Par défaut, l’état Désactiver est actif au démarrage, ce qui signifie que le bouton bascule sera initialisé sur désactivé. Si un utilisateur souhaite que l’état Bascule activé soit actif au démarrage, dans l’état Basculer sur défini IsSelectedOnStart
sur true.
ToggleOn et Toggle Off State Behavior
ToggleOn et Toggle Off State Inspector
Exemple d’états bascules proches et lointains
Comme pour l’état Cliqué, le paramètre d’état bascule peut avoir plusieurs points d’entrée à l’aide de la interactiveElement.SetToggleStates()
méthode . Par exemple, si un utilisateur souhaite que la touche tactile soit un point d’entrée supplémentaire pour définir les états bascule, il ajoute la méthode à l’un SetToggleStates()
des événements dans l’état Touch.
Activation et désactivation des événements d’état
Type de configuration d’événement pour l’état ToggleOn : ToggleOnEvents
Type de configuration d’événement pour l’état ToggleOff : ToggleOffEvents
// Toggle On Events
ToggleOnEvents toggleOnEvent = interactiveElement.GetStateEvents<ToggleOnEvents>("ToggleOn");
toggleOnEvent.OnToggleOn.AddListener(() =>
{
Debug.Log($"{gameObject.name} Toggled On");
});
// Toggle Off Events
ToggleOffEvents toggleOffEvent = interactiveElement.GetStateEvents<ToggleOffEvents>("ToggleOff");
toggleOffEvent.OnToggleOff.AddListener(() =>
{
Debug.Log($"{gameObject.name} Toggled Off");
});
État du mot clé speech
L’état Mot clé speech écoute les mots clés définis dans le profil vocal Mixed Reality. Toute nouvelle mot clé DOIT être inscrite dans le profil de commande speech avant l’exécution (étapes ci-dessous).
Comportement de l’état du mot clé speech
Composant Speech Mot clé de l’inspecteur d’état du mot clé Speech
Notes
L’état Mot clé speech a été déclenché dans l’éditeur en appuyant sur la touche F5 dans l’gif ci-dessus. La configuration dans le test de l’éditeur pour la reconnaissance vocale est décrite ci-dessous.
Guide pratique pour inscrire une commande/un mot clé Speech
Sélectionnez l’objet de jeu MixedRealityToolkit
Sélectionnez Copier et personnaliser le profil actuel
Accédez à la section Entrée, puis sélectionnez Cloner pour permettre la modification du profil d’entrée.
Faites défiler jusqu’à la section Speech dans le profil d’entrée et clonez le profil speech
Sélectionnez Ajouter une nouvelle commande speech
Entrez le nouveau mot clé. Facultatif : remplacez keyCode par F5 (ou un autre KeyCode) pour permettre les tests dans l’éditeur.
Retour à l’inspecteur d’état du mot clé speech de l’élément interactif et sélectionnez Ajouter un mot clé
Entrez le nouveau mot clé qui vient d’être inscrit dans le profil speech
Pour tester l’état du mot clé speech dans l’éditeur, appuyez sur le Code clé qui a été défini à l’étape 6 (F5) pour simuler l’événement mot clé reconnu.
Obtention d’événements d’état de mot clé speech
Type de configuration d’événement pour l’état SpeechKeyword : SpeechKeywordEvents
SpeechKeywordEvents speechKeywordEvents = interactiveElement.GetStateEvents<SpeechKeywordEvents>("SpeechKeyword");
speechKeywordEvents.OnAnySpeechKeywordRecognized.AddListener((speechEventData) =>
{
Debug.Log($"{speechEventData.Command.Keyword} recognized");
});
// Get the "Change" Keyword event specifically
KeywordEvent keywordEvent = speechKeywordEvents.Keywords.Find((keyword) => keyword.Keyword == "Change");
keywordEvent.OnKeywordRecognized.AddListener(() =>
{
Debug.Log("Change Keyword Recognized");
});
États personnalisés
Comment créer un état personnalisé via Inspector
L’état personnalisé créé via l’inspecteur sera initialisé avec la configuration d’événement d’état par défaut. La configuration d’événement par défaut pour un état personnalisé est de type StateEvents
et contient les événements OnStateOn et OnStateOff.
Accédez à Créer un état personnalisé dans l’inspecteur de l’élément interactif.
Entrez le nom du nouvel état. Ce nom doit être unique et ne peut pas être identique aux états principaux existants.
Sélectionnez Définir le nom d’état à ajouter à la liste d’états.
Cet état personnalisé est initialisé avec la configuration d’événement par défaut
StateEvents
qui contient lesOnStateOn
événements etOnStateOff
. Pour créer une configuration d’événement personnalisée pour un nouvel état, consultez : Création d’un état personnalisé avec une configuration d’événement personnalisée.
Comment créer un état personnalisé via un script
interactiveElement.AddNewState("MyNewState");
// A new state by default is initialized with a the default StateEvents configuration which contains the
// OnStateOn and OnStateOff events
StateEvents myNewStateEvents = interactiveElement.GetStateEvents<StateEvents>("MyNewState");
myNewStateEvents.OnStateOn.AddListener(() =>
{
Debug.Log($"MyNewState is On");
});
Création d’un état personnalisé avec une configuration d’événement personnalisée
Des exemples de fichiers pour un état personnalisé nommé Clavier se trouvent ici : MRTK\SDK\Experimental\InteractiveElement\Examples\Scripts\CustomStateExample
Les étapes suivantes décrivent un exemple existant de création d’un fichier récepteur et d’une configuration d’événement d’état personnalisé.
Pensez à un nom d’état. Ce nom doit être unique et ne peut pas être identique aux états principaux existants. Pour les besoins de cet exemple, le nom d’état sera Clavier.
Créez deux fichiers .cs nommés state name + « Receiver » et state name + « Events ». Le nommage de ces fichiers est pris en compte en interne et doit suivre le nom d’état + convention événement/récepteur.
Pour plus d’informations sur le contenu des fichiers, consultez les fichiers KeyboardEvents.cs et KeyboardReceiver.cs. Les nouvelles classes de configuration d’événements doivent hériter de
BaseInteractionEventConfiguration
et les nouvelles classes de récepteur d’événements doivent hériter deBaseEventReceiver
. Des exemples de paramètres d’état pour l’état du clavier se trouvent dans leCustomStateSettingExample.cs
fichier .Ajoutez l’état à Interactive Element à l’aide du nom d’état. Le nom d’état est reconnu si des fichiers de configuration d’événement et de récepteur d’événements existent. Les propriétés du fichier de configuration d’événement personnalisé doivent apparaître dans l’inspecteur.
Pour obtenir d’autres exemples de fichiers de configuration d’événements et de récepteurs d’événements, consultez les fichiers situés sur les chemins suivants :
- MRTK\SDK\Experimental\InteractiveElement\InteractiveElement\Events\EventConfigurations
- MRTK\SDK\Experimental\InteractiveElement\InteractiveElement\Events\EventReceivers
Exemple de scène
L’exemple de scène pour Interactive Element + State Visualizer se trouve ici : MRTK\SDK\Experimental\InteractiveElement\Examples\InteractiveElementExampleScene.unity
Bouton compressable
L’exemple de scène contient des préfabriqués nommés CompressableButton
et CompressableButtonToggle
, ces préfabriqués miroir le comportement des boutons, qui sont construits à l’aide PressableButtonHoloLens2
de l’élément interactif et du visualiseur d’état.
Le CompressableButton
composant est actuellement une combinaison de avec BaseInteractiveElement
comme classe de PressableButton
+ PressableButtonHoloLens2
base.
Visualiseur d’état [expérimental]
Le composant Visualiseur d’état ajoute des animations à un objet en fonction des états définis dans un composant d’élément interactif lié. Ce composant crée des ressources d’animation, les place dans le dossier MixedRealityToolkit.Generated et active le paramètre d’image clé d’animation simplifié en ajoutant des propriétés Animatable à un objet de jeu cible. Pour activer les transitions d’animation entre les états, une ressource de contrôleur d’animation est créée et une machine à états par défaut est générée avec les paramètres associés et toutes les transitions d’état. La machine à états peut être consultée dans la fenêtre Animator d’Unity.
Visualiseur d’état et système d’animation Unity
Le visualiseur d’état tire actuellement parti du système d’animation Unity.
Lorsque vous appuyez sur le bouton Générer de nouveaux clips d’animation dans le visualiseur d’état, les nouvelles ressources de clip d’animation sont générées en fonction des noms d’état dans Interactive Element et placées dans le dossier MixedRealityToolkit.Generated. La propriété Clip d’animation dans chaque conteneur d’état est définie sur le clip d’animation associé.
Un Animator State Machine est également généré pour gérer les transitions fluides entre les clips d’animation. Par défaut, la machine à états utilise l’état Any pour autoriser les transitions entre n’importe quel état dans Interactive Element.
Les visualiseurs d’état déclenchés dans l’animateur sont également générés pour chaque état. Les paramètres de déclencheur sont utilisés dans le visualiseur d’état pour déclencher une animation.
Limitations du runtime
Le visualiseur d’état doit être ajouté à un objet via l’inspecteur et ne peut pas être ajouté via un script. Les propriétés qui modifient AnimatorStateMachine/AnimationController sont contenues dans un espace de noms d’éditeur (UnityEditor.Animations
) qui est supprimé lorsque l’application est générée.
Comment utiliser le visualiseur d’état
Créer un cube
Élément interactif Attach
Visualiseur d’état d’attachement
Sélectionnez Générer de nouveaux clips d’animation.
Dans le conteneur État du focus, sélectionnez Ajouter une cible.
Faire glisser l’objet de jeu actuel vers le champ cible
Ouvrir le pliage Propriétés animatables du cube
Sélectionnez le menu déroulant de la propriété Animatable, puis sélectionnez Couleur.
Sélectionnez Ajouter la propriété Animatable de couleur.
Choisir une couleur
Appuyez sur Play et observez le changement de couleur de transition
Propriétés animatables
L’objectif principal des propriétés animatables est de simplifier le paramètre d’image clé du clip d’animation. Si un utilisateur connaît le système d’animation Unity et préfère définir directement des images clés sur les clips d’animation générés, il ne peut tout simplement pas ajouter des propriétés Animatable à un objet cible et ouvrir le clip dans la fenêtre Animation d’Unity (Animation Windows >> ).
Si vous utilisez les propriétés Animatable pour l’animation, le type de courbe est défini sur EaseInOut.
Propriétés animatables actuelles :
- Décalage d’échelle
- Décalage de position
- Color
- Couleur du nuanceur
- Nuanceur Float
- Vecteur de nuanceur
Décalage d’échelle
La propriété Animatable de décalage d’échelle prend l’échelle actuelle de l’objet et ajoute le décalage défini.
Décalage de position
La propriété Animatable décalage de position prend la position actuelle de l’objet et ajoute le décalage défini.
Color
La propriété Color Animatable représente la couleur main d’un matériau si le matériau a une propriété de couleur main. Cette propriété anime la material._Color
propriété .
Couleur du nuanceur
La propriété Nuanceur Color Animatable fait référence à une propriété de nuanceur de type couleur. Un nom de propriété est requis pour toutes les propriétés du nuanceur. Le gif ci-dessous illustre l’animation d’une propriété de couleur de nuanceur nommée Fill_Color qui n’est pas la couleur de matériau main. Observez les valeurs changeantes dans l’inspecteur de matériaux.
Nuanceur Float
La propriété Shader Float Animatable fait référence à une propriété de nuanceur de type float. Un nom de propriété est requis pour toutes les propriétés du nuanceur. Dans le gif ci-dessous, observez les valeurs changeantes dans l’inspecteur de matériau pour la propriété Metallic.
Vecteur de nuanceur
La propriété Animatable du vecteur de nuanceur fait référence à une propriété de nuanceur de type Vector4. Un nom de propriété est requis pour toutes les propriétés du nuanceur. Dans le gif ci-dessous, observez les valeurs changeantes dans l’inspecteur de matériau pour la propriété Mosaïne (Main Tex_ST).
Guide pratique pour trouver des noms de propriétés animatable Shader
Accédez à Animation de > fenêtre >
Vérifiez que l’objet avec le visualiseur d’état est sélectionné dans la hiérarchie
Sélectionner un clip d’animation dans la fenêtre Animation
Sélectionnez Ajouter une propriété, ouvrez le plieur de rendu de maillage.
Cette liste contient les noms de tous les noms de propriétés Animatable