unity3d 为什么这个剧本在我摧毁之后还能继续命中目标?

q7solyqu  于 2022-11-25  发布在  其他
关注(0)|答案(4)|浏览(130)

我是Unity2D的新手。我正在尝试做城堡防御游戏。当产卵开始继承敌人重叠(他们应该),但当弓箭手的箭碰撞whit敌人它杀死他们所有。我到处寻找这个答案,但没有...我的问题是:有办法一次只击中一个目标吗
箭头脚本:

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

gt0wga4j1#

你的敌人都会受到伤害,因为摧毁一个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()方法(它可能看起来很像你现在在“敌人脚本”中列出的方法)。

klr1opcd

klr1opcd2#

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

8i9zcol2

8i9zcol23#

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

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

我希望它对你有用。

gj3fmq9x

gj3fmq9x4#

终于弄明白了。首先脚本是造成伤害的,所以我应该击中目标特定的次数,所以我不能停止箭头的碰撞,而不把它打开。所以我做了一个方法,即在箭头碰撞后被Invoked(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);
    }

也要感谢@Foggzie

相关问题