Diminuir a variável ao longo de um período de tempo específico

Então, quando meu personagem é atingido pela respiração do inimigo, eu quero criar a sensação de que o personagem está sendo incendiado. Então, enquanto o personagem está pegando fogo, eu quero que ele perca uma quantidade específica de vida por um período específico de tempo.

Por exemplo; vamos dizer que ele está pegando fogo por 3 segundos e eu quero fazer ele perder 30 pontos de vida por estar pegando fogo, como eu distribuiria uniformemente perdendo 30 pontos de vida por 3 segundos? Eu não quero que os 30 de dano sejam aplicados instantaneamente à saúde, eu quero que ele lentamente marque a saúde dos jogadores de forma que na marca de 3 segundos 30 de dano seja causado.

O jogo está sendo feito com c #.

Obrigado.

Isto é como mover o Gameobject ao longo do tempo ou fazer algo ao longo do tempo. A única diferença é que você tem que usar Mathf.Lerp vez de Vector3.Lerp . Você também precisa calcular o valor final subtraindo o valor que deseja perder com o tempo do valor atual da vida do jogador. Você passa isso para o parâmetro b ou segundo da function Mathf.Lerp .

 bool isRunning = false; IEnumerator loseLifeOvertime(float currentLife, float lifeToLose, float duration) { //Make sure there is only one instance of this function running if (isRunning) { yield break; ///exit if this is still running } isRunning = true; float counter = 0; //Get the current life of the player float startLife = currentLife; //Calculate how much to lose float endLife = currentLife - lifeToLose; //Stores the new player life float newPlayerLife = currentLife; while (counter < duration) { counter += Time.deltaTime; newPlayerLife = Mathf.Lerp(startLife, endLife, counter / duration); Debug.Log("Current Life: " + newPlayerLife); yield return null; } //The latest life is stored in newPlayerLife variable //yourLife = newPlayerLife; //???? isRunning = false; } 

Uso :

Vamos dizer que a vida do jogador é 50 e queremos remover 2 dele em 3 segundos. A vida do novo jogador deve ser 48 após 3 segundos.

 StartCoroutine(loseLifeOvertime(50, 2, 3)); 

Note que a vida do jogador é armazenada na variável newPlayerLife . No final da function de co-rotina, você terá que atribuir manualmente a vida do seu jogador com o valor da variável newPlayerLife .

Eu suponho, o que você está procurando é um Coroutine. Confira aqui e aqui a documentação. Ele permitirá que você faça suas ações de redução de integridade personalizadas separadamente da function de atualização. Usando coroutines você pode fazer algo acontecer por carrapatos, e você pode determinar quanto tempo o carrapato é.

Você poderia usar courotinos. Algo assim:

 void OnHitByFire() { StartCoroutine(DoFireDamage(5f, 4, 10f)); } IEnumerator DoFireDamage(float damageDuration, int damageCount, float damageAmount) { int currentCount = 0; while (currentCount < damageCount) { HP -= damageAmount; yield return new WaitForSeconds(damageDuration); currentCount++; } } 

Então é isso que acabei fazendo. Isso faz com que o personagem em chamas perca 30 pontos de vida e você pode ver a queda de velocidade ao invés de acontecer em intervalos.

  IEnumerator OnFire() { bool burning = true; float timer = 0; while (burning) { yield return new WaitForSeconds(0.1f); hp -= 1; timer += 0.1f; if (timer >= 3) { burning = false; } } }