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冷却... ...等等,用途还是很广泛的。

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

  • 相关阅读:
    数组
    数据结构的三个方面
    java数据结构和算法
    HashMap实现原理
    面试必问---HashMap原理分析
    Java中:>>>和>>区别
    java运算符 与(&)、非(~)、或(|)、异或(^)
    Java集合详解(全)
    String、StringBuffer、StringBuilder的区别
    abstract关键字、final关键字、static关键字、访问修饰符详解
  • 原文地址:https://www.cnblogs.com/ChenZiRong1999/p/13201359.html
Copyright © 2011-2022 走看看