Как изменить вращение направленного света? (C#, Unity 5.5)

Я пытаюсь заставить мой направленный свет вращаться с постоянной скоростью. Это код, который у меня есть:

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

Однако это просто помещает свет в странное место и оставляет его там. Что я делаю неправильно?

Это вращение света перед запуском игры (должна быть начальная позиция): Начальная позиция

Как только игра начинается, она меняется (и остается на) следующим образом: Неправильная позиция

2 ответа

Решение

Может быть попробовать transform.localEulerAngles

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

Но я предложил вам добавить Time.deltaTime к этому, или ваш свет будет вращаться с частотой кадров компьютера, на котором он работает. Так что если вы хотите постоянную скорость, измените ее на это значение.

Я отредактировал следующее, чтобы сделать полный пример. ОП говорил по одной оси, что он останавливается в определенной степени. Я расширил это, чтобы показать с помощью следующего кода, он будет работать на любой оси и в любом направлении, изменяемый во время выполнения.

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

Затем вы можете изменить скорость, ось и направление во время выполнения, чтобы найти то, что работает для вас. Не забудьте установить его снова после остановки игры, так как он не будет сохранен.

Вам не хватает компонента 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

Я рекомендую второй.

Другие вопросы по тегам