Étape 9: Commandes manuelles avec le Kinect
Le script suivant, nous allons créer sera celui que nous utilisons dans notre jeu ainsi que le script de gestionnaire de corps. Il détecte l’état de la main et déclencher la rotation pour notre jeu.
Script du gestionnaire de la main
Maintenant, créez un autre script dans le même dossier que le script du gestionnaire corps et corps voir gestionnaire le script. Appelez-le HandManager. Ce script va ressembler beaucoup notre corps vue contrôleur.
Ajouter ce qui suit de BodyView à notre HandManager Script.
à l’aide de UnityEngine ;
à l’aide de System.Collections.
à l’aide de System.Collections.Generic ;
à l’aide de Kinect = Windows.Kinect ;
public class HandManager : MonoBehaviour
{
public GameObject BodyManager ;
Private PlatformRotate platformRotate ;
Private OVRInfinitePlayerController ovrPlayerScript ;
Private InfinitePlayerController playerScript ;
privé _Bodies Dictionary = new Dictionary () ;
Private BodyManager _BodyManager ;
Private float flipTimer ;
Private float flipDelay = 2 ;
int prevState = 0 ;
privé dictionnaire _BoneMap = new Dictionary()
{
{Kinect.JointType.FootLeft, Kinect.JointType.AnkleLeft},
{Kinect.JointType.AnkleLeft, Kinect.JointType.KneeLeft},
{Kinect.JointType.KneeLeft, Kinect.JointType.HipLeft},
{Kinect.JointType.HipLeft, Kinect.JointType.SpineBase},
{Kinect.JointType.FootRight, Kinect.JointType.AnkleRight},
{Kinect.JointType.AnkleRight, Kinect.JointType.KneeRight},
{Kinect.JointType.KneeRight, Kinect.JointType.HipRight},
{Kinect.JointType.HipRight, Kinect.JointType.SpineBase},
{Kinect.JointType.HandTipLeft, Kinect.JointType.HandLeft}, //Need pour HandSates
{Kinect.JointType.ThumbLeft, Kinect.JointType.HandLeft},
{Kinect.JointType.HandLeft, Kinect.JointType.WristLeft},
{Kinect.JointType.WristLeft, Kinect.JointType.ElbowLeft},
{Kinect.JointType.ElbowLeft, Kinect.JointType.ShoulderLeft},
{Kinect.JointType.ShoulderLeft, Kinect.JointType.SpineShoulder},
{Kinect.JointType.HandTipRight, Kinect.JointType.HandRight}, //Needthis pour l’état de la main
{Kinect.JointType.ThumbRight, Kinect.JointType.HandRight},
{Kinect.JointType.HandRight, Kinect.JointType.WristRight},
{Kinect.JointType.WristRight, Kinect.JointType.ElbowRight},
{Kinect.JointType.ElbowRight, Kinect.JointType.ShoulderRight},
{Kinect.JointType.ShoulderRight, Kinect.JointType.SpineShoulder},
{Kinect.JointType.SpineBase, Kinect.JointType.SpineMid},
{Kinect.JointType.SpineMid, Kinect.JointType.SpineShoulder},
{Kinect.JointType.SpineShoulder, Kinect.JointType.Neck},
{Kinect.JointType.Neck, Kinect.JointType.Head},
};
Maintenant, nous avons ajouté une variable qui n’est pas dans notre script bodyview qui est la variable prevState.
int prevState = 0 ;
Nous avons cette variable pour empêcher la rotation constante. Dans les contrôles d’entrée régulières du jeu que nous faisons cela par la seule activation rotation lorsque la clé est qui a été enfoncée, Monte. Avec le Kinect, il est bon d’avoir un état de repos qui doit être atteint si nous voulons faire pivoter ou retourner à nouveau. Dans notre cas, l’état de repos est un état de main qui ne signale pas une rotation ; par exemple, lorsque les deux mains sont dans les poings.
Maintenant dans la méthode de mise à jour, il faut ajouter ce qui suit :
Tout le code ci-dessus est identique à la vue du corps, qui est utile, puisque nous savons déjà comment ça marche.
La seule chose qui est différente est :
Cette variable tiendra l’état actuel de la main, et à la fin de la méthode de mise à jour, nous l’enregistrera dans la variable d’état précédent.
La partie suivante de la méthode de mise à jour qui est différente est dans la boucle foreach.
void Update()
{
État int = 0 ;
Si (BodyManager == null)
{
retour ;
}
_BodyManager = BodyManager.GetComponent () ;
Si (_BodyManager == null)
{
retour ;
}
Données [] Kinect.Body = _BodyManager.GetData() ;
Si (données == null)
{
retour ;
}
Liste trackedIds = gcnew List () ;
foreach (var corps dans les données)
{
Si (corps == null)
{
continuer ;
}
Si (le corps. IsTracked)
{
trackedIds.Add (corps. TrackingId) ;
}
}
KnownIds la liste = new List (_Bodies.Keys) ;
Tout d’abord supprimer les organes non chaînées
foreach (ulong trackingId dans knownIds)
{
Si (! trackedIds.Contains(trackingId))
{
Destroy(_Bodies[trackingId]) ;
_Bodies.Remove(trackingId) ;
}
}
}
Nous devons écrire les méthodes CheckLeftHandState et CheckRIghtHandState. Ces méthodes utilisent le paramètre Kinect.HandState qui équivaut à un énumérable de Lasso, ouvert ou fermé. Les deux renverront int qui nous sera égale à la variable d’État pour indiquer le jeu quelle commande que nous voulons mettre en œuvre.
Initialement, le jeu retourné si deux mains ont été dans l’état de lasso, mais c’est plus difficile à contrôler, car pour une trame une main pourrait être reconnue un peu plus vite que l’autre, et donc le jeu suppose que nous sommes tournant au lieu de retournement.
Alors maintenant le jeu : tourne à droite si la main droite seule est en état de lasso ; tourne à gauche si la main gauche seule est en état de lasso ; et chiquenaudes si la main gauche est ouverte.
Avec les CheckLeftHandState CheckRightHandState méthodes et faits nous pouvons revenir à la méthode de mise à jour et finir le. Actuellement, nous avons juste besoin de voir si le Kinect enregistre nos États main correctement. Pour cela, nous créons une instruction switch qui utilise l’état actuel et puis vérifie ce qui était l’état précédent, empêchant la rotation continue. Si l’état précédent était le réparateur d’État nous tourner, ou dans ce cas imprimer à l’écran de Debug.
OK nous allons donc voir si cela fonctionne. Dans votre scène, créez un autre objet de jeu vide et appelez-le HandManager. Attacher le script handmanager. N’oubliez pas de faire glisser le BodyManager de la hiérarchie à l’espace réservé de BodyManger dans l’inspecteur HandManager.
IMAGE 1
Exécutez le code dans l’unité.
IMAGE 2
OK mais on voit encore le squelette. Eh bien, si nous avons désactiver le bodyView en cochant la case de gauche dans l’inspecteur nous pouvons exécuter à nouveau le projet.
IMAGE 3
BAM ! Il est là, et vous savez que c’est toujours le travail basé sur le débogueur, même si vous ne pouvez plus voir le squelette !
Bon maintenant pour ajouter cela dans le jeu. Première nous allons faire les constructions préfabriquées des objets HandManager et BodyManager.
IMAGE 4
Une fois que vous avez créer drag le chef de corps de la hiérarchie à préfabriqué Body Manager que vous avez créé. Faites de même avec le gestionnaire de la main. Maintenant comme constructions préfabriquées nous pouvons déplacer facilement ces objets et la fonctionnalité dans notre jeu de scène principale !