【Unity】每天一个技术点-----Unity开发中的时间

常用的两种时间:
一、Unity内和游戏相关的时间 ----- Time
二、和本地时间、日期格式化等相关的C#类时间 ---- DateTime


一:Unity内和游戏相关的时间 ----- Time

Time类:从 Unity 获取时间信息的接口。

一些常用方法:
Time.time : 自游戏启动以来的时间(以秒为单位),受Time.timeScale影响,因此也叫游戏时间(Time.timeScale = 0时,改时间会暂停计时)。
Time.unscaledTime:自游戏启动以来的时间(以秒为单位)。不受 timeScale 的影响,因此也叫真实时间(Time.timeScale = 0时,不会暂停计时)。
Time.realtimeSinceStartup:返回自启动以来的时间,不受 Time.timeScale 的影响,因此也叫真实时间。
*注意:*Time.unscaledTime是从start()之后开始启动,而Time.realtimeSinceStartup从Awake()时开始计时。
在这里插入图片描述

Time.deltaTime:当前帧和上一帧之间的时间,也称两帧之间的时间间隔。受Time.timeScale影响。
Time.unscaledDeltaTime:当前帧和上一帧之间的时间,也称两帧之间的时间间隔。不受Time.timeScale影响。
Time.smoothDeltaTime:经过平滑处理的 Time.deltaTime,受Time.timeScale影响。

Time.fixedTime: 表示FixedUpdate已经执行的时间
Time.fixedUnscaledTime: 表示FixedUpdate已经执行的时间,该值不受 timeScale 的影响。

Time.fixedDeltaTime:执行物理和其他固定帧率更新(如 MonoBehaviour 的 FixedUpdate)的时间间隔(以秒为单位)。不受 timeScale 影响。
Time.fixedUnscaledDeltaTime:从上一个固定帧到当前固定帧的独立于 timeScale 的时间间隔(以秒为单位)(只读)。与 fixedDeltaTime 不同,受 timeScale 的影响。会按照反比改变。
不同TimeScale的对比
Time.frameCount:已经过的总帧数
Time.timeScale:时间流逝的标度。
注意:当 timeScale 为 1.0 时,时间流逝的速度与实时一样快。 当 timeScale 为 0.5 时,时间流逝的速度比实时慢 2x。
当 timeScale 设置为 0 时,如果您的所有函数都是独立于帧率的(都受timeScale影响), 则游戏基本上处于暂停状态。
当 timeScale 设置为 0 时,会调用 Update、LateUpdate 函数,而不会调用 FixedUpdate 函数。

总结:
1、受 TimeScale 影响的有:time、deltaTime、fixedTime、fixedUnscaledDeltaTime、smoothDeltaTime。
2、不受 TimeScale 影响的有:realtimeSinceStartup、unscaledTime、unscaledDeltaTime、fixedUnscaledTime、fixedDeltaTime。
3、Update和LateUpdate不受TimeScale 影响,但是FixedUpdate受TimeScale 的影响。当TimeScale = 0 时,FixedUpdate也停止更新,fixedUnscaledTime也停止,fixedUnscaledDeltaTime的值不会发生改变。
4、TimeScale 是 0~100之间的浮点数

二:和本地时间、日期格式化等相关的C#类时间 ---- DateTime

C# 的 DataTime:表示某个时刻,通常以日期和当天的时间表示。
文档截图

以下是常用函数实例:

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using System; //需要引入命名空间

public class Test2 : MonoBehaviour
{
    // Start is called before the first frame update
    void Start()
    {
        DateTime time = new DateTime(2023,12,13,7,47,0); 

        print("time =" + time.ToString());
        print("time_hour=" + time.Hour);

        var date = time.Date;  //一个新对象,其日期与此实例相同,时间值设置为午夜 12:00:00 (00:00:00)。

        print("date_d="+ date.ToString("d")); //日期
        print("date_g=" + date.ToString("g")); //日期+时间
        print("date_yyyy/MM/dd HH:mm=" + date.ToString("yyyy/MM/dd hh:mm"));
        print("date_year=" + date.Year);

        print("dateNow_all=" + DateTime.Now);  //获取系统本地时间
        print("dateNow_day=" + DateTime.Now.ToString("yyyy/MM/dd"));  //本地时间格式化
        print("dateNow_hour=" + DateTime.Now.ToString("hh:mm:ss"));
        
    }

}

运行结果

拓展:Unity TimeScale对协程的影响

yield return 0 / yield return null :暂停协程等待下一帧继续执行,不受TimeScale影响。
WaitForSeconds:实际暂停时间等于给定时间除以 Time.timeScale。在协程中,WaitForSeconds 只能与 yield 语句结合使用。受到TimeScale影响。
WaitForFixedUpdate:等待,直到下一个固定帧率更新函数。只能与 yield 语句结合使用。受到TimeScale影响
WaitForSecondsRealtime:使用未缩放时间将协同程序执行暂停指定的秒数。只能与 yield 语句结合使用。不受TimeScale影响。

测试代码:(可以通过unity Project Settings 控制TimeScale 来观察效果)

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class Test3 : MonoBehaviour
{
    int num1 = 0;
    int num2 = 0;
    int num3 = 0;
    int num4 = 0;
    // Start is called before the first frame update
    void Start()
    {
        StartCoroutine(Demo1());
        StartCoroutine(Demo2());
        StartCoroutine(Demo3());
        StartCoroutine(Demo4());

    }

    IEnumerator Demo1()
    {
        while (true)
        {
            yield return new WaitForSeconds(1);
            num1 += 1;
            print("Demo WaitForSeconds === " + num1);
        }

    }

    IEnumerator Demo2()
    {
        while (true)
        {
            yield return new WaitForFixedUpdate();
            num2 += 1;
            print("Demo WaitForFixedUpdate === " + num2);
        }

    }

    IEnumerator Demo3()
    {
        while (true)
        {
            //yield return 0;
            yield return null;
            num3 += 1;
            print("Demo yield === " + num3);
        }

    }

    IEnumerator Demo4()
    {
        while (true)
        {
            yield return 0;
            num4 += 1;
            print("Demo WaitForSecondsRealtime === " + num4);
        }

    }
}

  • 18
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值