Мне нужна помощь в моем проекте мобильной игры с открытым миром. У меня есть игрок, который может ходить и бегать, когда мы нажимаем кнопку. Я сделал колесо выносливости (как в zelda botw), и когда мой игрок бежит, выносливость уменьшается. Я также поставил сопрограмму регенерации, которая заставляет восстанавливать выносливость. Но поскольку мой maxStamina = 1, время между его полным и пустым очень быстро. Вот мой код:

public static StaminaUI instance;
private WaitForSeconds regenTick = new WaitForSeconds(0.1f);
private Coroutine regen;

private void Awake()
{
    instance = this;
}

void Start()
{
    fillAmount = maxFill;      
}

void Update()
{        
     if (Ybot.MoveSpeed > 5f)
     {
        UseStamina(0.015f);
     }  
     
     if (fillAmount < 0.01f)
     {
        Ybot.MoveSpeed = 0f;
        Ybot.animator.SetBool("isRunning", false);
        Ybot.animator.SetBool("isWalking", false);
    }

}

public void UseStamina(float amount)
{
    if (fillAmount - amount >= 0)
    {
        fillAmount -= amount;            

        if (regen != null)
        {
            StopCoroutine(regen);
        }

        regen = StartCoroutine(RegenStamina());
    }
    else
    {
        Debug.Log("Not enough stamina");
    }
}

private IEnumerator RegenStamina()
{
    yield return new WaitForSeconds(1);

    while (fillAmount < maxFill)
    {
        fillAmount += maxFill/1;         
        yield return regenTick;           
    }
    regen = null;

}

Надеюсь, кто-нибудь поможет мне решить эту маленькую проблему.

0
Matrixtrail 23 Фев 2021 в 23:13

2 ответа

Лучший ответ

Поскольку вы увеличиваете каждые 0.1 секунд, я думаю, что это должно быть

fillAmount += maxFill / desiredDuration * 0.1f;

Где desiredDuration - время в секундах, необходимое для полного заполнения выносливости, если это 0.


Или в качестве альтернативы для плавных обновлений вместо 0.1 вторых шагов, которые вы могли бы сделать

while (fillAmount < maxFill)
{
    fillAmount += maxFill / desiredDuration * Time.deltaTime;      
    yield return null;           
}
0
derHugo 23 Фев 2021 в 20:42

Вам нужно использовать Time.time, а затем выполнить регенерацию, если TIme.time> фиксированного интервала. Вы должны понимать, что обновление вызывается один раз за кадр. Это может означать, что его можно вызывать где угодно между 30-90 раз в секунду в зависимости от частоты обновления вашего устройства.

Обновление вызывается один раз для каждого кадра, поэтому в вашем коде вы должны сделать что-то подобное:

LastRegenTime и regenIntervals могут быть числами с плавающей запятой (что может быть дорогостоящим), но в Update логика будет ->

            if (Time.time - lastRegenTime > regenInterval)
            {
                Regenerate();
            }

Установите regenInterval на что-нибудь низкое, а затем установите инкрементор для жизни на life + = 0,02f; Вы даже можете делать это постепенно, или * = 0.00002f;

0
Apollo SOFTWARE 23 Фев 2021 в 20:36