为什么这个弹丸脚本在我摧毁它之后继续击中目标?



我是Unity2D的新手。我正在努力制作城堡防御游戏。当产卵者开始继承时,敌人会重叠(他们应该重叠(,但当弓箭手的箭与敌人相撞时,它会杀死所有敌人。我到处寻找答案,但一无所获。。。我的问题是:有没有办法一次只击中一个目标

箭头脚本:

void Start()
{
target = GameObject.FindGameObjectWithTag("Enemy").GetComponent<Transform>();

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

transform.position = Vector2.MoveTowards(transform.position, target.position, speedProjectile * Time.deltaTime);
}
private void OnTriggerEnter2D(Collider2D collision)
{ 
if (collision.gameObject.CompareTag("Enemy"))
{
Destroy(gameObject);
}

}

敌人脚本:

void Start()
{

target = GameObject.FindGameObjectWithTag("target3").GetComponent<Transform>();
}
// Update is called once per frame
void Update()
{

transform.position = Vector2.MoveTowards(transform.position, target.position, speed * Time.deltaTime);
}
private void OnTriggerEnter2D(Collider2D col)
{
if (col.gameObject.CompareTag("arrow"))
{  
EHealth -= HDamage;
}
if (EHealth <= 0) 
{
Destroy(gameObject);
}

你的敌人都受到了伤害,因为摧毁GameObject不是立即发生的事情(有充分的理由(。正因为如此,在一帧中,任何数量的敌人都可以被同一支箭击中。

如果你想依靠这些碰撞方法,我建议控制箭头而不是敌人的伤害,这样你就可以确保它只击中一次:

private bool dealtDamage = false;
private void OnTriggerEnter2D(Collider2D col) {  
// Only deal damage once
if (dealtDamage) { 
return; 
}
// Does the thing I hit have this "EnemyScript" ?
var enemy = col.gameObject.GetComponentInChildren<EnemyScript>();
if (enemy == null) {
return;
}

// Make this "DealDamage()" method public on your EnemyScript
enemy.DealDamage();
dealtDamage = true;
Destroy(gameObject);
}

然后去掉敌人脚本的OnTriggerEnter2D,因为箭头正在处理这一切。我不知道你敌人的剧本叫什么名字,所以我就叫它EnemyScript。这也调用了一个DealDamage()方法,你必须制作它(它可能看起来很像你目前在"Enemy Script"中列出的方法(

很难说给出的信息,根据你所说的,似乎所有的实体都只是一个实体(所以当你杀死一个敌人时,你杀死了唯一的敌人,也就是所有的敌人(。你可以让它们彼此独立运行。

也许你可以使用碰撞输入功能来检查子弹是否击中了敌人的身体。你可以使用下面的代码。。。

private bool isEntered = false;
void OnCollisionEnter(Collision collision)
{
if(isEntered) return;
if(collision.gameObject.tag == "enemy") isEntered = true;
....
....
}

我希望它对你有用。

终于想通了。首先,脚本会造成伤害,所以我应该击中目标特定的次数,这样我就无法在不重新打开箭头的情况下停止箭头的碰撞。所以我制作了一个方法,即在箭头碰撞后调用(InvokeRepeating(((,将bool返回为false。Update((中当然应该包含哪个方法(函数(;我不确定我说得对不对,因为我是一个初学者,但我希望这能帮助到别人D下面是代码:箭头脚本:

private void DealDamage()
{
if (hit == true)
return;
eHealth.EHealth -= hDamage.HDamage;
hit = true;
}
void OnTriggerEnter2D(Collider2D collision)
{ 
if (collision.gameObject.CompareTag("enemy"))
{
DealDamage();
Destroy(gameObject); //Destroying arrow on collision
}
}
private void HitSetter()
{
hit = false;
}
void Update()
{
InvokeRepeating("HitSetter", 0f, 1.1f);
}

敌人脚本:

void Update()
{
if (EHealth <= 0)
{
anim.SetBool("EnemyDie", true);
Destroy(gameObject, 0.833f);
}

也感谢@Fogzie

相关内容

最新更新