//2つの座標値を与えて距離返す private float Kyori(UiPoint ff, UiPoint vv) { double kyori; float x1x2 = ff.x - vv.x; float z1z2 = ff.z - vv.z; decimal x1x2de = (decimal)MinusDeletef(x1x2); decimal z1z2de = (decimal)MinusDeletef(z1z2); double x1x2do = decimal.ToDouble(x1x2de); double z1z2do = decimal.ToDouble(z1z2de); kyori = Math.Sqrt((x1x2do) * (x1x2do) + (z1z2do) * (z1z2do)); return((float)kyori); }
void UIProcessing() { int itr = 0; while (itr < ikisakis.Count) { //ikisakis(リスト)をikisakiTに格納 ikisakiT = ikisakis[itr]; //Kakudoメソッド:座標間の角度を出す double kakudo = Kakudo(position, ikisakiT); //UIZahyouメソッド:initialpositionからkakudoの角度の直線状の位置を出す UiPoint ui = UIZahyou(kakudo, position); //UI座標から次の端点を検索するためのリストに追加 sentakus.Add(new Sentaku(-ui.x, ui.z, ikisakiT.x, ikisakiT.z)); //UI判定用のリストにUIの範囲を追加 uiv.Add(new Vector3(-ui.x, 1.5f, ui.z)); itr++; } }
//手の座標とUIのリストから距離を計算し、rで指定した値より距離が小さい場合(手がUIに一定距離近づいたら)trueで //uinに、近づいたUIの座標値を格納する private bool CollisionDetection(Vector3 fingerposition, List <Vector3> uiv) { int i = 0; while (i < uiv.Count) { UiPoint ff = new UiPoint(fingerposition.x, fingerposition.z); UiPoint vv = new UiPoint(uiv[i].x, uiv[i].z); float p = Kyori(ff, vv); float r = 0.1f; if (p <= r) { uin = new Vector3(uiv[i].x, uiv[i].y, uiv[i].z); return(true); } i++; } return(false); }
//座標と角度からdistanceで指定した距離分離れている場所の座標を返す private UiPoint UIZahyou(double kakudo, Tanten sentakumichi) { UiPoint ui; double x1 = sentakumichi.x; double z1 = sentakumichi.z; double distance = 0.3; double x1t = Math.Cos(kakudo) * distance; double z1t = Math.Sin(kakudo) * distance; float x1f = (float)x1t + (float)x1; float z1f = (float)z1t + (float)z1; ui = new UiPoint(x1f, z1f); return(ui); }
// Use this for initialization void Start() { genzaichi = new Tanten(-334, 325); //genzaichiのx座標を絶対値化する処理 genzaichi = MinusDelete(genzaichi); //Ikisakiメソッド:genzaichiをroadsリストから検索 //続き:繋がっている端点をikisakis(リスト)に格納 ikisakis = Ikisaki(genzaichi, roads); //選択肢UIを表示 //交差点から選択肢それぞれが距離:2の位置に表示 int itr = 0; while (itr < ikisakis.Count) { //ikisakis(リスト)をikisakiTに格納 ikisakiT = ikisakis[itr]; //Kakudoメソッド:座標間の角度を出す double kakudo = Kakudo(genzaichi, ikisakiT); //UIZahyouメソッド:genzaichiからkakudoの角度の直線状の位置を出す UiPoint ui = UIZahyou(kakudo, genzaichi); //UI座標を検索するためのリストに追加 sentakus.Add(new Sentaku(-ui.x, ui.z, ikisakiT.x, ikisakiT.z)); //UI判定用のリストにUIの範囲を追加 uiv.Add(new Vector3(-ui.x, 1.5f, ui.z)); //////uiに格納されている座標(端点)に選択肢UIを表示 Instantiate(uis, new Vector3(-ui.x, 1.5f, ui.z), Quaternion.identity); itr++; } }
// Update is called once per frame void Update() { //LeapMotionで選択 //手の座標取得 Vector3 fingerposition; fingerposition = hand_position; //判定処理 bool uipointr = CollisionDetection(fingerposition, uiv); if (uipointr == true) { //sentakusリストからUI座標を検索して選択した端点を返す sentakumichi = SelectionSearch(uin, sentakus); } //sentakumichiのx座標を絶対値化する処理 sentakumichi = MinusDelete(sentakumichi); //Ikisakiメソッド:sentakumichiをroadsリストから検索 //続き:繋がっている端点をikisakis(リスト)に格納 ikisakis = Ikisaki(sentakumichi, roads); //KousatenHantenメソッドから交差点or中点or行き止まりorエラーを判定 k = KousatenHanten(ikisakis); //中点時の処理 //未Debug while (k == 0) { int it = 0; while (it < ikisakis.Count) { if (genzaichi.x != ikisakis[it].x && genzaichi.z != ikisakis[it].z) { sentakumichi = ikisakis[it]; } it++; } ikisakis = Ikisaki(sentakumichi, roads); k = KousatenHanten(ikisakis); } //MinusAddメソッド:sentakumichiのx座標にマイナスを付ける処理 sentakumichi = MinusAdd(sentakumichi); //Debug.Log(sentakumichi.x + "," + sentakumichi.z); //ナビゲーションシステムで移動する処理(Unity) // NavMeshAgentを取得して var agent = GetComponent <NavMeshAgent>(); //sentakumichi座標をgoal(行き先)に格納し、NavMeshAgentに目的地を取得させる Vector3 goal; goal = new Vector3(sentakumichi.x, 1.5f, sentakumichi.z); agent.destination = goal; GameObject[] uid = GameObject.FindGameObjectsWithTag("target"); foreach (GameObject obj in uid) { GameObject.Destroy(obj); } //現在地を取得してgenzaichiに格納(Unity) //IntCastメソッド:transform.positionをint型にキャストする Tanten tugimichi = IntCast(transform.position.x, transform.position.z); //genzaichiのx座標を絶対値化する処理 tugimichi = MinusDelete(tugimichi); //Ikisakiメソッド:genzaichiをroadsリストから検索 //続き:繋がっている端点をikisakis(リスト)に格納 ikisakis = Ikisaki(tugimichi, roads); //選択肢UIを表示 //交差点から選択肢それぞれが距離:2の位置に表示 int itr = 0; sentakus.Clear(); uiv.Clear(); while (itr < ikisakis.Count) { //ikisakis(リスト)をikisakiTに格納 ikisakiT = ikisakis[itr]; //Kakudoメソッド:座標間の角度を出す double kakudo = Kakudo(tugimichi, ikisakiT); //UIZahyouメソッド:genzaichiからkakudoの角度の直線状の位置を出す UiPoint ui = UIZahyou(kakudo, tugimichi); //UI座標を検索するためのリストに追加 sentakus.Add(new Sentaku(-ui.x, ui.z, ikisakiT.x, ikisakiT.z)); //UI判定用のリストにUIの範囲を追加 uiv.Add(new Vector3(-ui.x, 1.5f, ui.z)); itr++; } UiSummoning(uiv); ikisakis.Clear(); }
IEnumerator move() { if (isRunning) { yield break; } isRunning = true; //sentakumichiのx座標を絶対値化する処理 sentakumichi = MinusDelete(sentakumichi); //Ikisakiメソッド:sentakumichiをroadsリストから検索 //続き:繋がっている端点をikisakis(リスト)に格納 ikisakis = Ikisaki(sentakumichi, roads); //KousatenHantenメソッドから交差点or中点or行き止まりorエラーを判定 k = KousatenHanten(ikisakis); int vvv = 0; while (vvv < ikisakis.Count) { Debug.Log(ikisakis[vvv].x + "," + ikisakis[vvv].z + "," + vvv); vvv++; } //中点時の処理 //未Debug while (k == 0) { int vc = 0; int it = 0; while (it < ikisakis.Count) { if (sentakumichi.x != ikisakis[it].x && sentakumichi.z != ikisakis[it].z && (imaichi.x != ikisakis[it].x && imaichi.z != ikisakis[it].z)) { sentakumichi = ikisakis[it]; break; } Debug.Log(imaichi.x + "," + imaichi.z); Debug.Log("選択" + sentakumichi.x + "," + sentakumichi.z); it++; } ikisakis = Ikisaki(sentakumichi, roads); k = KousatenHanten(ikisakis); break; } imaichi = sentakumichi; //MinusAddメソッド:sentakumichiのx座標にマイナスを付ける処理 sentakumichi = MinusAdd(sentakumichi); //Debug.Log(sentakumichi.x +"," + sentakumichi.z); //ナビゲーションシステムで移動する処理(Unity) // NavMeshAgentを取得して var agent = GetComponent <NavMeshAgent>(); //sentakumichi座標をgoal(行き先)に格納し、NavMeshAgentに目的地を取得させる Vector3 goal; goal = new Vector3(sentakumichi.x, 1.5f, sentakumichi.z); agent.destination = goal; ikisakis.Clear(); //genzaichiのx座標を絶対値化する処理 tugimichi = MinusDelete(sentakumichi); //Ikisakiメソッド:genzaichiをroadsリストから検索 //続き:繋がっている端点をikisakis(リスト)に格納 ikisakis = Ikisaki(tugimichi, roads); //交差点から選択肢それぞれが距離:2の位置に表示 int itr = 0; sentakus.Clear(); uiv.Clear(); while (itr < ikisakis.Count) { //ikisakis(リスト)をikisakiTに格納 ikisakiT = ikisakis[itr]; //Kakudoメソッド:座標間の角度を出す double kakudo = Kakudo(tugimichi, ikisakiT); //UIZahyouメソッド:genzaichiからkakudoの角度の直線状の位置を出す UiPoint ui = UIZahyou(kakudo, tugimichi); //UI座標を検索するためのリストに追加 sentakus.Add(new Sentaku(-ui.x, ui.z, ikisakiT.x, ikisakiT.z)); //UI判定用のリストにUIの範囲を追加 uiv.Add(new Vector3(-ui.x, 1.5f, ui.z)); itr++; } UiSummoning(uiv); ikisakis.Clear(); isRunning = false; yield return(null); }