我正在Unity写一个C#脚本,试图让我的自上而下游戏中的宇宙飞船旋转以面向鼠标位置。出于某种原因,我遇到了麻烦,但我不确定问题是什么。基本上,如果船面向一个小的正角度,比如10度,而鼠标是350度,船应该顺时针旋转,因为这是更快的方式。除了在这种情况下(当您的船在水平线上方并且您的鼠标在下方时),船只会旋转正确的方向。
这是我在这种情况下想要的一个直观的例子,与发生的事情相比。链接:http://i.imgur.com/lvmzd68.png
如果逆时针旋转比顺时针旋转更快,这个方法应该返回true。
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);
}
我确信有一些非常明显的事情,但我在这里结束了我的目击。任何建议将不胜感激!
答案 0 :(得分:2)
计算sin(currentAngle - targetAngle)
。如果是正数,则currentAngle需要顺时针移动。如果正弦为负,则currentAngle需要逆时针移动。如果它为零,则两个角度相同或相反180°。即使角度未标准化为[0,360],这也可以。