如何更改平行光的旋转? (C#,统一 5.5)
How do I change the rotation of a directional light? (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);
}
}
然而,这只是将光放在一个奇怪的地方并留在那里。我做错了什么?
这是我运行游戏前的灯光旋转(应该是开始位置):
游戏开始后,它变成(并停留在)这个:
也许试试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;
}
}
然后您可以在运行时修改速度、轴和方向以找到适合您的方法。不过请务必在停止游戏后重新设置,因为它不会被保存。
您缺少旋转中的 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
推荐第二个
我想让我的方向灯以恒定的速度旋转。这是我的代码:
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);
}
}
然而,这只是将光放在一个奇怪的地方并留在那里。我做错了什么?
这是我运行游戏前的灯光旋转(应该是开始位置):
游戏开始后,它变成(并停留在)这个:
也许试试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;
}
}
然后您可以在运行时修改速度、轴和方向以找到适合您的方法。不过请务必在停止游戏后重新设置,因为它不会被保存。
您缺少旋转中的 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
推荐第二个