确定在 Unity C# 中顺时针或逆时针旋转是否更快
本文关键字:旋转 逆时针 是否 顺时针 Unity | 更新日期: 2023-09-27 18:35:40
我正在用Unity编写一个C#脚本,试图在我的自上而下的游戏中使宇宙飞船旋转以面对鼠标位置。但是,由于某种原因,我遇到了麻烦,我不确定问题是什么。 基本上,如果飞船面对一个小的正角度,比如 10 度,而鼠标在 350 度,飞船应该顺时针旋转,因为这是更快的方式。飞船旋转的方向是正确的,除了这种情况(当你的飞船在水平上方,鼠标在下方时)。
这是一个视觉示例,说明在这种情况下我想要什么,与会发生什么。链接: https://i.stack.imgur.com/V9EaC.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);
}
我确信有一些非常明显的东西,但我在这里处于我的智慧尽头。任何建议将不胜感激!
计算sin(currentAngle - targetAngle)
. 如果为正,则当前角度需要顺时针移动。 如果正弦为负,则当前角度需要逆时针移动。 如果为零,则两个角度相同或 180° 相反。 即使角度未归一化为 [0,360,这也有效。