前言
协程作为Unity中一个比较重要的特性,当前有很多种奇妙的特性。这次就简单介绍一下如何使用Coroutine写一个可以复用的计时器(Timer)。如果你对协程不是很熟悉,建议可以先阅读一下我之前写的一篇 协程(Coroutine)原理分析。
Timer的常规实现
大部分情况下, 我们可以通过直接在Update(或FixedUpdate)中使用Time.deltaTime来获取上一帧经过的时间,这样通过一个变量累加该值就可以实现计时器的效果。大致代码如下:
using UnityEngine;
public class Timer : MonoBehaviour
{
public float waitTime = 1f;
private float elapseTime;
void Update()
{
elapseTime += Time.deltaTime;
if (elapseTime > waitTime)
{
print("Timer is done");
elapseTime = 0;
}
}
}
这种写法基本不会有什么问题,不过我觉得还是有两个缺点的。第一个是每次你使用的使用的时候都需要在Update中加入这段话,我只在Update()中做这一项操作的话还好,如果之后功能越添越多就会显得有点乱。第二个来说就是没有那么准确,基本每次timer的值都会大于waitTimer,帧数高的话这种误差倒还说得过去,帧数低就会有比较可观的累积误差。
Timer的协程实现方法
接下来就介绍一下如何用协程实现计时器的功能。这里就需要用到Unity内置的YieldInstruction之一————WaitForSeconds,即悬停Coroutine指定的秒数然后继续执行。此外由于我们可以通过使用StartCoroutine和StopCoroutine手动地启动和停止协程,Timer的功能也会更加完善。
下面是可供参考的Timer的协程实现代码:
using UnityEngine;
//使用协程必须添加该命名空间,
//因为IEnumerator就位于该命名空间下
using System.Collections;
public class Timer : MonoBehaviour
{
public float waitTime =