Я пишу сценарий C # в Unity, пытаясь заставить космический корабль в моей нисходящей игре повернуться лицом к положению мыши. Однако по какой-то причине у меня проблемы, и я не уверен, в чем проблема. В принципе, если корабль смотрит под небольшим положительным углом, скажем, 10 градусов, а мышь находится под углом 350 градусов, корабль ДОЛЖЕН вращаться по часовой стрелке, потому что это более быстрый путь. Корабль вращается в правильном направлении, за исключением этого одного случая (когда ваш корабль находится выше горизонтали, а ваша мышь находится внизу).
Это наглядный пример того, что я хочу в данном случае, и того, что происходит. Ссылка: https://i.imgur.com/lvmzd68.png
Это метод, который должен возвращать истину, если вращение против часовой стрелки будет быстрее, чем вращение по часовой стрелке.
bool turnCounterFaster() {
//Returns true if turning left would be faster than turning right to get to the ideal angle
float targetAngle = getAngleToMouse ();
float currentAngle = rigidbody2D.rotation;
while (currentAngle > 360f) {
//Debug.Log ("Current angle was "+currentAngle);
currentAngle -= 360f;
//Debug.Log ("now is:"+currentAngle);
}
if (targetAngle < currentAngle) {
//It's possible the target angle is a small angle, if you're a large angle it's shorter to turn counterclokwise
float testDiff = Mathf.Abs((targetAngle+360) - currentAngle);
if(testDiff < Mathf.Abs (targetAngle-currentAngle)){
//Turning counter clockwise is faster
//Debug.Log ("(false) edge case Current "+currentAngle+" target "+targetAngle);
return false;
}
//Debug.Log ("(true) target < current Current "+currentAngle+" target "+targetAngle);
return true;
}
return false;
}
И это метод, который определяет угол между игроком и мышью. Оба эти сценария прикреплены к объекту игрока.
float getAngleToMouse(){
Vector3 v3Pos;
float fAngle;
// Project the mouse point into world space at
// at the distance of the player.
v3Pos = Input.mousePosition;
v3Pos.z = (transform.position.z - Camera.main.transform.position.z);
v3Pos = Camera.main.ScreenToWorldPoint(v3Pos);
v3Pos = v3Pos - transform.position;
fAngle = Mathf.Atan2 (v3Pos.y, v3Pos.x) * Mathf.Rad2Deg;
if (fAngle < 0.0f)
fAngle += 360.0f;
//Debug.Log ("ANGLE: "+fAngle + " and ship angle: "+rigidbody2D.rotation);
return fAngle;
}
И это сценарий, который фактически заставляет корабль поворачиваться в любом направлении. Метод addTurnThrust работает правильно, я протестировал его с вводом с клавиатуры и не заметил никаких проблем.
if (turnCounterFaster() == false) {
addTurnThrust(turnAcceleration,true);
} else {
addTurnThrust(-1*turnAcceleration,true);
}
Я уверен, что есть что-то невероятно очевидное, но я здесь на грани остроумия. Любой совет будет очень признателен!