在Unity中获取任何对撞机对象的方法的最有效方法?

时间:2019-02-17 02:26:26

标签: c# unity3d

我有一个子弹游戏对象,可通过OnTriggerEnter2D()检测敌人。直到我添加了不同的敌人类型,这种方法才能正常运行:

private void OnTriggerEnter2D(Collider2D collision)
    {
        Enemy enemy = collision.GetComponent<Enemy>();
        if (enemy != null)
        {
            enemy.Destroy();
            GameObject effect_ = Instantiate(bulletEffect, transform.position, transform.rotation);
            Destroy(effect_, 0.5f);
            Destroy(gameObject);
        }

    }

因此,只要子弹与Enemy()相撞,它就应该调用其Destroy()方法。

问题是,现在我在游戏中添加了多个敌人,例如,有一个类别名称为Runner()的敌人,它具有自己的死亡方法。

我可以添加一个if条件,并循环遍历每种敌人类型,但是在添加更多敌人之后,这将变得乏味。

什么是最好的方法?

谢谢

3 个答案:

答案 0 :(得分:4)

为什么不让敌人决定发生什么事情?

private void OnTriggerEnter2D(Collider2D collision)
{
    Enemy enemy = collision.GetComponent<Enemy>();
    if (enemy != null)
    {
       enemy.DoDeathEffects(); //you will need to create this function.
       Destroy(gameObject);
    }
}

您的子弹永远不要决定敌人做什么,这就是敌人的权限。当您希望各种敌人具有不同的行为时,这意味着您将需要子类 Enemy类,并且DoDeathEffects()方法应同时为publicvirtual

答案 1 :(得分:1)

创建一个名为“ DamageBehavior”的脚本。给该脚本一个名为“ TakeDamage”的公共函数。将该脚本附加到每种类型 敌人,以便他们各自实施不同的目标。然后在您的OnTriggerEnter2D函数中,无论敌人是什么类型 已经发生冲突的,请调用其TakeDamage函数。

private void OnTriggerEnter2D(Collider2D other)
{
   if (other.CompareTag("Enemy"))
    {
        other.GetComponent<DamageBehavior>().TakeDamage();
    }
}

答案 2 :(得分:0)

如果所有敌人都继承自同一基类,则将死亡方法设为虚拟,并在子类中覆盖它。

替代方法是创建一个接口,并使您的组件实现该接口

interface IDeath
{
 void OnDeath();
}

比发生碰撞时要多,您可以执行GetComponent ()并获得对具有此方法的对象的引用,即使该对象不继承任何内容(它也需要继承MonoBehaviour,仅此而已)