我有几个固定在对象上的状态栏,它们会随着时间的推移而缩短。如果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");
}
}
以下是有关脚本附件和对撞机的图像:
“ yellowBar(progBar)”等是指附加到状态栏画布图像上的脚本。因此,黄色的小消耗线(状态栏)为“ yellowBar”,它引用附加到各个状态栏(progBar)的脚本。
下面显示的是我正在谈论的示例。我重新填充蓝色条,此时它保持不变,直到我去重新填充黄色条,此时蓝色条又回到我重新填充时的数量。
答案 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。