在统一2D中更新敌人健康栏

时间:2020-07-26 21:35:10

标签: c# unity3d

为什么这会把我敌人的所有生命线连接在一起,即使他们的实际生命值正在以指定的速度下降?

public class FillHealth : MonoBehaviour
{
    Image HealthBar;

    private NormalMonster normalMonster;
    // Start is called before the first frame update
    void Start()
    {
        HealthBar = GetComponent<Image>();
        normalMonster = GameObject.FindGameObjectWithTag("Normal Monster").GetComponent<NormalMonster>();
    }

    // Update is called once per frame
    void Update()
    {
        UpdateHealthLeft();
    }

    public void UpdateHealthLeft()
    {
        if (normalMonster.healthLeft > 0)
        {
            HealthBar.fillAmount = normalMonster.healthLeft / normalMonster.setHealth;
        }
    }
}

这是FillHealth中正在引用的脚本。据我了解,由于变量不是静态的,因此不应共享值。应该会找到每个敌人的健康栏。

public class NormalMonster : MonoBehaviour
{
    private float _normalSpeed = 2f;

    private float _BaseHealth = 20f;
    private float _HealthModifier;
    public float setHealth;
    public float healthLeft;

    

    // Start is called before the first frame update
    void Start()
    {
        UpdateHealth();
    }

    // Update is called once per frame
    void Update()
    {
        NormMonMov();
    }

    public void OnTriggerEnter2D(Collider2D other)
    {
        if (other.tag == "Arrows")
        {
            healthLeft -= Arrows.Damage;
            Destroy(other.gameObject);

            if (healthLeft <= 0f)
            {
                Destroy(this.gameObject);
                EarnedGold.earnedGold += 7;
                Spawn_Manager.enemyCount--;
            }
        }
    }

    public void UpdateHealth()
    {
        if (StageMode.StageLvl > 5)
        {
            _HealthModifier = (StageMode.StageLvl * 0.01f) * _BaseHealth;
            setHealth = Mathf.Round(_BaseHealth + _HealthModifier);
        }
        else
        {
            setHealth = _BaseHealth;
        }
        healthLeft = setHealth;
    }



    public void NormMonMov()
    {
        transform.Translate(Vector3.left * _normalSpeed * Time.deltaTime);
        transform.position = new Vector3(Mathf.Clamp(transform.position.x, -7.0f, 10), transform.position.y, 0);
    }


}

对于这个在这个周末刚开始团结起来的家伙来说,任何帮助将不胜感激。

2 个答案:

答案 0 :(得分:0)

像这样获得rect变换,而不是得到图像

public RectTransform healthBar;

并使用以下命令更改长度:

healthBar.sizeDelta = new Vector2(normalMonster.healthLeft,healthBar.sizeDelta.y);

答案 1 :(得分:0)

我认为问题出在normalMonster = GameObject.FindGameObjectWithTag("Normal Monster").GetComponent<NormalMonster>();

如果您有两个怪物 两者都有两个脚本,FillHealth和NormalMonster 这两个“ FillHealth”脚本都在场景中寻找 FIRST 游戏对象,该游戏对象的脚本标签为NormalMonster,因此两个怪物都指向完全相同的NormalMonster脚本(列表中的第一个)

将“ GameObject”的大写字母G更改为“ gameObject”的小写字母g

仍然不是编写此代码的最佳方法,但我认为这可能有用