如何更改定向灯的旋转? (C#,Unity 5.5)

时间:2017-03-17 19:46:23

标签: c# unity3d unity5 light euler-angles

我试图使我的定向光以恒定速度旋转。这是我的代码:

using System.Collections;
using UnityEngine;

public class LightRotator : MonoBehaviour {

    void Update () {
        transform.rotation = Quaternion.Euler(transform.rotation.x, transform.rotation.y + 1.0f, transform.rotation.z);
    }
}

然而,这只是将光线放在一个奇怪的地方并将其留在那里。我做错了什么?

这是在我运行游戏之前旋转灯光(应该是开始位置): Start Position

游戏开始后,它会变为(并保持): Wrong Position

2 个答案:

答案 0 :(得分:0)

也许试试transform.localEulerAngles

transform.localEulerAngles = new Vector3(transform.localEulerAngles.x, 
           transform.localEulerAngles.y + 1.0f, transform.localEulerAngles.z);

但是我建议您添加Time.deltaTime,否则您的灯会以运行它的计算机的帧速率旋转。因此,如果您想要一个恒定的速度,请按该值修改它。

我已编辑以下内容以制作完整的示例。 OP在一个轴上说它在某种程度上停止了。我已经扩展了这个以显示以下代码,它将适用于任何轴和任何方向,可在运行时修改。

using UnityEngine;

public class rotate : MonoBehaviour {

    public float speed = 100.0f;
    Vector3 angle;
    float rotation = 0f;
    public enum Axis
    {
        X,
        Y,
        Z
    }
    public Axis axis = Axis.X;
    public bool direction = true;

    void Start()
    {
        angle = transform.localEulerAngles;
    }

    void Update()
    {
        switch(axis)
        {
            case Axis.X:
                transform.localEulerAngles = new Vector3(Rotation(), angle.y, angle.z);
                break;
            case Axis.Y:
                transform.localEulerAngles = new Vector3(angle.x, Rotation(), angle.z);
                break;
            case Axis.Z:
                transform.localEulerAngles = new Vector3(angle.x, angle.y, Rotation());
                break;
        }
    }

    float Rotation()
    {
        rotation += speed * Time.deltaTime;
        if (rotation >= 360f) 
            rotation -= 360f; // this will keep it to a value of 0 to 359.99...
        return direction ? rotation : -rotation;
    }
}

然后,您可以在运行时修改速度,轴和方向,以找到适合您的方法。虽然在你停止游戏之后一定要再次设置它,因为它不会被保存。

答案 1 :(得分:0)

您缺少旋转中的W组件,这导致代码中出现问题。试试这个:

transform.rotation = Quaternion.Euler(transform.eulerAngles.x, 
                                      transform.eulerAngles.y + 1.0f,
                                      transform.eulerAngles.z);

另外,请看一下这些:

http://answers.unity3d.com/questions/123827/transformrotate-stuck-at-90-and-270-degrees.html http://answers.unity3d.com/questions/187073/rotation-locks-at-90-or-270-degrees.html

我推荐第二个。