繁体   English   中英

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

[英]Updating Enemy Health bar in unity 2d

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

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 中引用的脚本。 据我了解,由于变量不是 static,因此不应共享这些值。 它应该为每个单独的敌人找到填充健康栏。

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);
    }


}

对于这个周末刚开始团结一致的人,任何帮助将不胜感激。

不是获取图像,而是获取矩形变换,如下所示

public RectTransform healthBar;

并更改长度:

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

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

如果你有两个怪物 两个都附加了两个脚本,FillHealth 和 NormalMonster 两个“ FillHealth ”脚本都在场景中寻找第一个带有标签 NormalMonster 脚本的游戏对象,因此两个怪物都指向完全相同的 NormalMonster 脚本(第一个在名单)

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

仍然不是最好的编码方式,但我认为这可能有效

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM