【问题标题】:How do I change the rotation of a directional light? (C#, Unity 5.5)如何更改定向灯的旋转? (C#,统一 5.5)
【发布时间】:2017-08-09 12:13:29
【问题描述】:

我正在尝试让我的定向灯以恒定速度旋转。这是我的代码:

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);
    }
}

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

这是我运行游戏前灯的旋转(应该是开始位置):

一旦游戏开始,它就会变成(并停留在)这样的:

【问题讨论】:

    标签: c# unity3d unity5 light euler-angles


    【解决方案1】:

    不妨试试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;
        }
    }
    

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

    【讨论】:

    • 当我改变 Y 和 Z 轴旋转时,它们工作正常并继续旋转,但 X 轴上的旋转停止在 90º 和 -90º。有什么想法吗?
    • 没有看到更多代码。我建议接受这个答案,因为它确实像我所说的那样轮换。发布一个新问题。
    • 有机会对此进行测试。使它更完整,但功能保持不变。无论方向如何,它都适用于所有 3 轴。
    • 我对 C# 还很陌生,并不真正知道要调整哪些值才能使其移动。请您指出正确的方向吗?
    • 在检查器中,您可以在其中将 c# 脚本作为组件添加到灯光中。将有 3 个值,一个是速度编号,一个轴组合框 x、y 或 z,以及方向一个复选框。这些可以在玩游戏时更改,以查看效果。它会更容易看到,如果你将脚本添加到一个立方体,你会看到它在任何方向旋转都很好。
    【解决方案2】:

    您缺少旋转中的 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

    我推荐第二个。

    【讨论】:

    猜你喜欢
    • 2021-05-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-07-07
    • 1970-01-01
    • 2020-11-09
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多