当前位置:   article > 正文

Unity之Time类_unity time.time

unity time.time

官方手册说明:https://docs.unity3d.com/cn/current/Manual/TimeFrameManagement.html

一、Time.time

该帧开始的时间(只读)。此为自游戏启动以来的时间(以秒为单位)

是应用程序已运行的时间(以秒为单位)。它是只读的。

应用程序在每帧开始时接收当前的 Time.time,该值按帧递增。每个帧的 time调用将接收相同的值。在从 FixedUpdate 中调用时,将返回Time.FixedUpdate属性。

应避免常规的(每帧)调用:Time.time倾向于提供应用程序已经运行的时间长度,而不是每帧的时间。

1.1Time.time就是为了提供游戏从开始到当前所花费的时间,单位秒。在编译器暂停时,是不会计算时间的

  1. using System.Collections;
  2. using System.Collections.Generic;
  3. using System.Text;
  4. using UnityEngine;
  5. public class Test : MonoBehaviour
  6. {
  7. void Start()
  8. {
  9. StartCoroutine(AA());
  10. }
  11. void Update()
  12. {
  13. }
  14. IEnumerator AA()
  15. {
  16. while (true)
  17. {
  18. Debug.Log(Time.time);
  19. yield return new WaitForSeconds(1f);
  20. }
  21. }
  22. }

使用协程一秒打印一次Time.time结果

1.2 使用Time.time制作一秒执行一次

  1. using System.Collections;
  2. using System.Collections.Generic;
  3. using System.Text;
  4. using UnityEngine.UI;
  5. using UnityEngine;
  6. public class Test : MonoBehaviour
  7. {
  8. float timerA;
  9. void Start()
  10. {
  11. timerA = Time.time;
  12. StartCoroutine(AA());
  13. }
  14. void Update()
  15. {
  16. if (Time.time- timerA>=1f)
  17. {
  18. Debug.Log("执行"+System.DateTime.Now);
  19. timerA = Time.time;
  20. }
  21. }
  22. }

结果:

二、Time.deltatime

 返回自上一帧完成以来经过的时间量。

在Unity生命周期中Update的作用是每帧执行一次,但是因为电脑配置的不同,所以游戏开始时每秒渲染多少帧是不固定的。所以我们要想知道Update中每帧在1秒内的占比,就是Time.deltatime,Time.deltatime它的计算方式是 1秒/渲染帧数。

但是在FixedUpdate()中Time.deltatime返回的值与fixedDeltaTime一致

应用:

2.1物体匀速执行

  1. using System.Collections;
  2. using System.Collections.Generic;
  3. using System.Text;
  4. using UnityEngine.UI;
  5. using UnityEngine;
  6. public class Test : MonoBehaviour
  7. {
  8. public GameObject cube;
  9. public GameObject cube2;
  10. void Start()
  11. {
  12. StartCoroutine(AA());
  13. }
  14. void Update()
  15. {
  16. //这里使用了Time.deltaTime 物体会匀速执行
  17. cube.transform.position += Vector3.one * Time.deltaTime;
  18. }
  19. IEnumerator AA()
  20. {
  21. while (true)
  22. {
  23. //协程每1秒执行一次(因为生命周期执行顺序,位置会有一点小偏差)
  24. cube2.transform.position += Vector3.one;
  25. yield return new WaitForSeconds(1f);
  26. }
  27. }
  28. }

效果:

 绿色代表1秒内要移动1米

灰色在update中1秒渲染了N帧,每一帧移动N米,得出一个匀速的效果。

三、Time.timeScale

表示时间流逝的速率。您可以读取此值,或将其设置为控制时间流逝的速度,从而创建慢动作效果。

Time.timeScale是用于控制任何刚体和依赖时间的函数、刚体力和速度等。只要是和时间有关的东西他都能“管”。

我们知道在Unity生命周期中有Update、LateUpdate、FixedUpdate三种函数,Time.timeScale只能控制FixedUpdate而其他两个则是不能,为什么呢?因为Update、LateUpdate含义是每帧执行一次,是由帧来决定,而帧数是由电脑的配置来决定(配置高的电脑帧数率高,游戏体验好),而FixedUpdate含义是根据固定时间来执行。

下面做个测试

结果:

 这里忘记打印按键了,其实可以明显看出当Time.timeScale = 0; //速度为0 FixedUpdate不执行其他两个都在执行。

3.2播放、暂停、加速效果

  1. using System.Collections;
  2. using System.Collections.Generic;
  3. using UnityEngine.UI;
  4. using UnityEngine;
  5. public class Test : MonoBehaviour
  6. {
  7. public Text txt;
  8. public Transform cube;
  9. void Start()
  10. {
  11. }
  12. void Update()
  13. {
  14. //按下0
  15. if (Input.GetKeyDown(KeyCode.Alpha0))
  16. {
  17. Time.timeScale = 0; //速度为0 不执行
  18. txt.text = "暂停";
  19. }
  20. //按下1
  21. if (Input.GetKeyDown(KeyCode.Alpha1))
  22. {
  23. Time.timeScale = 1; //正常速度
  24. txt.text = "正常播放";
  25. }
  26. //按下2
  27. if (Input.GetKeyDown(KeyCode.Alpha2))
  28. {
  29. Time.timeScale = 2; //速度 2X
  30. txt.text = "2倍速";
  31. }
  32. cube.rotation *= Quaternion.Euler(Vector3.one*70 * Time.deltaTime); //使用了Time.deltaTime(时间) 所以受控制
  33. }
  34. }

 效果

四、fixedDeltaTime

执行物理和其他固定帧率更新(如 MonoBehaviour 的 FixedUpdate)的时间间隔(以秒为单位)。

为了读取增量时间,建议改用 Time.deltaTime,因为当您位于 FixedUpdate 函数或 Update 函数中时, 它会自动返回正确的增量时间。

fixedDeltaTime只会返回一个固定的值(可以在Edit-->Project Settings-->Time面板中设置)

fixedDeltaTime控制的是FixedUpdate()的执行次数(每多少秒执行一次),而且在FixedUpdate()中调用的fixedDeltaTime都当1使用。

我们来测试一下

设置Time面板的 fixed Timestep值为1 即每1秒执行一次

 

  1. using System.Collections;
  2. using System.Collections.Generic;
  3. using UnityEngine.UI;
  4. using UnityEngine;
  5. public class Test : MonoBehaviour
  6. {
  7. void Start()
  8. {
  9. }
  10. void FixedUpdate()
  11. {
  12. Debug.Log("测试1 "+1);
  13. Debug.Log("测试2 "+1*Time.fixedDeltaTime);
  14. }
  15. }

 结果:

可以看到打印结果是相同的 

 

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/不正经/article/detail/108261
推荐阅读
相关标签
  

闽ICP备14008679号