kinectで手を振る反応をとってUnity内のオブジェクトに作用させる方法

〇手順として
1,unityとkinectを通信できる状態にする
2,kinectが取得した関節の位置をunityでとる
3,Unity内での関節の移動に応じてフラグを立てる
4,スクリプト間で値を共有する
5,フラグを確認してCubeのテクスチャを変更する

〇1
このサイトを参考にしました
https://qiita.com/yuzupon/items/4528f7fc09a42fb8af2e
しかし、Kinect.2.0.1410.19000というものが必要なのですがUnityでは配布されていないようでした。
なので
http://believeinyourself.hateblo.jp/entry/2014/11/03/083847
ここからダウンロードします。

Unity内にすべてインポートします。



〇2
これに沿って進めます。
https://qiita.com/romaroma/items/b2f48daecaffb112e8e3
実行中にCubeが生成されます。
Project画面から値をとりたい部分のCubeをクリックし名前を確認します
(右手首の場合"WristRight")

〇3
これを参考に座標をとりました。取れました。
https://qiita.com/haifuri/items/cec28c764eebbc9bae0b
私はd=X2-X1(距離d,座標X2X1)として、ある一定以上の動きがあったら作動するようにしました。

〇4
これを参考にしました
https://qiita.com/tsukasa_wear_parker/items/09d4bcc5af3556b9bb3a
スクリプト名と参照する値は自分のものを用いました

〇5
参考にしたURL
https://qiita.com/ryusukefuda/items/b45a88d860dcd55e057b


私の今のところのソースコードを参考として貼り付けます。

サーバーはこんな感じ

```cs
using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class PlanA : MonoBehaviour {
    int i = 0;
    public float split　; //平均化に使われるやつ
    public bool start = false; //開始するためのもの
    float movex = 0f; //Xの移動量を求めるため
    float position = 0f; //初期位置
    // Use this for initialization

    void Start () {
        start = false;
        Debug.Log("start=" + start);

    }
	
	// Update is called once per frame
	void Update () {
 
        //座標取得
        Vector3 tmp = GameObject.Find("WristRight").transform.position;
        float x = tmp.x;
        float y = tmp.y;
        float z = tmp.z;
        //   Debug.Log(x);//値が来ているか確認


        //これから動きの値と閾値を作りたい
        //X=X2-X1で動いた距離を求めて閾値を作りたい
        float averagex1 = 0f; //平均化するための道具
        float allx1 = 0f;//平均化
        //移動量平均化処理
        for (i = 0; i < split; i++)
        {
            allx1 = allx1 + x;
        }

        averagex1 = allx1 / split;
       //    Debug.Log("averagex1="+averagex1);//チェック用

        //次にX2を取得
        float averagex2 = 0f;
        float allx2 = 0f;
        //移動量平均化処理
        for (i = 0; i < split; i++)
        {
            allx2 = allx2 + x;
        }

        averagex2 = allx2 / split;

        //  Debug.Log("averagex2=" + averagex2);//チェック用

   

        //位置の移動を測定をする

        movex = averagex2 - position;//最終的に、前回のフレームよりもどれだけ動いているかどうかにすることにした。
        position = averagex2;
    //  Debug.Log("start=" + start);
       //  Debug.Log("movex=" + movex); //チェック用
        if (y>1){//高さ判定
            if (movex > 0.2 || movex < -0.2) //少し動くと反応してくれる
            {
                //  Debug.Log("movex=" + movex);
            //    Debug.Log("(・∀・)ｲｲ!!");
               start = true;
            //    Debug.Log("flag1=" + start);
            }
        }
    }
    


}

```

レシーバーはこんな感じ

```cs

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class test : MonoBehaviour {
    float time;//時間計測
    public GameObject myCube;
    GameObject GameObject;
    PlanA script;
    // Use this for initialization
    void Start () {
        time = 0;
        GameObject = GameObject.Find("GameObject"); //Unityちゃんをオブジェクトの名前から取得して変数に格納する
        script = GameObject.GetComponent<PlanA>(); //unitychanの中にあるUnityChanScriptを取得して変数に格納する
    }

    // Update is called once per frame
    void Update() {
        time += Time.deltaTime;//毎フレームの時間を加算.
        bool go = script.start;//startとGoをつなげている
       Debug.Log("Go=" + go);
        if (time > 3)　//初期起動時のブレの補正
        { 
            if (go==true)
            {
                myCube = GameObject.Find("Cube");
                myCube.GetComponent<Renderer>().material.color = Color.yellow;
            }
         }
        

	}
}
```

作ったものの動画はこんな感じ
https://twitter.com/treck_treck/status/1042406087578664961