2017-03-18 59 views
0

我已经试过这两个C#脚本的转动我的定向光:为什么我的定向光仅仅从90度旋转到-90°(统一5.5)

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等

是什么原因造成这种夹紧,如何解决?

+1

不幸的是,我无法根据您提供的信息重现问题。你有可能提供简短的,独立的示例代码吗? – rutter

+0

[mvce](http://stackoverflow.com/help/mcve) – zwcloud

+0

@rutter我添加了完整的脚本。 – TrumpetDude

回答

0
+0

这似乎是我的问题,但不告诉我如何解决它。此外,我尝试转换,旋转,它不会在任何方向旋转。我相信转型只适用于地位和规模。 – TrumpetDude

+0

https://docs.unity3d.com/ScriptReference/Quaternion.html 更准确地说这个:https://docs.unity3d.com/ScriptReference/Quaternion-w.html – pasotee

0

为了解决您的问题,您需要使用额外的载体,改变它的内部更新每一帧,然后将它传递给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礼的改造工作,团结使得场面,背后有一些工作,会导致一个万向节锁。

0

使用四元数。这是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.RotateTowardsQuaternion.LerpTime.time和速率。这样你会得到更平滑的结果。