【问题标题】:Strange RotateTowards issue in Unity 3DUnity 3D 中奇怪的 RotateTowards 问题
【发布时间】:2016-05-31 06:52:45
【问题描述】:

我正在使用 C# 作为脚本语言在 Unity 3D 中编写一个简单的游戏。我需要将相机旋转 180 度左右。奇怪的是第一次调用 Quarterion.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;我在准备代码 sn-p 时错过了这一行。当我使用第二个选项时(四元在开始时被初始化,没有抛出异常,它只是不执行任何旋转)。

【问题讨论】:

  • 你的意思是它不起作用?它是否抛出异常?在编写代码时,没有对返回的四元数 newRot 进行任何操作。如果您希望 RotateTowards 方法对对象执行行为,您可以将返回值分配给 transform.rotation。换句话说,您缺少 myGameObject.transform.rotation = newRot;
  • 不要出于任何原因使用四元数。只需使用Rotate(或者可能是RotateAround)Unity 最荒谬的事情之一就是他们在手册中提到了“四元数”。它们与一切都完全无关。如果要旋转某些东西,请使用Rotate
  • This answer 可以帮到你
  • @HBomb 我正在做这个任务:myGameObject.transform.rotation = newRot;只是忘了把它添加到我的 sn-p 中。这不是这个问题的原因。只是在第二种情况下不执行旋转。没有抛出异常
  • @PawełJastrzębski - 你出于任何原因很少使用“四元数” - 永远。这是 Unity 中最令人困惑的事情之一——很遗憾他们曾经在手册中提到过它。您只需使用 Rotate 或 RotateAround。真的就这么简单。

标签: c# unity3d game-engine


【解决方案1】:

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(请参阅更新的代码)。事实并非如此。
  • @PawełJastrzębski 好的,但您仍然在 Start 中隐藏四元数结构。您不会为全局字段分配新值,而是为 Start 方法的局部变量分配新值。
  • @JerrySwitalski secondMinionCameraRot 在类的主体中定义。 Start() 方法在开始时被调用,因此它调用构造函数。我不明白隐藏价值的意义。
猜你喜欢
  • 2022-07-11
  • 1970-01-01
  • 2016-02-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-10-18
相关资源
最近更新 更多