zoukankan      html  css  js  c++  java
  • Unity 常用的计时器写法

    第一种:每帧检查

     定义一个时间变量 timer,每帧都将这个时间减去帧间隔时间 Time.deltaTime,如果小于或者等于零,说明定时到了,执行相应功能的代码,将这个定时器重置。如下:

     1 using UnityEngine;
     2 
     3 public class Timer : MonoBehaviour
     4 {
     5     public float timer = 1.0f;
     6 
     7     void Update()
     8     {
     9         timer -= Time.deltaTime;
    10         if (timer <= 0)
    11         {
    12             Debug.Log(string.Format("计时器正在计时! Time={0}s", Time.time));
    13             timer = 1.0f;
    14         }
    15     }
    16 }

     计时效果:

     

     也就是一秒内从第一个 Frame 到最后一个 Frame 所花的时间,所以不管设备是一秒60帧或者一秒30帧、24帧,值都会趋近于一。

     就结果而言,deltaTime 是为了游戏公平性而产生的东西,因此最常用于位移(translate),但拿来计时也是可以的。

    第二种:利用协程

     启动一个协程,在协程中返回需要等待的时间。

     协程简而言之就是执行一个可中断、可继续的函数,所以可以利用协程间隔几秒再执行下一个语句,把它当做计时器使用。如下:

     1 using System.Collections;
     2 using UnityEngine;
     3 
     4 public class Timer : MonoBehaviour
     5 {
     6     void Start()
     7     {
     8         StartCoroutine(timer());
     9     }
    10 
    11     IEnumerator timer()
    12     {
    13         while (true)
    14         {
    15             yield return new WaitForSeconds(1.0f);
    16             Debug.Log(string.Format("计时器正在计时!time={0}s", Time.time));
    17         }
    18     }
    19 }

     计时效果:

     

    第三种:延迟调用

     使用 MonoBehaviour.InvokeRepeating,三个参数分别是要调用的方法、第一次调用的时间和间隔调用的时间。如下:

     1 using UnityEngine;
     2 
     3 public class Timer : MonoBehaviour
     4 {
     5     void Start()
     6     {
     7         InvokeRepeating("timer", 0f, 1.0f);
     8     }
     9 
    10     void timer()
    11     {
    12         Debug.Log(string.Format("计时器正在计时!time={0}s", Time.time));
    13     }
    14 }

     计时效果:

     

     InvokeRepeating 与 StartCoroutine 一样,是可以中断的,只要使用 CancelInvoke()。

     这最常使用在怪物、敌人以及道具生成的时候,比如可以设定第一波怪物在游戏开始10秒后出现,之后每隔0.5秒召唤一只怪物。

    总结:

     这三种都是常用的计时器方法,可以拿来读取时间;

     而配合所要使用值的不同,就可以拿来当作游戏时间、Combo、倒计时、CD冷却... ...等等,用途还是很广泛的。

    *** |  以上内容仅为学习参考、学习笔记使用  | ***

  • 相关阅读:
    IIs6基础上发布WebApi注意事项
    VS2010下开发WebApi 基本步骤
    C# 两个datatable中的数据快速比较返回交集或差集
    myeclipse快捷键使用
    Java中时间
    数组排序后插入
    所有的jsp页面都放到WEB-INF目录
    jsp内置对象浅谈
    JSP九大内置对象的作用和用法总结?
    JSP九大内置对象及四个作用域
  • 原文地址:https://www.cnblogs.com/ChenZiRong1999/p/13201359.html
Copyright © 2011-2022 走看看