Задержка 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() или в другом месте