如何多次旋转对象?

时间:2018-01-16 21:13:37

标签: c# unity3d

所以我试图在按键上旋转一个物体(如果我按下“a”向左旋转90度,如果我按“d”向右旋转90度)。 我不能让它工作,我已经尝试了一些东西,但我最终没有解决问题。正如您将在下一个示例中看到的那样,我只想出如何旋转到90度,而不是更多或更少,我实际上想要将对象旋转90度,从当前的任何程度开始。例如: 从90度到180度 从23度到113度等等...... 这是我的代码:

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class ModuleBehaviour : MonoBehaviour {

    public bool rotating = false;


    private void Update()
    {
        if (rotating)
        {
            RotatePlatform();
        }
    }

    private void RotatePlatform()
    {
        Vector3 target = new Vector3(0,0,90);
        if (transform.eulerAngles.z > 90)
        {
            transform.rotation = Quaternion.Euler(target);

        }
        transform.Rotate(target * Time.deltaTime);
    }
}

(不要担心rotating变量,我在另一个脚本中更改它,每当我按下“d”键时它都是真的。我只需要知道如何向正确的方向旋转,之后我会弄明白如何申请左转)

谢谢;

2 个答案:

答案 0 :(得分:2)

这将做你想要的:

private IEnumerator RotatePlatform(float dir) {
    Vector3 target = new Vector3(0, 0, (transform.eulerAngles.z + dir + 360) % 360);
    while(Mathf.Abs(transform.eulerAngles.z - target.z) >= Mathf.Abs(dir * Time.deltaTime * 2)) {
        transform.Rotate(new Vector3(0,0,dir) * Time.deltaTime);
        yield return null;
    }
    transform.eulerAngles = target;
    rotating = false;
}

要从中剔除的关键事项是,我将其封装为“#34;使其具有动画效果"将代码转换为协程,以便对象从任何开始旋转旋转到所需方向 方向上的任何旋转。这样做的原因是协同程序的局部变量在迭代之间保持其状态(Unity计划任务系统将停止在yield指令上执行代码并在以后恢复:在这种情况下,{ {1}}表示它将在下一帧继续)。通过这种方式,我们可以存储起始旋转和目标旋转,而无需做任何疯狂的事情。

通过获取当前旋转,添加旋转量,然后使该值位于0-360:null内来实现此目的。 transform.eulerAngles.z + dir + 360) % 360已经是[0,360],减去 90将离开[-90,270],然后加上360我们确保该值始终大于0(不影响结果)角度),然后transform.eulerAngles.z有效地减去任何多余的360.

% 360语句检查我们还没有旋转"距离"是"大于我们将按"旋转的数量。有一些缓冲:我们不想超越,并且我们需要走多远#34;是358度!

另一个重要的变化是,我们希望使用Mathf.Abs(transform.eulerAngles.z - target.z) >= Mathf.Abs(dir * Time.deltaTime * 2)而不是new Vector3(0,0,dir)作为我们的值来旋转 ,以便速度保持不变。

最后2条指令确保旋转实际上达到了所需的值,当然,切换回bool跟踪是否按键做任何事情(我们只需要1个协程实例)。

然后是我用来控制它的target方法:

Update()

答案 1 :(得分:0)

要向另一个方向旋转,请减去90。

void Update()
{
    if (Input.GetKeyDown(KeyCode.D))
        transform.Rotate(0, 0, transform.rotation.z + 90);
}