Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/user-interface/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何制作带滑块的倒计时计时器_C#_User Interface_Unity3d_Timer - Fatal编程技术网

C# 如何制作带滑块的倒计时计时器

C# 如何制作带滑块的倒计时计时器,c#,user-interface,unity3d,timer,C#,User Interface,Unity3d,Timer,在我的游戏中,我有一个滑块,它代表剩余的时间量,剩余的时间每秒下降1。这是我想到的,但滑块不会下降,除非第一次有人能帮我修复代码 using System.Collections; using System.Collections.Generic; using UnityEngine; using UnityEngine.UI; using UnityEngine.SceneManagement; public class Timer : MonoBehaviour { public

在我的游戏中,我有一个滑块,它代表剩余的时间量,剩余的时间每秒下降1。这是我想到的,但滑块不会下降,除非第一次有人能帮我修复代码

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;
using UnityEngine.SceneManagement;

public class Timer : MonoBehaviour
{
    public float time = 100;
    public float totalTime = 100;
    public float duration = 1;

    public Slider slider;

    // Use this for initialization
    void Start()
    {
        time = totalTime;
        slider.value = time;
        StartCoroutine(CountDown());
    }

    // Update is called once per frame
    IEnumerator CountDown()
    {
        if (time > 0)
        {
            yield return new WaitForSeconds(duration);
            time -= 1;
            slider.value = time;
            yield return CountDown();
        }
    }
}

已解决:

public class Timer : MonoBehaviour
{
    public float timeLeft;
    public float maxTime = 100f;
    public float duration = 1;

    public Slider slider;

    // Use this for initialization
    private void Start()
    {
        timeLeft = maxTime;
        slider.value = timeLeft;
    }

    // Update is called once per frame
    void Update()
    {
        if (timeLeft > 0)
        {
            timeLeft -= Time.deltaTime;
            slider.value = timeLeft / maxTime;
        }
        else
        {
            Time.timeScale = 0;
        }
    }
}

您不完全了解协同路由和收益返回是如何工作的

简单地说,协程总是在收益返回时离开,允许下一帧开始,但让我们说,记住它离开的地方。在下一帧中,它将在它离开的地方继续

因此,如果您想使用协同程序,而不是像前面建议的那样在
update
中简单地执行协同程序,您可以使用以下两个选项:

  • 必须通过
    start例程()
    调用协同程序。所以你的台词

    yield return倒计时();
    
    你必须使用

    start例程(倒计时());
    
  • 如前所述,协同路由将在其离开点继续,因此您可以使用while循环,而不是if-else和一种递归调用:

    IEnumerator倒计时()
    {
    而(时间>0)
    {
    产生返回新的WaitForSeconds(持续时间);
    时间-=持续时间;
    slider.value=时间;
    //这将在此时离开协同程序
    //因此,在下一帧中,while循环继续
    收益返回空;
    }
    }
    

  • 我们需要一个更精确的问题描述,然后“不起作用”。@Christopher好的,我更改了description@Christopher你要帮我写代码吗please@ModusTollens-我已经部分修复了。OP现在应该编辑出答案并单独发布。@JonBergeron您能从问题中复制并剪切答案并粘贴到答案部分吗?如果你愿意,你甚至可以接受自己的答案。