2022-04-28 09:31阅读: 606评论: 0推荐: 0

【Unity】UI面板:倒计时器

一、添加文本(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:

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

以上

本文作者:HanaKoo

本文链接:https://www.cnblogs.com/HanaKoo/p/16201617.html

版权声明:本作品采用知识共享署名-非商业性使用-禁止演绎 2.5 中国大陆许可协议进行许可。

posted @   HanaKoo  阅读(606)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 【.NET】调用本地 Deepseek 模型
· CSnakes vs Python.NET:高效嵌入与灵活互通的跨语言方案对比
· DeepSeek “源神”启动!「GitHub 热点速览」
· 我与微信审核的“相爱相杀”看个人小程序副业
· Plotly.NET 一个为 .NET 打造的强大开源交互式图表库
@format
点击右上角即可分享
微信分享提示
💬
评论
📌
收藏
💗
关注
👍
推荐
🚀
回顶
收起
🔑
  1. 1 Tiny Light(TV动画《地缚少年花子君》ED)(翻自 鬼頭明里) 柚卟
Tiny Light(TV动画《地缚少年花子君》ED)(翻自 鬼頭明里) - 柚卟
00:00 / 00:00
An audio error has occurred.

作词 : Saku

作曲 : Saku

優しさに触れて残る温度

消えないまま 愛しいと言えたら

心は軽くなるかな

閉ざした扉の向こうで

微かな声が聴こえてる

踏み出すことさえも出来ないから

孤独に寄り添ってる

まだこの胸の中 生きづいたまま

小さな灯し火のような想いを

風に吹かれぬように

雨に濡れないように

ずっと抱きしめてた

ただ 真っ直ぐなまま願う強さも

泣き出しそうになる脆い自分も

君が居なきゃ知らなかったんだよ

偶然の中で運命を見つけた

瞳閉じる度 記憶の海 漂っては

深い夢のあと

面影を探してたんだ

変わらないモノクロの日々に

君が色を添えてくから

滲んだ過去さえもいつの間にか

意味を持ち始めてる

まだこの胸の中隠したままの

痛いほど愛おしい こんな思いを

いつか消えてしまうその前に

届けたい人は 君だけなんだ

どんな涙も どんな笑顔も

全ては君のためにあるから

まだこの胸の中 生きづいたまま

小さな灯し火のような想いを

風に吹かれぬように

雨に濡れないように

ずっと抱きしめてた

ただ 真っ直ぐなまま願う強さも

泣き出しそうになる脆い自分も

君が居なきゃ知らなかったんだよ

偶然の中で運命を見つけた

君がいるだけで世界は変わった