【发布时间】:2018-11-26 18:05:25
【问题描述】:
我希望在游戏开始时从 0 开始进行提升工作。
在我的游戏中,我可以捡起助推币来填满我的助推器罐。
public static int boost;
private void OnTriggerEnter2D(Collider2D otherObject)
{
if (otherObject.tag == "Boost")
{
boost++;
GetComponent<AudioSource>().PlaySound(BoostSound, 5.7F);
Destroy(otherObject.gameObject);
}
}
在玩家拾取足够的助推器硬币以在 2d 车辆中使用助推器后。
您至少需要 3 次提升才能启动助推器。每个助推器硬币等于 1 秒的助推器。
我只是希望玩家在收集到超过 3 个助推币时能够使用助推器,如果他们有 3 个或更多代表他们可以使用助推器的秒数。
按钮调用代码
public void BoostButton()
{
StartCoroutine("Use_VehicleBoost");
}
按钮调用的助推器代码。
IEnumerator Use_VehicleBoost()
{
// Check which boost package player picked
int boostLevel = SecurePlayerPrefs.GetInt("BoostLevel");
if (boostLevel == 0)
{
Debug.Log("Boost Level: None");
yield return null;
}
else if (boostLevel == 1)
{
Debug.Log("Boost Level: 1");
float aceleRate = 400, maxFWD = -2500;
while (Player.boost >= 3)
{
vehicleController.GetComponent<CarMovement>().accelerationRate += aceleRate;
vehicleController.GetComponent<CarMovement>().maxFwdSpeed += maxFWD;
// Meant to slowly take one point/ Time second away from boost tank
Player.boost = Player.boost - Mathf.RoundToInt(Time.deltaTime);
}
if (Player.boost <= 0)
{
yield return null;
}
}
yield return null;
}
问题:代码卡在 while 循环中,导致 Unity 冻结。它永远无法逃脱循环,但是如果我在循环运行时使用 deltaTime 调用 --boost 怎么办。
【问题讨论】:
-
yield return null应该在while循环块中。现在,它不是。您可以在while循环之外和if语句中使用它。 -
这是我错过的谢谢。为什么没有yield返回null时while循环不能中断?
-
因为
Player.boost >= 3始终为真。循环中断必须为假。现在,如果您将while循环内的Player.boost更改为false,它会起作用。如果您在 another 脚本中更改Player.boost,它将无法正常工作,因为其他脚本将永远无法运行更改,因为您的while循环。当您向其中添加yield return null时,它将告诉Unity 在while循环结束时等待每一帧。在等待每一帧时,其他脚本现在可以运行,因此您的Player.boost将有机会被更改..... -
啊,所以
yield return null是公开阻止它的原因。所以Player.boost没有倒计时,while 循环中的Player.boost - Time.deltaTime怎么倒计时?是不是靠着框架就保不住价值了? -
您不会在该循环中更改
Player.boost,因此只要while (Player.boost >= 3)为真,while 循环就会一直运行。这就是导致冻结的原因。Player.boost不是PlayerScripts.boost。要更改它必须是Player.boost = somethingMoreOrEqualsTo3。
标签: unity3d