UnityScript:更新健康功能

UnityScript: Update Health Function

我正在制作的游戏有角色和敌人。当角色被击中时关闭健康。如果角色可以避免被击中 10 秒,它将恢复 5 点生命值。如果又过了 10 秒,他仍然没有被击中,他会再获得 5 分,并且这种情况会一直发生,直到角色恢复完全健康。如果角色在 10 秒完成之前被击中,他会失去健康,时间重新开始。

目前,当我 运行 C# 脚本时,它会做所有事情,除了继续为玩家提供生命值。如果我被击中,它会记录时间。 10 秒过去了,它给了我健康,但在那之后 Update 函数不再继续给我健康,它只做了一次。我认为我的逻辑某处不正确。大家怎么看??

public Slider healthBar;
public float HitResetTimer; //Resetsthetimerto0whenihavebeenhitwithinthe10seconds;
bool beenHit; //Return true or false if ihave been hit
float hitTimer; //keeps track of time from 0 to 10 if i have not been hit

void Awake()
{
    beenHit=false; //player has not been hit so= false
    hitTimer=0.0f; //Set to 0 because i have not been hit yet so no time needs to be registered
}

void OnTriggerEnter(Collider other)
{
    healthBar.value-=10;//If enemy hits character loses 10 points
    beenHit= true; //Is set to true because i have been hit
    hitTimer= HitResetTimer;//If cube hits something hitTimer is no longer time that has occured but reset to 0

}

void RestoreHealth()
{
    if(!beenHit&& healthBar.value<100)
        healthBar.value+=2;
}

//Usethisfor initialization
void Start () {

}

//Updateiscalledonceper frame
void Update () {

    if(beenHit)
    {
        hitTimer -=Time.deltaTime;

        if(hitTimer<0)
        {
            beenHit = false;
            RestoreHealth();
        }
    }

}

在您的 Update 方法中:

if(hitTimer<0)
{
    beenHit = false;
    RestoreHealth();
}

从所有 if 中取出 RestoreHealth();

void Update () {

    if(beenHit)
    {
        hitTimer -=Time.deltaTime;

        if(hitTimer<0)
        {
            beenHit = false;
        }
    }
 RestoreHealth();
}

重点是你检查 beenHit 以减少 hitTimer。一旦 hitTimer < 0 设置 beenHit = false 并执行 RestoreHealth();。在那之后,你有 beenHit = false 和一个 Update 方法,所有方法都在 if(beenHit) 中,它总是得到 false 状态。因此,您的代码永远不会到达 RestoreHealth();,直到您在 OnTriggerEnter() 中设置 beenHit = true,这又会重置计时器并再次等待 10 秒。


如何检查当前时间和角色上次被击中的时间之间的时间差。

float lastHit; // Holds last time character got hit

void Awake()
{
    lastHit = Time.time;
}

void OnTriggerEnter(Collider other)
{
    healthBar.value -= 100;//If enemy hits character loses 10 points
    lastHit = Time.time;
}

void RestoreHealth()
{
    if(healthBar.value<100)
        healthBar.value+=2;
}

//Updateiscalledonceper frame
void Update () {

    if (Time.time - lastHit > 10) // 10 seconds
    {   
        RestoreHealth();
    }
}

注意:你应该改变RestoreHealth()方法来给健康有特定的延迟(比如1秒)而不是在每一帧。因为Update会在匹配你的条件后每帧调用它。