2016-10-04 18 views
3

我在我的场景中遇到问题。我在做的是有两个面板,两个面板都有一个按钮,执行方法名称为RotateCamera()OnClick()听众。相机无法顺利插补其旋转

Image 1

此外,在层次结构中有一个MainMenugameobject其中安装有一个脚本。当我播放场景并点击​​按钮比MainCamera旋转90度角时第二个面板的方向。脚本工作正常,但我想平稳地将相机旋转到该面板,当我点击该按钮 - 现在,它即刻旋转。我不知道我在这个脚本上做了什么错误。

public class CameraSmooth : MonoBehaviour { 

    private bool check = false; 
    private Transform from; 
    private Transform to; 

    void Start(){ 
     from = Camera.main.transform; 
    } 

    void Update(){ 
     if (to != null) { 
      Camera.main.transform.rotation = Quaternion.Slerp (from.rotation, to.rotation, 3 * Time.deltaTime); 
     } 
    } 

    public void RotateCamera(){ 
     if (!check) { 
      Camera.main.transform.Rotate (0,90f,0f); 
      to = Camera.main.transform; 
      check = true; 
     } 
     else if (check) { 
      Camera.main.transform.rotation = Quaternion.identity; 
      to = Camera.main.transform; 
      check = false; 
     } 
    } 
} 
+0

相机是否立即旋转?因为它看起来就像你的代码当前所做的那样。 – Serlite

+0

@Serlite是它立即旋转! – hamel123

回答

3

这里的主要问题是,你调用RotateCamera()Camera.main.transform.Rotate()。这会导致旋转立即应用于相机,导致您看到的即时旋转。

另一个小的误解 - 因为Transform是引用类型,fromto总是实际上指向同一个实例(相机的Transform)!最后,3 * Time.deltaTime的值将总是平均在3/60左右,并且可能永远不会接近1,这对于完成插值是需要的。因此,以下行:

Camera.main.transform.rotation = Quaternion.Slerp (from.rotation, to.rotation, 3 * Time.deltaTime); 

即使解决了第一个问题也无法执行任何操作。

的情况需要不同的解决方案,在我看来:

  1. Quaternion变量存储目标的旋转,而不是直接在Transform设置它们,并跟踪摄像机的初始旋转的

  2. 保持一个跟踪旋转进度的定时器(或者您可以放弃Slerp()并直接应用增量旋转,这也是一种有效的方法)

这里是我建议的更新您的代码:

public class CameraSmooth : MonoBehaviour { 

    private bool check = false; 
    private float rotationProgress = 1; 
    private Quaternion initial; 
    private Quaternion from; 
    private Quaternion to; 

    void Start(){ 
     // Cache the starting rotation, so we can calculate rotations relative to it 
     initial = Camera.main.transform.rotation; 
    } 

    void Update(){ 
     if (rotationProgress < 1) { 
      rotationProgress += 3 * Time.deltaTime; 
      Camera.main.transform.rotation = Quaternion.Slerp (from, to, rotationProgress); 
     } 
    } 

    public void RotateCamera(){ 
     from = Camera.main.transform.rotation; 
     rotationProgress = 0; 

     if (!check) { 
      to = initial * Quaternion.Euler(0,90f,0f); 
      check = true; 
     } 
     else if (check) { 
      to = initial; 
      check = false; 
     } 
    } 
} 

(没有测试此代码,所以请让我知道,如果有任何问题),希望这有助于!如果您有任何问题,请告诉我!