我正在做的游戏有一个角色和敌人。当角色被击中是关闭健康。如果这个角色能避免被击中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();
}
}
}发布于 2016-09-02 03:12:13
在您的Update方法中:
if(hitTimer<0)
{
beenHit = false;
RestoreHealth();
}把RestoreHealth();从所有的if中拿出来。
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将在匹配您的条件后调用它的每个帧。
https://stackoverflow.com/questions/39283312
复制相似问题