首页 > 其他分享 >unity3d——Time

unity3d——Time

时间:2024-11-03 18:16:44浏览次数:5  
标签:unity3d 游戏 timeScale 示例 void Time Debug

在Unity3D中,Time类是一个非常重要的工具类,它提供了一系列与时间相关的属性和方法,帮助开发者在游戏中实现各种时间相关的操作。以下是一些Time类常用的方法及其示例:

一、常用属性

  1. Time.time

    • 含义:表示从游戏开始到现在的时间,以秒为单位。该时间会随着游戏的暂停而停止计算。
    • 示例:
      Debug.Log(Time.time); // 输出从游戏开始到现在的时间
  2. Time.deltaTime

    • 含义:表示从上一帧到当前帧的时间,以秒为单位。这个属性常用于平滑处理移动、旋转等操作,以确保游戏在不同帧率下的表现一致。
    • 示例:
      void Update()
      {
      transform.Translate(Vector3.forward * Time.deltaTime * speed); // 平滑移动
      }
  3. Time.fixedDeltaTime

    • 含义:表示FixedUpdate方法中固定的时间间隔,以秒为单位。这个属性在物理模拟和其他需要固定帧率更新的场景中非常有用。

      Time.fixedDeltaTime 是 Unity 中的一个属性,它表示在物理更新(FixedUpdate)之间的时间间隔。这个值通常是固定的,用来确保物理模拟的稳定性和一致性。在 Unity 中,物理计算是在 FixedUpdate 方法中进行的,而不是在 Update 方法中。FixedUpdate 的调用频率是基于 Time.fixedDeltaTime 的值。

      使用场景

    • 物理模拟:任何涉及物理计算的操作,如刚体(Rigidbody)的移动、碰撞检测等,都应该使用 FixedUpdate 方法和 Time.fixedDeltaTime
    • 平滑运动:即使不涉及物理引擎,如果你希望实现平滑的运动,也可以使用 FixedUpdate 和 Time.fixedDeltaTime
    • 示例:
      void FixedUpdate()
      {
      // 物理模拟或固定帧率更新逻辑
      }
  4. Time.timeScale

    • 含义:表示时间缩放因子,默认值为1。通过调整这个属性,可以加速或减速游戏时间,甚至暂停游戏。
    • 示例:
      public void PauseGame()
      {
      Time.timeScale = 0; // 暂停游戏
      }
      public void ResumeGame()
      {
      Time.timeScale = 1; // 恢复游戏
      }

在Unity3D中,Time.timeScale是一个非常实用的功能,它就像是游戏时间的“遥控器”,可以让你控制游戏时间的流逝速度。想象一下,你奶奶正在看你玩游戏,你告诉她这个“遥控器”怎么用,她会更容易理解。

首先,Time.timeScale默认值是1,这意味着游戏时间跟现实时间是一样的,一秒就是一秒。

  • 暂停游戏:如果你想让游戏暂停,就像电影暂停一样,你可以把Time.timeScale设置为0。这样,游戏里的所有动作都会停下来,但画面还是显示的,只是时间不动了。你可以告诉你奶奶,这就像按下了电视机的暂停键。
  • 慢动作:如果你想让游戏里的动作变慢,比如让角色动作看起来更酷,你可以把Time.timeScale设置成一个小于1的数,比如0.5。这样,游戏里的时间就会变慢一半,动作也就跟着变慢了。你可以告诉你奶奶,这就像按下了电视机的慢放键。
  • 快进:反过来,如果你想让游戏时间加快,比如让角色跑得更快,你可以把Time.timeScale设置成一个大于1的数,比如2。这样,游戏里的时间就会加快一倍,动作也就跟着变快了。你可以告诉你奶奶,这就像按下了电视机的快进键。

需要注意的是,Time.timeScale只影响游戏时间的流逝速度,它不会改变现实时间。而且,有些游戏功能,比如计时器或者基于真实时间的系统,可能不会受到Time.timeScale的影响。

所以,下次当你奶奶看到你玩游戏,你可以告诉她,你有一个“遥控器”,可以让游戏时间暂停、变慢或者变快,让她也感受一下游戏的乐趣!

二、常用方法

  1. WaitForSeconds()

    • 含义:这个方法用于在协程中等待一段时间。以秒为单位指定等待时间,协程将在此期间暂停执行。
    • 示例:
      IEnumerator WaitAndPrint()
      {
      yield return new WaitForSeconds(2); // 等待2秒
      Debug.Log("等待结束");
      }
  2. InvokeRepeating() 和 CancelInvoke()

    • 含义:InvokeRepeating方法用于在指定延迟后重复调用某个方法,而CancelInvoke方法用于取消所有等待调用的方法。
    • 示例:
      void Start()
      {
      InvokeRepeating("LaunchProjectile", 1, 5); // 1秒后调用,之后每5秒调用一次
      }
      void LaunchProjectile()
      {
      Debug.Log("发射弹药");
      }
      void CancelLaunch()
      {
      CancelInvoke("LaunchProjectile"); // 取消所有等待调用的LaunchProjectile方法
      }

三、综合示例

以下是一个综合示例,展示了如何在Unity3D中使用Time类的一些常用属性和方法:

using UnityEngine;  
  
public class TimeExample : MonoBehaviour  
{  
    public float speed = 10f;  
  
