(Unity2D)统计栏问题增加和减少

时间:2018-10-05 05:52:15

标签: unity3d countdown

我有几个固定在对象上的状态栏,它们会随着时间的推移而缩短。如果PC与对象碰撞,则状态栏 的长度应稳定增加。

相反,条形图最大程度地延伸,并且直到PC与另一个统计条形对象交互时才开始再次缩短。在这一点上,横杆返回到之前的长度。

这是条形进度的代码:

void Update() { 
    if (contact) {
        Increase();
        Debug.Log("increasing");
    } else if (contact == false) {
        Decrease();
        Debug.Log("decreasing");
    } 
}

void Decrease() {
    if (filled > 0) {
        filled -= 0.006f;
        timerBar.fillAmount = filled / maxTime;
    }
}

void Increase() {
    if (filled < maxTime) {
        timerBar.fillAmount = (filled += 0.006f);
    }
}

在另一个脚本中,我保留了“联系人”定义的条件。

void OnCollisionEnter2D(Collision2D collision) {
    if (collision.gameObject.tag == "Player") {
        barProg.contact = true;
        Debug.Log("is touching");
    }
}

void OnCollisionExit2D(Collision2D collision) {
    if (collision.gameObject.tag == "Player") {
        barProg.contact = false;
        Debug.Log("is not touching");
    }
}

以下是有关脚本附件和对撞机的图像:

enter image description here

“ yellowBar(progBar)”等是指附加到状态栏画布图像上的脚本。因此,黄色的小消耗线(状态栏)为“ yellowBar”,它引用附加到各个状态栏(progBar)的脚本。

下面显示的是我正在谈论的示例。我重新填充蓝色条,此时它保持不变,直到我去重新填充黄色条,此时蓝色条又回到我重新填充时的数量。

gameplay

2 个答案:

答案 0 :(得分:0)

您想要这样的东西,这是伪的,所以请耐心等待。...

    bool healing=false;



    public void OnTriggerEnter2D(Collisider2D col)
   {
      if(col.tag=="Player")
      {
      healing = true;
      }
    }
    public void OnTriggerExit2D(Collisider2D col) 
    {
    if(col.tag=="Player")
      {
    healing = false;
      }
    }

    public void Update()
{
    if(healing)
  {
    if(filled<maxTime)
    {
     timerBar.fillAmount += 0.006f;
    }
  }
}

您的健康状况在不断提高,因此每个人都需要脚本。

您的PC必须标记为“ Player”才能捕捉到碰撞。

您的对象将需要对撞机,我想他们已经有了对撞机。

,无论是物体还是pc,都需要一个刚体。看来您已经拥有了大部分。之所以起作用,是因为布尔值。输入触发器时将其设置为true,离开触发器时将其设置为false。因此,在您触摸该项目时,仅对该项目进行tru,然后在其为true时进行更新,我们会增加Healthbar。

直接将此脚本放在您的每个对象上,可以防止它们相互冲突或更新错误对象。

祝你好运!

答案 1 :(得分:0)

我有一些建议,希望可以使您走上正确的道路。此脚本应附加填充状态栏的对象。您需要编写一个单独的脚本来根据fillpercentage实际调整状态栏,但我将留给您。该脚本仅负责跟踪填充量,不显示任何内容。这是将逻辑与UI分开的好习惯,因为您可以更改一个而不影响另一个。

此外,您应该避免在代码中使用“幻数”。改成变量。参见https://en.wikipedia.org/wiki/Magic_number_(programming)

此外,您可以使用bool在增加和减少之间切换,而不是调用单独的方法。这样可以将逻辑保持在同一位置,并使将来更容易更改它。

public class ColoredObject : Monobehaviour {

    //bool to switch increasing and decreasing
    bool increasing = false;

    //can set this value in inspector to adjust speed it fills
    //can even have different fill speeds for each color
    public float fillSpeed;

    //stores how full the bar is
    float percentageFull = 100;

    //if player contacts, start increasing
    void OnCollisionEnter2D(Collision2D collision) {
        if (collision.gameObject.tag == "Player") {
            increasing = true;
        }
    }

    //if player exits, start decreasing
    void OnCollisionExit2D(Collision2D collision) {
        if (collision.gameObject.tag == "Player") {
            increasing = false;
        }
    }

    void Update () {
        UpdateFill()
    }

    public void UpdateFill() {
        if (increasing) {
            //fill based on time passed since last frame
            percentageFull += fillSpeed * Time.deltatime;
        }
        else {
            //empty based on time passed since last frame
            percentageFull -= fillSpeed * Time.deltatime;
        }

        // keep it between 0 and 100%
        percentageFull = Mathf.Clamp(percentageFull, 0f, 100f);
    }
}

让我知道它的运行情况,如果这不是您想要的,我可以尝试帮助您进行微调。

编辑:如果您想要不同的增加和减少速度,只需添加另一个变量,然后在减少部分中替换fillSpeed。