Задержка Unity3d в то время как истинный цикл не работает

Я все еще работаю над игрой, и я столкнулся с другой проблемой, я пытаюсь сделать бесконечный цикл, который ждет пару секунд при каждом выполнении, в настоящее время у меня есть:


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 ответа

Решение

В вашем коде слишком много неправильных вещей, которые я сейчас вижу.

Это:

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) в сопрограмме у вас должно быть что-то типа return-return, иначе она заблокирует вашу программу. Исправьте эти проблемы в первую очередь. Хорошо иметь его непосредственно перед закрывающей скобкой цикла while.

Я уверен, что вы сделали это и в других скриптах.Перейдите к остальным остальным скриптам и сделайте то же самое. Положил yield return null внутри каждого цикла while в каждой функции сопрограммы.

ДРУГАЯ БОЛЬШАЯ ОШИБКА:Удалите каждый код из функции OnGUI и поместите его в функцию запуска, как показано ниже. Код вызывается слишком несколько раз за кадр, и это приведет к замедлению, так как вы будете создавать много сопрограмм, которые никогда не останавливаются из-за цикла while в функции сопрограммы. Помещение его в функцию Start вызовет его один раз.

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");
}

Позвоните StartCoroutine ("runHunger");где-то, кроме как в OnGUI(). Это будет работать тогда. Так как каждый раз, когда вызывается OnGUI, он запускает новую сопрограмму

Вызов StartCoroutine в Start() или в другом месте

Другие вопросы по тегам