我试过这两个C#脚本来旋转我的方向灯:
using System.Collections;
using UnityEngine;
public class LightRotator : MonoBehaviour
{
void Update ()
{
transform.rotation = Quaternion.Euler(transform.eulerAngles.x + 1.0f,
transform.eulerAngles.y,
transform.eulerAngles.z);
}
}
和
using System.Collections;
using UnityEngine;
public class LightRotator : MonoBehaviour
{
void Update ()
{
transform.localEulerAngles = new Vector3(transform.localEulerAngles.x + 1.0f,
transform.localEulerAngles.y,
transform.localEulerAngles.z);
}
}
它们似乎功能完全相同:如果我将transform.eulerAngles.y
更改为transform.eulerAngles.y + 0.5f
,光线将沿y轴旋转,同样适用于z轴。但是,当我尝试使用x轴进行此操作时,它会旋转直到达到90º,此时它将继续尝试旋转,但它会立即连续推回90º。如果我改变方向,它在-90º处做同样的事情。例如,轮换可能是:88.5,89.0,89.5,90.0,90.5,89.93,90.24,89.4等。
造成这种夹紧的原因是什么?如何解决?
为了解决您的问题,您需要使用一个额外的向量,在每个帧中更新它,然后将其传递给变换的eulerAngles
专有。
Vector3 vect = Vector3.zero;
float rotationSpeed = 10f;
void Start () {
vect = transform.eulerAngles; //Set the vect rotation equal to the game object's one
}
void Update ()
{
vect.x += rotationSpeed * Time.deltaTime;
//Pass unique eulerAngles representation to the object without letting Unity change it
transform.eulerAngles = vect;
}
这是因为在3D空间中有单个物理旋转的多个欧拉角度表示,并且当你直接使用变换的eulerAngles
适当性时,Unity在幕后做了一些工作,这可能导致万向节锁定。
使用四元数。这是Unity3d内部使用的,并没有欧拉角的任何副作用。
using System.Collections;
using UnityEngine;
public class LightRotator : MonoBehaviour
{
public Vector3 RotationAxis = Vector3.right;
Quaternion _startRotation;
float _rotationIncrement = 0;
void Start()
{
_startRotation = transform.rotation;
}
void Update ()
{
Quaternion rotationMod =
Quaternion.AngleAxis(_rotationIncrement, RotationAxis);
_rotationIncrement += 1;
transform.rotation = _startRotation * rotationMod;
}
}
但是,您可能想要使用Quaternion.RotateTowards
或Quaternion.Lerp
以及Time.time
和费率。这样你会得到更平滑的结果。
如果您只想沿X轴旋转,则将另一个轴设置为0。