首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >UnityScript:更新健康功能

UnityScript:更新健康功能
EN

Stack Overflow用户
提问于 2016-09-02 02:07:38
回答 1查看 69关注 0票数 0

我正在做的游戏有一个角色和敌人。当角色被击中是关闭健康。如果这个角色能避免被击中10秒,它将恢复5分的生命值。如果再过10秒,他仍然没有被击中,他又获得5分,这种情况一直持续到角色恢复全部生命为止。如果角色在10秒前就命中了,他就会失去生命,时间也会重新开始。

目前,当我运行C#脚本时,除了继续给播放器提供健康之外,它什么都做。如果我被击中它会记录下时间。10秒过去了,它给了我健康,但是在那之后,Update函数不再继续给我健康,它只做了一次。我觉得我的逻辑不对。你们觉得怎么样??

代码语言:javascript
复制
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();
        }
    }

}
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-09-02 03:12:13

在您的Update方法中:

代码语言:javascript
复制
if(hitTimer<0)
{
    beenHit = false;
    RestoreHealth();
}

RestoreHealth();从所有的if中拿出来。

代码语言:javascript
复制
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秒。

检查当前时间和那个角色上一次命中的时间之间的时间差如何?

代码语言:javascript
复制
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将在匹配您的条件后调用它的每个帧。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/39283312

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档