Unity 2D:while循环中的计时器不起作用,循环永远存在

时间:2018-11-26 02:58:11

标签: unity3d

我希望我的增强工作在游戏开始时从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。

2 个答案:

答案 0 :(得分:0)

如果要使用while循环进行检查,请将其用于IEnumerator中并等待每一帧。例如:

.exe

答案 1 :(得分:0)

我通过在更新中设置一个布尔值来实现,当激活该异能时翻转为true,而当条件不再满足时翻转为false。当布尔值翻转为true时,也可以调用该方法来保持所需的行为。我实际上遇到了与您相同的问题,但没有意识到收益回报为零是解决方案,所以这就是我想出的。

    if (ultCharge >= pilotUltMin && !pilotUlting && !pilotUltingPressed)
    {
        if (Input.GetButton(bumperR1))
        {
            pilotUltingPressed = true;
            pilotUlting = true;
            curCharge = ultCharge;
            pilotUltingPressed = false;
        }
    }

    if (pilotUlting)
    {
        PilotUlt();
    }
}

private void PilotUlt()
{
    if (ultCharge > curCharge - pilotUltMax && ultCharge >= 0)
    {
        rb.AddRelativeForce(Vector2.up * SwitchController.ShipSpeed * 1.5f, ForceMode2D.Impulse);
        ultCharge -= 0.7f;
        ultExhaust1.SetActive(true);
        ultExhaust2.SetActive(true);
    }
    else
    {
        pilotUlting = false;
        ultExhaust1.SetActive(false);
        ultExhaust2.SetActive(false);
    }
}