2021/02/04 插眼更新: 每次需要多识别一个姿势,需要加好多代码,公开bool值给外部调用,这是很不方便的,直接用委托的方式即可,委托绑定的时候最好放在Start()里,不要放在Awake(),完整代码放最后
效果: (右手过肩1秒之后,识别并打印信息)
1. 添加KinectManager.cs 和 KinectGestureManager.cs
2. 添加 Kinect4AzureInterface.cs
3.添加两个自定义的脚本TintGestureListener.cs ,TintGestureDemo.cs
这个是你需要识别的姿势,例如我只要识别右手举过肩,就写1,再在下面选择Raise Right Hand
如果需要识别多个:
在 TintGestureListener.cs 里面照着这个写法 多公开几个方法,让外部调用
/// <summary>
/// 右手举起过肩并保持至少一秒
/// </summary>
private bool RaiseRightHand;
/// <summary>
/// Determines whether swipe left is detected.
/// </summary>
/// <returns><c>true</c> if swipe left is detected; otherwise, <c>false</c>.</returns>
public bool IsRaiseRightHand()
{
if (RaiseRightHand)
{
RaiseRightHand = false;
return true;
}
return false;
}
再在下面,将对应的bool值设置为true
TintGestureDemo.cs
using UnityEngine;
public class TintGestureDemo : MonoBehaviour
{
void Update()
{
if (TintGestureListener.Instance.IsRaiseRightHand())
{
Debug.Log("右手举起过肩并保持至少一秒");
}
}
}
TintGestureListener.cs
using com.rfilkov.kinect;
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class TintGestureListener : MonoBehaviour, GestureListenerInterface
{
[Tooltip("Index of the player, tracked by this component. 0 means the 1st player, 1 - the 2nd one, 2 - the 3rd one, etc.")]
public int playerIndex = 0;
[Tooltip("List of the gestures to detect.")]
public List<GestureType> detectGestures = new List<GestureType>();
// 单例
public static TintGestureListener Instance;
private void Awake()
{
Instance = this;
}
/// <summary>
/// 右手举起过肩并保持至少一秒
/// </summary>
private bool RaiseRightHand;
/// <summary>
/// Determines whether swipe left is detected.
/// </summary>
/// <returns><c>true</c> if swipe left is detected; otherwise, <c>false</c>.</returns>
public bool IsRaiseRightHand()
{
if (RaiseRightHand)
{
RaiseRightHand = false;
return true;
}
return false;
}
public bool GestureCancelled(ulong userId, int userIndex, GestureType gesture, KinectInterop.JointType joint)
{
return true;
}
public bool GestureCompleted(ulong userId, int userIndex, GestureType gesture, KinectInterop.JointType joint, Vector3 screenPos)
{
if (userIndex != playerIndex)
return false;
switch (gesture)
{
case GestureType.None:
break;
case GestureType.RaiseRightHand:
// 识别举起右手
RaiseRightHand = true;
break;
case GestureType.RaiseLeftHand:
break;
case GestureType.Psi:
break;
case GestureType.Tpose:
break;
case GestureType.Stop:
break;
case GestureType.Wave:
break;
case GestureType.SwipeLeft:
break;
case GestureType.SwipeRight:
break;
case GestureType.SwipeUp:
break;
case GestureType.SwipeDown:
break;
case GestureType.ZoomIn:
break;
case GestureType.ZoomOut:
break;
case GestureType.Wheel:
break;
case GestureType.Jump:
break;
case GestureType.Squat:
break;
case GestureType.Push:
break;
case GestureType.Pull:
break;
case GestureType.ShoulderLeftFront:
break;
case GestureType.ShoulderRightFront:
break;
case GestureType.LeanLeft:
break;
case GestureType.LeanRight:
break;
case GestureType.LeanForward:
break;
case GestureType.LeanBack:
break;
case GestureType.KickLeft:
break;
case GestureType.KickRight:
break;
case GestureType.Run:
break;
case GestureType.RaisedRightHorizontalLeftHand:
break;
case GestureType.RaisedLeftHorizontalRightHand:
break;
case GestureType.TouchRightElbow:
break;
case GestureType.TouchLeftElbow:
break;
case GestureType.MoveLeft:
break;
case GestureType.MoveRight:
break;
case GestureType.Apose:
break;
case GestureType.UserGesture1:
break;
case GestureType.UserGesture2:
break;
case GestureType.UserGesture3:
break;
case GestureType.UserGesture4:
break;
case GestureType.UserGesture5:
break;
case GestureType.UserGesture6:
break;
case GestureType.UserGesture7:
break;
case GestureType.UserGesture8:
break;
case GestureType.UserGesture9:
break;
case GestureType.UserGesture10:
break;
default:
break;
}
return true;
}
public void GestureInProgress(ulong userId, int userIndex, GestureType gesture, float progress, KinectInterop.JointType joint, Vector3 screenPos)
{
}
public void UserDetected(ulong userId, int userIndex)
{
if (userIndex == playerIndex)
{
// as an example - detect these user specific gestures
KinectGestureManager gestureManager = KinectManager.Instance.gestureManager;
// 识别所有姿势
foreach (GestureType gesture in detectGestures)
{
gestureManager.DetectGesture(userId, gesture);
}
}
}
public void UserLost(ulong userId, int userIndex)
{
if (userIndex != playerIndex)
return;
}
}
2020/02/04 代码更新:
调用示例:
using com.rfilkov.kinect;
using System;
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class TintGestureListener : MonoBehaviour, GestureListenerInterface
{
[Tooltip("Index of the player, tracked by this component. 0 means the 1st player, 1 - the 2nd one, 2 - the 3rd one, etc.")]
public int playerIndex = 0;
[Tooltip("List of the gestures to detect.")]
public List<GestureType> detectGestures = new List<GestureType>();
// 单例
public static TintGestureListener Instance;
private void Awake()
{
Instance = this;
}
public bool GestureCancelled(ulong userId, int userIndex, GestureType gesture, KinectInterop.JointType joint)
{
return true;
}
public Action RaiseRightHandAction;
public Action RaiseLeftHandAction;
public Action SwipeLeftAction;
public bool GestureCompleted(ulong userId, int userIndex, GestureType gesture, KinectInterop.JointType joint, Vector3 screenPos)
{
if (userIndex != playerIndex)
return false;
switch (gesture)
{
case GestureType.None:
break;
case GestureType.RaiseRightHand:
// 识别举起右手
RaiseRightHandAction?.Invoke();
break;
case GestureType.RaiseLeftHand:
// 识别举起左手
RaiseLeftHandAction?.Invoke();
break;
case GestureType.Psi:
break;
case GestureType.Tpose:
break;
case GestureType.Stop:
break;
case GestureType.Wave:
break;
case GestureType.SwipeLeft:
SwipeLeftAction?.Invoke();
break;
case GestureType.SwipeRight:
break;
case GestureType.SwipeUp:
break;
case GestureType.SwipeDown:
break;
case GestureType.ZoomIn:
break;
case GestureType.ZoomOut:
break;
case GestureType.Wheel:
break;
case GestureType.Jump:
break;
case GestureType.Squat:
break;
case GestureType.Push:
break;
case GestureType.Pull:
break;
case GestureType.ShoulderLeftFront:
break;
case GestureType.ShoulderRightFront:
break;
case GestureType.LeanLeft:
break;
case GestureType.LeanRight:
break;
case GestureType.LeanForward:
break;
case GestureType.LeanBack:
break;
case GestureType.KickLeft:
break;
case GestureType.KickRight:
break;
case GestureType.Run:
break;
case GestureType.RaisedRightHorizontalLeftHand:
break;
case GestureType.RaisedLeftHorizontalRightHand:
break;
case GestureType.TouchRightElbow:
break;
case GestureType.TouchLeftElbow:
break;
case GestureType.MoveLeft:
break;
case GestureType.MoveRight:
break;
case GestureType.Apose:
break;
case GestureType.UserGesture1:
break;
case GestureType.UserGesture2:
break;
case GestureType.UserGesture3:
break;
case GestureType.UserGesture4:
break;
case GestureType.UserGesture5:
break;
case GestureType.UserGesture6:
break;
case GestureType.UserGesture7:
break;
case GestureType.UserGesture8:
break;
case GestureType.UserGesture9:
break;
case GestureType.UserGesture10:
break;
default:
break;
}
return true;
}
public void GestureInProgress(ulong userId, int userIndex, GestureType gesture, float progress, KinectInterop.JointType joint, Vector3 screenPos)
{
}
public void UserDetected(ulong userId, int userIndex)
{
if (userIndex == playerIndex)
{
// as an example - detect these user specific gestures
KinectGestureManager gestureManager = KinectManager.Instance.gestureManager;
// 识别所有姿势
foreach (GestureType gesture in detectGestures)
{
gestureManager.DetectGesture(userId, gesture);
}
}
}
public void UserLost(ulong userId, int userIndex)
{
if (userIndex != playerIndex)
return;
}
}