C# Unity 3D中的奇怪旋转问题

C# Unity 3D中的奇怪旋转问题,c#,unity3d,game-engine,C#,Unity3d,Game Engine,我正在用C#作为脚本语言,用Unity 3D编写一个简单的游戏。我需要把相机旋转180度。奇怪的是第一次调用quartion.RotateTowards有效,而另一个不起作用,尽管它应该只是对同一对象的引用 public class ChangeCamera : MonoBehaviour { Quaternion firstMinionCameraRot, secondMinionCameraRot; Quaternion newRot; // Use this for initial

我正在用C#作为脚本语言,用Unity 3D编写一个简单的游戏。我需要把相机旋转180度。奇怪的是第一次调用quartion.RotateTowards有效,而另一个不起作用,尽管它应该只是对同一对象的引用

public class ChangeCamera : MonoBehaviour {

Quaternion firstMinionCameraRot, secondMinionCameraRot;

Quaternion newRot; 

// Use this for initialization
void Start () {
    Quaternion firstMinionCameraRot = new Quaternion(0.0f, 1.0f, -0.3f, 0.0f);
    Quaternion secondMinionCameraRot = new Quaternion(-0.3f, 0.0f, 0.0f, -1.0f);
} 

// Update is called once per frame
void Update () {

    newRot = this.transform.rotation;

    // This one works 
    newRot = Quaternion.RotateTowards(newRot, new Quaternion(-0.3f, 0.0f, 0.0f, -1.0f), 0.05f * Time.deltaTime);
    // This one doesn't 
    newRot = Quaternion.RotateTowards(newRot, secondMinionCameraRot, 50.0f * Time.deltaTime);

    newRot = this.transform.rotation;
 }
编辑: 我正在做最后的作业newRot=this.transform.rotation;我在准备代码段时错过了这一行。当我使用第二个选项时(四元数在开始时初始化,没有抛出异常,它只是不执行任何旋转)。

I)您没有正确初始化变量。您正在隐藏打算处理的两个变量

Quaternion firstMinionCameraRot, secondMinionCameraRot;
void Start () {
    firstMinionCameraRot = new Quaternion(0.0f, 1.0f, -0.3f, 0.0f);
    secondMinionCameraRot = new Quaternion(-0.3f, 0.0f, 0.0f, -1.0f);
}
ii)正如@HBomb提到的,将你的旋转设置回游戏对象

void Update () {
    transform.rotation = Quaternion.RotateTowards(transform.rotation, secondMinionCameraRot, 50.0f * Time.deltaTime);
 }
注意:四元数是一个结构,因此它是按值传递的。您不能期望像处理“newRot”变量那样处理游戏对象旋转的引用。

i)您没有正确初始化变量。您正在隐藏打算处理的两个变量

Quaternion firstMinionCameraRot, secondMinionCameraRot;
void Start () {
    firstMinionCameraRot = new Quaternion(0.0f, 1.0f, -0.3f, 0.0f);
    secondMinionCameraRot = new Quaternion(-0.3f, 0.0f, 0.0f, -1.0f);
}
ii)正如@HBomb提到的,将你的旋转设置回游戏对象

void Update () {
    transform.rotation = Quaternion.RotateTowards(transform.rotation, secondMinionCameraRot, 50.0f * Time.deltaTime);
 }

注意:四元数是一个结构,因此它是按值传递的。你不能像对待“newRot”变量那样对待游戏对象旋转的引用。

你说它不起作用是什么意思?它是否抛出异常?在编写代码时,没有对返回的四元数newRot执行任何操作。如果希望RotateTowards方法在对象上执行行为,可以将返回值指定给transform.rotation。换句话说,您缺少myGameObject.transform.rotation=newRot;不要出于任何原因使用四元数。只需使用
Rotate
(或者可能是
RotateAround
)Unity最荒谬的事情之一就是手册中提到了“四元数”。它们与一切都毫不相干。如果要旋转某物,请使用
rotate
可能会有所帮助you@HBomb我正在做这个任务:myGameObject.transform.rotation=newRot;只是忘了把它添加到我的代码片段中。这不是这个问题的原因。在第二种情况下不执行旋转。没有例外thrown@PaweJastrzębski——你很少出于任何原因使用“四元数”——永远不会。这是Unity中最令人困惑的事情之一——很遗憾他们在手册中提到过它。你所要做的就是使用旋转或旋转环绕。真的很简单。你说它不起作用是什么意思?它是否抛出异常?在编写代码时,没有对返回的四元数newRot执行任何操作。如果希望RotateTowards方法在对象上执行行为,可以将返回值指定给transform.rotation。换句话说,您缺少myGameObject.transform.rotation=newRot;不要出于任何原因使用四元数。只需使用
Rotate
(或者可能是
RotateAround
)Unity最荒谬的事情之一就是手册中提到了“四元数”。它们与一切都毫不相干。如果要旋转某物,请使用
rotate
可能会有所帮助you@HBomb我正在做这个任务:myGameObject.transform.rotation=newRot;只是忘了把它添加到我的代码片段中。这不是这个问题的原因。在第二种情况下不执行旋转。没有例外thrown@PaweJastrzębski——你很少出于任何原因使用“四元数”——永远不会。这是Unity中最令人困惑的事情之一——很遗憾他们在手册中提到过它。你所要做的就是使用旋转或旋转环绕。就这么简单,正如我所提到的,我正在将值返回给newRot(参见更新的代码)。事实并非如此。@PawełJastrzębski好的,但您仍然在开始中隐藏四元数结构。您没有将新值赋给全局字段,而是赋给Start方法的局部变量。@JerrySwitalski secondMinionCameraRot在类的主体中定义。Start()方法在开始时被调用,因此它调用构造函数。我不明白隐藏值的意义。正如我提到的,我正在将值返回给newRot(请参阅更新的代码)。事实并非如此。@PawełJastrzębski好的,但您仍然在开始中隐藏四元数结构。您没有将新值赋给全局字段,而是赋给Start方法的局部变量。@JerrySwitalski secondMinionCameraRot在类的主体中定义。Start()方法在开始时被调用,因此它调用构造函数。我不明白隐藏价值的意义。