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组件。