我有一个子弹游戏对象,可通过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条件,并循环遍历每种敌人类型,但是在添加更多敌人之后,这将变得乏味。
什么是最好的方法?
谢谢
答案 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()
方法应同时为public
和virtual
。
答案 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