所以当我的角色被敌人的火焰呼吸击中时,我想创造一个被火上浇油的角色的感觉。因此,当角色着火时,我希望他在特定的时间内失去特定的健康状况。
例如;让我说他已经着火3秒了,我想让他因为着火而失去30点生命值,我将如何均匀分配失去30点生命值3秒钟?我不希望30点伤害立即应用到健康状态,我希望它能够慢慢击退玩家的健康状况,以便在3秒内完成30点伤害。
游戏是用c#制作的。
感谢。
答案 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)
答案 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;
}
}
}