    void Update()  
    {  
        // 平滑移动  
        transform.Translate(Vector3.forward * Time.deltaTime * speed);  
  
        // 输出从游戏开始到现在的时间  
        Debug.Log("Game Time: " + Time.time);  
  
        // 输出从上一帧到当前帧的时间  
        Debug.Log("Delta Time: " + Time.deltaTime);  
  
        // 如果按下空格键,则暂停游戏  
        if (Input.GetKeyDown(KeyCode.Space))  
        {  
            if (Time.timeScale == 1)  
            {  
                Time.timeScale = 0;  
                Debug.Log("Game Paused");  
            }  
            else  
            {  
                Time.timeScale = 1;  
                Debug.Log("Game Resumed");  
            }  
        }  
    }  
  
    IEnumerator WaitAndPrintCoroutine()  
    {  
        // 等待2秒  
        yield return new WaitForSeconds(2);  
        // 输出等待结束  
        Debug.Log("Coroutine Wait Finished");  
    }  
  
    void Start()  
    {  
        // 启动协程  
        StartCoroutine(WaitAndPrintCoroutine());  
  
        // 1秒后调用PrintMessage方法,之后每3秒调用一次  
        InvokeRepeating("PrintMessage", 1, 3);  
    }  
  
    void PrintMessage()  
    {  
        Debug.Log("Message Printed");  
    }  
  
    void OnDestroy()  
    {  
        // 取消所有等待调用的方法  
        CancelInvoke();  
    }  
}

 

标签:unity3d,游戏,timeScale,示例,void,Time,Debug
From: https://blog.csdn.net/2401_82978699/article/details/143301443

相关文章

  • unity3d——Vector3
    在Unity3D中,Vector3是一个非常重要的结构体,用于表示三维空间中的位置和方向。以下是关于Vector3的一些关键知识点:一、Vector3的基本概念和属性定义:Vector3是一个包含三个浮点数的结构体,分别代表X、Y和Z轴上的分量。它用于描述具有大小和方向两个属性的物理量,如速度、加速度......
  • 解决 System.Runtime.CompilerServices.Unsafe 程序集版本不匹配问题
    你是否在.NET文件上传中遇到过令人头疼的引用错误?今天我们就来深入探讨如何解决System.Runtime.CompilerServices.Unsafe引用错误1.错误现象在文件上传操作中,当处理特定文件格式(如.xlsx)时,代码workbook=newXSSFWorkbook(myfile.InputStream);出现异常。异常信息为......
  • Android使用timer和thread实现定时器
    说明:两种方法实现android定时器,定时执行任务第一种方式:step1:packagecom.example.iosdialogdemo;importandroid.os.Bundle;importandroid.os.Handler;importandroidx.appcompat.app.AppCompatActivity;importjava.util.Timer;publicclassTimerActivityextends......
  • 系统网络通信异常Read timed out排查及解决过程
    用户反馈应用连接数据库经常出现网络通信异常相关sql语句在数据库在数据库客户端能正常执行,执行时间不到1s检查数据库参数,运行日志,网络方面,驱动版本都正常查看应用报错日志,里面有readtimdout报错,一般是连接超时导致的 检查durid连接池配置如下 Druid连接池conne......
  • unity3d————三角函数
    先上代码,结合代码讲解:publicclassLesson2:MonoBehaviour{//StartiscalledbeforethefirstframeupdatevoidStart(){#region知识点一弧度、角度相互转化//弧度转角度floatrad=1;floatanger=rad*Math......
  • 域适应(Domain Adaptation, DA)、域泛化(Domain Generalization, DG)和测试时域适应(Test T
    域适应(DomainAdaptation,DA)、域泛化(DomainGeneralization,DG)和测试时域适应(TestTimeAdaptation,TTA)是迁移学习领域中处理分布差异的三个重要概念,它们既有联系也有区别1、DomainAdaptation(域适应,DA)1.1、DA定义域适应的目标是将一个在源域上训练好的模型调整或......
  • 【解决MongoDB安装难题!】计算机丢失VCRUNTIME140D.dll?一招教你快速修复!
    在安装或运行Java的MongoDB相关程序时,如果遇到“无法启动此程序,因为计算机丢失VCRUNTIME140D.dll”的错误,通常是由于缺少MicrosoftVisualC++Redistributable包。VCRUNTIME140D.dll是VisualC++2015-2019Redistributable的一部分,用于支持C++应用程序的运行时库。以下是解......
  • 一个.NET开源、轻量级的运行耗时统计库 - MethodTimer
    前言在.NET开发中,为了准确统计对应方法的执行时间,我们最常用的方式是手动使用Stopwatch来显式编写计时逻辑,但是假如你需要大量的使用Stopwatch来进行耗时统计的话不利于保持代码的整洁和增加代码的维护成本。项目介绍MethodTimer是一个.NET开源、免费(MITLicense)、轻量......
  • java Web 时间LocalDateTime 输出到前端格式化
    格式化时间返回到前端 packagecom.za.edu.config;importcom.fasterxml.jackson.databind.DeserializationFeature;importcom.fasterxml.jackson.databind.ObjectMapper;importcom.fasterxml.jackson.databind.module.SimpleModule;importcom.fasterxml.jackson.datab......
  • 根据字符串,获取实体属性上的annotation,如:createTime” 找到对应实体属性中的 TableFi
    根据字符串,获取实体属性上的annotation,如:createTime”找到对应实体属性中的TableField(value="create_time",fill=FieldFill.INSERT)Field[]fields=clazz.getFields();//仅能获取类(及其父类)public属性成员Field[]declaredFields=clazz.getDeclaredFields();......