确定Unity C中顺时针或逆时针旋转是否更快#

时间:2014-12-29 00:03:51

标签: c# unity3d rotation

我正在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);
        } 

我确信有一些非常明显的事情,但我在这里结束了我的目击。任何建议将不胜感激!

1 个答案:

答案 0 :(得分:2)

计算sin(currentAngle - targetAngle)。如果是正数,则currentAngle需要顺时针移动。如果正弦为负,则currentAngle需要逆时针移动。如果它为零,则两个角度相同或相反180°。即使角度未标准化为[0,360],这也可以。