Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/318.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 更新unity 2d中的敌人健康栏_C#_Unity3d - Fatal编程技术网

C# 更新unity 2d中的敌人健康栏

C# 更新unity 2d中的敌人健康栏,c#,unity3d,C#,Unity3d,为什么这会将我的敌人的所有生命条连接在一起,即使他们的实际生命值正在以指定的速度下降 public class FillHealth : MonoBehaviour { Image HealthBar; private NormalMonster normalMonster; // Start is called before the first frame update void Start() { HealthBar = GetCom

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

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;
        }
    }
}
公共类健康:单一行为
{
图像健康栏;
私人怪物;
//在第一帧更新之前调用Start
void Start()
{
HealthBar=GetComponent();
normalMonster=GameObject.FindGameObjectWithTag(“普通怪物”).GetComponent();
}
//每帧调用一次更新
无效更新()
{
UpdateHealthLeft();
}
public void UpdateHealthLeft()
{
如果(normalMonster.healthleet>0)
{
HealthBar.fillAmount=normalMonster.healthleet/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);
    }


}
公共类怪物:单一行为
{
专用浮点数_normalSpeed=2f;
专用浮点数_BaseHealth=20f;
私人浮动;
公共卫生;
公共交通:左;
//在第一帧更新之前调用Start
void Start()
{
更新健康();
}
//每帧调用一次更新
无效更新()
{
NormMonMov();
}
公共无效OnTriggerInter2d(碰撞的R2D其他)
{
如果(other.tag==“箭头”)
{
healthLeft-=箭头。损坏;
销毁(其他游戏对象);
如果(左5)
{
_HealthModifier=(StageMode.StageLvl*0.01f)*\u基本健康;
setHealth=Mathf.Round(_BaseHealth+_healthmeditor);
}
其他的
{
setHealth=_BaseHealth;
}
healthleet=setHealth;
}
公共空间规范
{
transform.Translate(Vector3.left*_normalSpeed*Time.deltaTime);
transform.position=新矢量3(数学钳位(transform.position.x,-7.0f,10),transform.position.y,0);
}
}

对于这个周末刚开始玩unity的家伙来说,任何帮助都将不胜感激。

与其获得图像,不如获得rect变换,如下图所示

public RectTransform healthBar;
并使用以下命令更改长度:

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

我认为问题在于
normalMonster=GameObject.FindGameObjectWithTag(“normalMonster”).GetComponent();

如果你有两个怪物 两者都附带了两个脚本:FillHealth和NormalMonster 两个“FillHealth”脚本都会查找场景中第一个带有标记NormalMonster的脚本的游戏对象,因此两个怪物都指向完全相同的NormalMonster脚本(列表中的第一个)

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


这仍然不是最好的编码方式,但这可能会起作用。我想,与GetComponent不同,GetComponent是否在本周末才开始使用Unity或任何类型的游戏设计。识别我想要的游戏对象的最佳实践是什么?如果这是一个更深入的对话,无需深入讨论,因为我会做更多的研究rch.谢谢!我不是一个导出者,但是我发现下面的方法工作得很好,可以确保您的脚本指向您期望的资产,并且运行时会出现错误,指出错误的确切位置:
[SerializeField]private Image theImage;
在编辑器中将资源拖动到的静态链接,而不是查找NormalMonster组件。您应该在inspector中添加NormalMonster字段并拖动要修改的字段。即,使NormalMonster成为publuc,从开始删除查找行,然后在inspector中拖动NormalMonster组件。