我还在处理这个游戏,我遇到了另一个问题,我试图制作一个无限循环,等待每次执行几秒钟,我目前有:
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秒并再次执行。
我希望有人可以帮我解决这个问题。
答案 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