当前位置 : 主页 > 编程语言 > 其它开发 >

【Unity】UI面板:倒计时器

来源:互联网 收集:自由互联 发布时间:2022-05-30
一、添加文本(UI - text) 二、创建脚本(CountdownTimer) 第一种方法: 1、首先在方法外声明两个变量 private Text txtTimer; //存放组件的变量public int second = 120; //倒计时时间120秒 2、在Start方
一、添加文本(UI -> text)

二、创建脚本(CountdownTimer) 第一种方法:

1、首先在方法外声明两个变量

private Text txtTimer;    //存放组件的变量
public int second = 120;    //倒计时时间120秒

2、在Start方法内获取文本组件(需要引入UI命名空间:using UnityEngine.UI; )

private void Start()
    {
        //查找组件的 方法一    (适合查找一个,多个的话需要对变量遍历)
        txtTimer = GetComponent<Text>();
        //查找组件的 方法二    (按照指定名称查找)
        txtTimer = GameObject.Find("TextTimer").GetComponent<Text>();

    }

3、定义第一种方法需要使用的变量(记录当前时间的下一秒,用来判断执行代码)

private float nextTime = 1;//下次修改时间

4、定义Timer1方法

private void Timer1()
    {
        Debug.Log("Timer1 被调用");    // 打印调试
        if (second >=0)    // second < 0 停止倒计时
        {
            if (second <= 10)    //小于10秒则倒计时字体变红
            {
                txtTimer.color = Color.red;
            }

            if (Time.time >= nextTime)    // 当开计时的时间大于定义的1秒
            {
                second--;    //减一秒钟
                txtTimer.text = string.Format("{0:d2}:{1:d2}", second / 60, second % 60);    //格式化输出

                nextTime = Time.time + 1;   //变成当前时间的后一秒(为当前时间加1秒,判断当前时间后一秒再执行)
            }
        }
    }

5、将Timer1方法放入Update内即可

private void Update()
    {
        Timer1();
    }
第二种方法:

1、定义方法二用到的记录累加时间变量

private float totalTime;

2、在Start方法内获取文本组件(需要引入UI命名空间:using UnityEngine.UI; )

private void Start()
    {
        //查找组件的 方法一    (适合查找一个,多个的话需要对变量遍历)
        txtTimer = GetComponent<Text>();
        //查找组件的 方法二    (按照指定名称查找)
        txtTimer = GameObject.Find("TextTimer").GetComponent<Text>();

    }

3、定义Timer2方法

private void Timer2()    //每累加到1秒,执行一次,然后清空累加时间,从0开始重新累加(误差小)
    {
        //Debug.Log("Timer2 被调用");
        //取消调用(倒计时为0时)
        if (second == 0)
        {
            CancelInvoke("Timer2");
        }
        if (second > 0)
        {
            //Debug.Log("进入");
            //累加每帧间隔
            totalTime += Time.deltaTime;
            if (totalTime >= 1)
            {
                if (second <= 10)
                {
                    txtTimer.color = Color.red;
                }
                //Debug.Log("开始计时");
                second--;
                txtTimer.text = string.Format("{0:d2}:{1:d2}", second / 60, second % 60);
                //Debug.Log("计时结束");
                totalTime = 0;    //清空累加的时间
            }
        }
    }

4、放入Update方法执行

private void Update()
    {
        Timer2();
    }
第三种方法:

使用InvokeRepeating()或I nvoke()调用1或2方法

1、在Start方法内调用Timer1或Timer2方法

private void Start()
    {
        //查找组件的 方法一
        txtTimer = GetComponent<Text>();
        //查找组件的 方法二
        txtTimer = GameObject.Find("TextTimer").GetComponent<Text>();

        //重复调用(被执行的方法名称,第一次执行时间,每次执行间隔[开始运行程序后第几秒开始执行])
        InvokeRepeating("Timer1", 1, 2);

        //调用(方法名称,第一次执行时间[开始运行程序后第几秒开始执行])
        //Invoke("Timer2", 1);
    }
三、包含三种方法的总源代码
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;

/// <summary>
///倒计时
/// </summary>
public class CountdownTimer : MonoBehaviour
{
    private Text txtTimer;
    public int second = 120;

    private void Start()
    {
        //查找组件的 方法一
        txtTimer = GetComponent<Text>();
        //查找组件的 方法二
        //txtTimer = GameObject.Find("TextTimer").GetComponent<Text>();

        //重复调用(被执行的方法名称,第一次执行时间,每次执行间隔)
        //InvokeRepeating("Timer1", 1, 2);

        //名称,几秒之后开始执行
        //Invoke("Timer2", 1);
    }


    private float nextTime = 1;//下次修改时间

    private void Update()
    {
        //Timer1();
        Timer2();

    }

    ////////////////////////////////////第一种方法///////////////////////////
    private void Timer1()
    {
        //Debug.Log("Timer1 被调用");
        
        //取消调用(倒计时为0时)[第三种方法时使用]
        if (second == 0)
        {
            CancelInvoke("Timer2");
        }
        
        if (second >=0)
        {
            if (second <= 10)
            {
                txtTimer.color = Color.red;
            }

            if (Time.time >= nextTime)
            {
                second--;
                txtTimer.text = string.Format("{0:d2}:{1:d2}", second / 60, second % 60);

                nextTime = Time.time + 1;   //变成当前时间的后一秒
            }
        }
    }

    ////////////////////////////////////第二种方法///////////////////////////
    private float totalTime;
    private void Timer2()
    {
        //Debug.Log("Timer2 被调用");
        
        //取消调用(倒计时为0时)[第三种方法时使用]
        if (second == 0)
        {
            CancelInvoke("Timer2");
        }
        
        if (second > 0)
        {
            //Debug.Log("进入");
            //累加每帧间隔
            totalTime += Time.deltaTime;
            if (totalTime >= 1)
            {
                if (second <= 10)
                {
                    txtTimer.color = Color.red;
                }
                //Debug.Log("开始计时");
                second--;
                txtTimer.text = string.Format("{0:d2}:{1:d2}", second / 60, second % 60);
                //Debug.Log("计时结束");
                totalTime = 0;
            }
        }
    }
}
PS:

将定义好的文本从层级菜单拖到项目菜单可以生成预制件,再从项目菜单拖回层级菜单就可以快速制作多个倒计时器

以上

Love for Ever Day
网友评论