确定在 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);
        } 

我确信有一些非常明显的东西,但我在这里处于我的智慧尽头。任何建议将不胜感激!

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

计算sin(currentAngle - targetAngle) . 如果为正,则当前角度需要顺时针移动。 如果正弦为负,则当前角度需要逆时针移动。 如果为零,则两个角度相同或 180° 相反。 即使角度未归一化为 [0,360,这也有效。