一、(作者首先想到的是通过动态添加AvatarController组件去实现这个功能,哈哈,果不其然没成功)
第一种方法是设置这个 Player Calibration Pose,属性选择Tpose,
或者直接在初始化的时候设置(manager 是 KinectManager的对象)
manager.playerCalibrationPose = KinectGestures.Gestures.Tpose;
但是如果你是多场景的情况下需要检测没人的情况下跳回到待机界面,这种方法并不可行,因为在你没做 Tpose 的动作前,Kinect 是不识别人的,很遗憾的是我就是用了第一种方法,苦逼的作者又只能尝试第二种方法,索性成功了
二、
不多啰嗦了,方法都在注释里,额,有点Kinect 的基础的人自然能看懂(这代码是从第二次修改的,还有很多乱七八糟的代码,像Udp异步发送的代码就当看不见吧)
using System.Collections;
using System.Collections.Generic;
using System.IO;
using System.Text;
using UnityEngine;
using UnityEngine.SceneManagement;
public class SaintSeiyaScr : MonoBehaviour {
TposeGestureListener gestureListener;
KinectManager manager;
AvatarController ctr;
float timer = 0f;
bool ok;
// Use this for initialization
void Start () {
manager = KinectManager.Instance;
// manager.playerCalibrationPose = KinectGestures.Gestures.Tpose;
gestureListener = TposeGestureListener.Instance;
ctr = transform.GetComponentInChildren<AvatarController>();
// 初始化的时候 将 Avatar的识别用户改成 !0 这里为了避免万一刚好有了两个人,
//模型跟着第二个人动,所以讲 playerindex 设置的大一点
ctr.playerIndex = 5;
}
// Update is called once per frame
void Update () {
if (!gestureListener)
{
print("没有进来 你他妈真的烦");
return;
}
if (gestureListener.IsTpose())
{
print("isTpose");
//transform.gameObject.AddComponent<AvatarController>();
// 当玩家做出 Tpose 的动作的时候 ,将AvatarController 的 playerIndex 重新设置成 0
// 光是这样还不行,你还需要刷新它的 Avatar 即下面的那个方法 ctr.UpdateAvatar(manager.GetPrimaryUserID());
ctr.playerIndex = 0;
ok = true;
}
if (ok)
{
// 如果 UpdateAvatar()这个方法不放在 Update 里它只会执行一次就不再执行了
// 感觉这个属性有点类似 u3d 物体移动的 transform.translate 属性
ctr.UpdateAvatar(manager.GetPrimaryUserID());
timer += Time.deltaTime;
if (timer >= 10f)
{
ok = false;
}
}
if (gestureListener.IsPush())
{
print("--------------->push");
UDPClient1Msg.Instance.SendMsg("STATE-FIGHTTRUE");
}
}
void OnDestroy()
{
KinectManager manager = KinectManager.Instance;
if (manager)
{
manager.playerCalibrationPose = KinectGestures.Gestures.None;
}
}
}