Unity3d延迟,而真正的循环不起作用

时间:2016-03-08 12:57:49

标签: c# unity3d while-loop infinite-loop yield-return

我还在处理这个游戏,我遇到了另一个问题,我试图制作一个无限循环,等待每次执行几秒钟,我目前有:

StartScript.cs

using UnityEngine;
using System.Collections;
using ProgressBar;

public class StartScript : MonoBehaviour {

    private ProgressBarBehaviour hunger;
    private ProgressBarBehaviour stamina;
    private ProgressRadialBehaviour health;
    private ProgressBarBehaviour thirst;

    public void OnGUI(){
        this.hunger = GameObject.Find("hungerBar").GetComponent<ProgressBarBehaviour>();
        this.stamina = GameObject.Find("staminaBar").GetComponent<ProgressBarBehaviour>();
        this.health = GameObject.Find("healthBar").GetComponent<ProgressRadialBehaviour>();
        this.thirst = GameObject.Find("thirstBar").GetComponent<ProgressBarBehaviour>();

        this.health.Value = 100f;
        this.stamina.Value = 100f;

        StartCoroutine ("runHunger");
    }

    bool addBar(ProgressBarBehaviour target, float percentage){
        Debug.Log (percentage);
        if ((target.Value + percentage) <= 100f) {
            target.IncrementValue (percentage);
            return true;
        }
        return false;
    }

    bool damageBar(ProgressBarBehaviour target, float percentage){
        if ((target.Value - percentage) >= 0f) {
            target.DecrementValue (percentage);
            return true;
        }
        return false;
    }

    bool addRadial(ProgressRadialBehaviour target, float percentage){
        if ((target.Value + percentage) <= 100f) {
            target.IncrementValue (percentage);
            return true;
        }
        return false;
    }

    bool damageRadial(ProgressRadialBehaviour target, float percentage){
        if ((target.Value - percentage) >= 0f) {
            target.DecrementValue (percentage);
            return true;
        }
        return false;
    }

    IEnumerator runHunger(){
        while (true) {
            yield return new WaitForSeconds(10f);
            /*if (!this.addBar(this.hunger,5f)) {
                this.damageRadial(this.health,3f);
            }*/
            Debug.Log("Time: "+Time.time);
        }
    }

    IEnumerator runHealth(){
        while (true) {

        }
    }
    /*
    IEnumerator runThirst(){
        while (true) {

            if (!this.thirst.Add (2)) {
                this.health.Damage(8);
            }

        }
    }*/
}

你们可以看到我试图用while(true){}进行yield return new WaitForSeconds()循环,这个想法是它在每个循环中运行函数(在这个测试用例中)10秒。

第一次执行就像魅力一样,等待10秒钟,但之后它只等待0.1秒并再次执行。

我希望有人可以帮我解决这个问题。

2 个答案:

答案 0 :(得分:3)

我目前在您的代码中看到的错误太多了。

:此:

IEnumerator runHealth(){
    while (true) {

    }
}

将其更改为

IEnumerator runHealth(){
    while (true) {

        yield return null;
    }
}

IEnumerator runThirst(){
    while (true) {

        if (!this.thirst.Add (2)) {
            this.health.Damage(8);
        }
    }           
}

将其更改为

IEnumerator runThirst(){
    while (true) {

        if (!this.thirst.Add (2)) {
            this.health.Damage(8);
        }
        yield return null;
    }
}

如果你要在一个协程中有while(true),那么你必须得到一些回报,或者锁定你的程序。首先修复这些问题。最好在while循环的右括号之前使用它。

我确信您其他 脚本 转到覆盖其他脚本其他并执行相同的操作。在每个协同程序函数中将yield return null 放入每个 while循环

另一个大错误删除来自 OnGUI功能的所有代码,并将其置于启动功能中,如下所示。每帧调用代码的次数太多,这将导致,因为您将创建 许多 协同程序< / strong> 从不 停止,因为您的协程功能中的 while循环。将其放入开始功能将其称为一次

void Start()
{
    this.hunger = GameObject.Find("hungerBar").GetComponent<ProgressBarBehaviour>();
    this.stamina = GameObject.Find("staminaBar").GetComponent<ProgressBarBehaviour>();
    this.health = GameObject.Find("healthBar").GetComponent<ProgressRadialBehaviour>();
    this.thirst = GameObject.Find("thirstBar").GetComponent<ProgressBarBehaviour>();

    this.health.Value = 100f;
    this.stamina.Value = 100f;

    StartCoroutine ("runHunger");
}

答案 1 :(得分:2)

致电StartCoroutine ("runHunger"); 在OnGUI()以外的某个地方。它会工作的。因为每次调用OnGUI都会启动一个新的协同程序

在Start()或其他地方

中调用StartCoroutine