Unity内实现倒计时组件

来源:互联网 发布:河南网络电视公益活动 编辑:程序博客网 时间:2024/05/29 08:35

前言

倒计时功能在游戏中一直很重要, 不管是活动开放时间,还是技能冷却。
本文实现了一个通用倒计时组件,实现了倒计时的基本功能,支持倒计时结束后的回调。

设计思路

  1. 倒计时的实现是通过协程,WaitForSeconds(delay)可以很好的每隔一个delay执行一次方法,如果需要很精细的时间, 可以将delay设置成0.1等小于1的值。
  2. 回调是在倒计时为0时,执行一个Action类型的方法。
  3. 我的这个组件默认是需要Text组件来显示, 也可以根据需求删除。

先看效果:

代码实现

// 倒计时// 倒计时结束的回调using System;using System.Collections;using UnityEngine;using UnityEngine.UI;[RequireComponent(typeof(Text))]public class CountDownTime : MonoBehaviour{    public int testTime = 15;    private int _timeLeft = 0;    private Text _textTimer = null;    private float _delay = 1;    private Action _endCallback = null;    private void Start()    {        if (_textTimer == null)            _textTimer = GetComponent<Text>();        SetEndCallback(TestEndCallback);        Begin(testTime, true);    }    public void SetEndCallback(Action callback)    {        _endCallback = callback;    }    public void Begin(int timeLeft, bool isRightNow)    {        _timeLeft = timeLeft;        if (_textTimer == null)            _textTimer = GetComponent<Text>();        if (isRightNow) CountDown();        if (gameObject.activeInHierarchy)            StartCoroutine(Polling(_delay, CountDown));    }    private IEnumerator Polling(float delay, Action voidFunc)    {        while (delay > 0)        {            voidFunc();            if (_timeLeft < 0 && _endCallback != null) {                _endCallback();                _endCallback = null;                yield return null;            }            yield return new WaitForSeconds(delay);        }    }    private void CountDown()    {        if (_timeLeft >= 0)        {            TimeSpan ts = new TimeSpan(0, 0, _timeLeft--);            _textTimer.text = ts.ToString();        }        else if (_timeLeft < -1)        {            _textTimer.text = _timeLeft.ToString();        }    }    private void TestEndCallback() {        _textTimer.text = "End!!!";    }}

如有错误,欢迎指出。

email:dxmdxm1992#gmail.com

blog: http://blog.csdn.net/david_dai_1108

原创粉丝点击