在特定时间内减少变量

时间:2017-08-17 13:42:45

标签: c# unity3d

所以当我的角色被敌人的火焰呼吸击中时,我想创造一个被火上浇油的角色的感觉。因此,当角色着火时,我希望他在特定的时间内失去特定的健康状况。

例如;让我说他已经着火3秒了,我想让他因为着火而失去30点生命值,我将如何均匀分配失去30点生命值3秒钟?我不希望30点伤害立即应用到健康状态,我希望它能够慢慢击退玩家的健康状况,以便在3秒内完成30点伤害。

游戏是用c#制作的。

感谢。

4 个答案:

答案 0 :(得分:5)

这就像moving Gameobject over time或随着时间的推移做某事。唯一的区别是您必须使用Mathf.Lerp而不是Vector3.Lerp。您还需要通过从玩家生命的当前值中减去您想要丢失的值来计算结束值。您将其传递到b函数的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;
}

<强>用法

让我们说玩家的生命是50,我们希望在2秒内删除3。 <{1}}秒后,新玩家的生命应为48

3

请注意,玩家的生命存储在StartCoroutine(loseLifeOvertime(50, 2, 3)); 变量中。在协同程序功能结束时,您必须使用newPlayerLife变量中的值手动指定玩家的生命。

答案 1 :(得分:0)

我想,你要找的是一个Coroutine。查看herehere以获取相关文档。它允许您与更新功能分开执行自定义健康减少操作。使用协同程序,您可以通过刻度来发生事情,并且您可以确定刻度线的时间。

答案 2 :(得分:0)

你可以使用couroutines。像这样:

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++;
    }
}

答案 3 :(得分:0)

所以这就是我最终做的事情。它导致火上的角色失去30点健康,你可以看到健康状况下降而不是间隔时间发生。

  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;
            }
        }
    }