如何在Unity3D中获得平滑的慢动作

时间:2014-06-21 17:28:17

标签: unity3d unityscript

我试图在游戏中制作一个慢动作,但看起来真的很迟钝。我使用Unity提供的标准资产中的FPS控制器。我将此脚本附加到它:

function Update () {
if (Input.GetKeyDown ("q")){
Time.timeScale = 0.5;
}

if (Input.GetKeyDown ("e")) {
Time.timeScale = 2.0;
}
if (Input.GetKeyDown ("t")) {
Time.timeScale = 1.0;
}

}

我知道这是与http://answers.unity3d.com/questions/39279/how-to-get-smooth-slow-motion.html

相似的问题

但是在这个问题上给出的修正不起作用。我尝试在其中添加一个刚体并将插值插入插值但它没有做任何事情。(我从“使用重力”中删除了勾号,因为字符已经开始我是团结和脚本的新手,所以请放轻松我。

谢谢。

3 个答案:

答案 0 :(得分:2)

你也应该改变Time.fixedDeltaTime:

function Update () {
   if (Input.GetKeyDown ("q")){
      Time.timeScale = 0.5;
      Time.fixedDeltaTime = 0.02F * Time.timeScale;
   }
}

要再次将其恢复为正常运动,您应该调用这两行

      Time.timeScale = 1;
      Time.fixedDeltaTime = 0.02F * Time.timeScale;

答案 1 :(得分:0)

这实际上非常容易。事实上,你甚至不需要编码任何东西!只需进入场景中的每个刚体,并将插值模式更改为“插值”或“外推”。它们意味着非常不同的东西,但两者都有完美平滑的慢动作的最终结果。

答案 2 :(得分:0)

您只需要以SetTimeScale作为参数来调用target timescale方法:)

using UnityEngine;
public class TimeScaleSmooth : MonoBehaviour
{
    public float targetTimeScale = 1;
    public float speed = 1;

    void Update()
    {
        Time.timeScale = Mathf.MoveTowards(Time.timeScale, targetTimeScale, 
        Time.unscaledDeltaTime * speed);
        //0.02 is default fixedDeltaTime
        Time.fixedDeltaTime = timeScale * 0.02f;
        //FOR TEST
        if (Input.GetKeyDown(KeyCode.A))
        {
            SetTimeScale(1);
        }
        if (Input.GetKeyDown(KeyCode.S))
        {
            SetTimeScale(0.2f);
        }
    }

    public void SetTimeScale(float timeScale)
    {
        targetTimeScale = timeScale;
    }
}
  • 请注意,我们使用了Time.unscaledDeltaTime的{​​{1}}。
  • 您可以使用independent of timescale来调整transition time