【问题标题】:Making a timer in Unity在 Unity 中制作计时器
【发布时间】:2018-11-04 09:14:32
【问题描述】:

我在 Unity 中遇到问题。我的项目需要倒计时。但是这个倒计时会计算2次。例如,一项工作将完成 3 秒,另一项工作将完成 2 秒,这些工作将继续进行。

【问题讨论】:

  • 显示你到目前为止所做的,然后只有别人可以建议你
  • 除了你所做的之外,你还需要进一步解释你需要什么。不同的计数器是同时运行还是等待另一个计数器完成后再开始?
  • @Everts 我相信他试图在下面给出的答案中进行解释。所以我相信这是给你的:“考虑一个对象。当程序开始时,右转 3 秒,左转 1 秒。它们会不断重复。两个计数器会相互跟随。”
  • 你为什么不为你的问题放一些代码?
  • 听起来应该放在协程中。

标签: c# unity3d time countdown


【解决方案1】:

协程(以及更多协程)

协程做你想做的事。

private IEnumerator Countdown2() {
    while(true) {
        yield return new WaitForSeconds(2); //wait 2 seconds
        //do thing
    }
}

private IEnumerator Countdown3() {
    while(true) {
        yield return new WaitForSeconds(3); //wait 3 seconds
        //do other thing
    }
}

然后通过调用 Start() 方法(或任何地方)来启动它们:

void Start() {
    StartCoroutine(Countdown2());
    StartCoroutine(Countdown3());
}

请注意,除非发生以下三种情况之一,否则这两种倒计时方法都将永远发挥作用:

  1. 调用StopCoroutine(...),传入StartCoroutine返回的引用
  2. 倒计时函数本身会返回(除非跳出无限的while(true) 循环,否则不会发生)
  3. 倒计时函数本身调用yield break

另外请注意,如果两个协程应该同时恢复(例如在 6 秒时)协程 2 将首先执行(因为它首先启动),除非有其他效果干预(例如,一个循环有另一个 @ 987654329@ 指令,循环之一终止,等等)。

【讨论】:

  • 据我了解,在这种情况下,每个协程中的任务是同时执行的。我错了吗?
  • 协程是同步的,意味着它们永远不会在完全相同的时间执行(即单独的线程并导致并发修改错误),但它们可以 在帧之间的相同时间点运行,一个接一个。见the flowchart
  • 我认为在这种情况下你会让每个方法每 5 秒运行一次,我错了吗?也许你想做等待 1 秒,然后增加 i 然后做模运算。
  • @Aron 不,任务 1 每 2 秒运行一次,任务 2 每 3 秒运行一次。重构以实现其他解决方案(“做 X 持续 N 秒”或“做 X,然后 Y”)也是可能,只需对协程进行相对较小的修改。
【解决方案2】:

根据您给出的使用示例,对象首先右转,然后左转:

考虑一个对象。程序启动后,右转3秒, 左转1秒后。他们会不断重复。二 计数器将彼此跟随。

下面我给你两个按顺序执行的计时器:第一个将持续 3 秒,第二个将持续 2 秒。一旦一个计数器完成另一个计数器将启动,这将在无限循环中重复。

float counterTask1 = 3f;
float counterTask2 = 2f;
float timer;
bool chooseTask;

void Start(){
    //Initialize timer with value 0
    timer = 0;
    chooseTask = 1;
}

void Update ()
{
    // Add the time since Update was last called to the timer.
    timer += Time.deltaTime;

    // This will trigger an action every 2 seconds
    if(chooseTask && timer >=  counterTask1)
    {
        timer -= counterTask1;
        chooseTask = 0;
        #Do Task 1 Here
    }else if(!chooseTask && timer >= counterTask2)
    {
        timer -= counterTask2;
        chooseTask = 1;
        #Do Task 2 Here
    }
}

我不确定这是否是您想要的。无论如何,已经有很多关于 Unity 计时器的问题。检查其中一些: https://stackoverflow.com/search?q=timer+in+Unity

【讨论】:

  • 两件事:1)这将起作用,但不可扩展。 2)你应该在触发时从计数器中减去持续时间,否则你会得到一些不同步(3.0518计时器秒,重置为零,失去0.0518秒的经过时间:20次迭代后,循环将运行迟到一秒!)
  • @Draco18s 感谢您的反馈,但我不知道如何减去持续时间。我相信您的回答会更有效,并且会得到我的 +1,但仅就用户给我的示例而言,尽管这种顺序计时器可能是一种足够简单的方法。
  • @MehmetGüneş 抱歉打错了,让我编辑答案
  • @IgnacioAlorre 而不是timer = 0f,它将是timer -= counterTask1(或counterTask2)。
  • @Draco18s 谢谢,我将使用此信息编辑答案
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-01-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-10-04
相关资源
最近更新 更多