void Update() { if (PereferalTest.targetIsFront) { GameObject test = UnityTargetRotation.GetTempTargetArray(); //探索対象のオブジェクトの2次元位置を求める var target2dpos = Camera.main.WorldToScreenPoint(test.transform.position); //カメラの視野をpixelで求める //Debug.Log("target2dpos: " + target2dpos + " camWidth: " + camWidth + " camHeight: " + camHeight); //視野の-paramFOVpxから,+paramFOVpxまでの範囲にGameObjectが入っているかどうかを確認 if (-paramFOV <= target2dpos.x && target2dpos.x <= camWidth + paramFOV && -paramFOV <= target2dpos.y && target2dpos.y <= camHeight + paramFOV) { //Debug.Log("target is in the FOV"); //この場合、中心視を使う if (UnityTargetRotation.phase != 2 && (PlayModeSelecter.GetMode() == 4 || PlayModeSelecter.GetMode() == 0)) { //if (PereferalTest.targetIsFront) //PereferalTest.arrow.SetActive(true); } //周辺視をOFF //SockertSend.SetDirectionFlag(false); UnityTargetRotation.viewPortFlag = true; } else { //Debug.Log("target is not in the FOV"); //この場合、周辺視を使う UnityTargetRotation.viewPortFlag = false; //PereferalTest.arrow.SetActive(false); //周辺視をON if (PlayModeSelecter.GetMode() == 2 || PlayModeSelecter.GetMode() == 4 || PlayModeSelecter.GetMode() == 0) { //SockertSend.SetDirectionFlag(true); ; } else { ; } //SockertSend.SetDirectionFlag(false); } } }
public static string GetDirection() { try { GameObject test = UnityTargetRotation.GetTempTargetArray(); string direction = null; //探索対象のオブジェクトの2次元位置を求める var target2dpos = Camera.main.WorldToScreenPoint(test.transform.position); //カメラの投影平面上の中心点と対象オブジェクトの2点間の角度を求め、方向を決定する float directionX = target2dpos.x - centerX; float directionY = target2dpos.y - centerY; float radian = Mathf.Atan2(directionY, directionX) * Mathf.Rad2Deg; //Unityのワールド座標のy軸に対してのCameraの回転を求める float angle = Camera.main.transform.transform.localEulerAngles.y; //カメラの位置とターゲットの位置の角度を求める float targetX = UnityTargetRotation.GetTempTargetArray().transform.position.x - Camera.main.transform.position.x; float targetZ = UnityTargetRotation.GetTempTargetArray().transform.position.z - Camera.main.transform.position.z; float targetR = Mathf.Atan2(targetZ, targetX) * Mathf.Rad2Deg; if (targetR < 0) { targetR += 360; //マイナスのものは360を加算 } if (radian < 0) { radian += 360; //マイナスのものは360を加算 } /* * angleの回転方向と角度を補正し、targetRと合わせる * 補正前: angle → 時計の12の方向から、右回り → targetR 時計の3時の方向から、左回り * 補正後: angle&targetR → 時計の3時の方向から、左回り */ angle = 360 - angle; if (0 < angle && angle < 270) { angle += 90; } else { angle = 90 - (360 - angle); } //Debug.Log("targetR: " + targetR + ", angle: " + angle); //angleよりtargetRのほうが角度が大きい時 if (angle - targetR >= 0) { if (angle - targetR < 90 || angle - targetR > 270) { targetIsFront = true; } else { targetIsFront = false; } } else { if (targetR - angle < 90 || targetR - angle > 270) { targetIsFront = true; } else { targetIsFront = false; } } //Debug.Log("targetIsFront:"+targetIsFront); //Debug.Log("Radian:" + radian); if (targetIsFront) { //方向判定 if (radian <= 22.5f || radian > 337.5f) { direction = "right"; } else if (radian <= 67.5f && radian > 22.5f) { direction = "upperRight"; } else if (radian <= 112.5f && radian > 67.5f) { direction = "up"; } else if (radian <= 157.5f && radian > 112.5f) { direction = "upperLeft"; } else if (radian <= 202.5f && radian > 157.5f) { direction = "left"; } else if (radian <= 247.5f && radian > 202.5f) { direction = "downerLeft"; } else if (radian <= 292.5f && radian > 247.5f) { direction = "down"; } else if (radian <= 337.5f && radian > 292.5f) { direction = "downerRight"; } } else { if (angle - targetR >= 0) { if (90 <= angle - targetR && angle - targetR <= 180) { direction = "TurnRight"; } else { direction = "TurnLeft"; } } else { if (90 <= targetR - angle && targetR - angle <= 180) { direction = "TurnLeft"; } else { direction = "TurnRight"; } } } //Debug.Log(direction); //Debug.Log(targetIsFront); return(direction); } catch (System.NullReferenceException) { return("null"); } }