【问题标题】:Unity2D rotation issueUnity2D旋转问题
【发布时间】:2020-02-04 17:58:29
【问题描述】:

我正在尝试在我的游戏中添加一个降落伞,我需要它向右旋转 45 度,然后向左旋转 45 度并保持交替,下面是我需要如何工作的图表

我正在使用的代码如下,但是它只在一侧有效,然后不会返回。

        if (maxRotation <= transform.rotation.eulerAngles.z)
        {
            rotatingRight = false;
        }else if(minRotation <= transform.rotation.eulerAngles.z)
        {
            rotatingRight = true;
        }

        transform.Translate(Vector2.down * fallSpeed * Time.deltaTime);

        if (rotatingRight)
        {
            transform.Rotate(Vector3.forward * 45 * Time.deltaTime);
        }
        else
        {
            transform.Rotate(Vector3.forward * -45 * Time.deltaTime);
        }

【问题讨论】:

  • 更改为else if(minRotation &gt;= transform.rotation.eulerAngles.z)。请注意 &gt;= 与您的 &lt;=

标签: c# unity3d euler-angles


【解决方案1】:

正如 3Dave 在 cmets 中所说,主要是当 minRotation 大于或等于 eulerAngles 时,您应该向右旋转。

if (maxRotation <= transform.rotation.eulerAngles.z)
{
    rotatingRight = false;
} else if (transform.rotation.eulerAngles.z <= minRotation)
{
    rotatingRight = true;
}

transform.Translate(Vector2.down * fallSpeed * Time.deltaTime);

if (rotatingRight)
{
    transform.Rotate(Vector3.forward * 45 * Time.deltaTime);
}
else
{
    transform.Rotate(Vector3.forward * -45 * Time.deltaTime);
}

我现在意识到这个答案的先前版本不必要地令人费解,但现在我无法删除它,因为它已被接受。这个问题只是由一个错字引起的。

【讨论】:

    【解决方案2】:

    我可以通过这样做来解决它

            if (maxRotation == Math.Round(transform.rotation.eulerAngles.z))
            {
                rotatingRight = false;
            }else if(minRotation == Math.Round(transform.rotation.eulerAngles.z))
            {
                rotatingRight = true;
            }
    
            transform.Translate(Vector2.down * fallSpeed * Time.deltaTime);
    
            if (rotatingRight)
            {
                transform.Rotate(Vector3.forward * rotationSpeed * Time.deltaTime);
            }
            else
            {
                transform.Rotate(Vector3.back * rotationSpeed * Time.deltaTime);
            }
    

    【讨论】:

    • 请不要这样做 - 如果在错误的时间出现延迟峰值,导致 Time.deltaTime 很大,您可能会旋转超过 minRotationmaxRotation。你不能保证它不会超过maxRotation或低于minRotation,所以它会永远向一个方向旋转。
    • 啊,我明白了,你有没有办法解决我如何以适当的方式实现这一目标?
    • 我的回答很好,但最好的方法之一是使用 Mathf.PingPong 之类的方法来获取您需要该框架的 z eulerAngle
    【解决方案3】:

    您的代码可以大大简化。您实际上不需要布尔值来查看您是否正确。如果是第一个就做,不需要第二个。此外,您很有可能会减少可能出现的错误数量,就像这里您的布尔值并不总是您认为的那样。

    float rotationValue = 45;
    
    if(transform.rotation.eulerAngles.z >= maxRotation)
    {
        rotationValue = -45;
    }
    else if(transform.rotation.eulerAngles.z <= minRotation)
    {
        rotationValue = -45;
    }
    
    transform.Translate(Vector2.down * fallSpeed * Time.deltaTime);
    
    
    transform.Rotate(Vector3.forward, rotationValue * Time.deltaTime);
    

    【讨论】:

    • 现在,当它在最小和最大旋转之间时,它总是会向右旋转
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-11-01
    • 1970-01-01
    • 1970-01-01
    • 2013-09-20
    • 2011-04-10
    相关资源
    最近更新 更多