Тип «Кролик» уже определяет элемент под названием «OnTriggerEnter2D» с теми же типами параметров | Как создать несколько коллизий в одном сценарии

#unity3d

Вопрос:

Я хочу добавить несколько коллайдеров в свой сценарий кролика, но он показывает упоминание об ошибке ниже:

Тип «Кролик» уже определяет элемент с именем «OnTriggerEnter2D» с теми же типами параметров

Это мой код:

 private void OnTriggerEnter2D(Collider2D CoinCollider)
{
    if(CoinCollider.GetComponent<Coin>())
    {
        coinCount  = 1;
        Destroy(CoinCollider.gameObject);
    }
} 
private void OnTriggerEnter2D(Collider2D DiamondCollider)
{
    if(DiamondCollider.GetComponent<Diamond>())
    {
        DiamondCount  = 1;
        Destroy(DiamondCollider.gameObject);
    }
} 

private void OnTriggerEnter2D(Collider other)
{
    if (other.gameObject.CompareTag("Finish"))
    {
        other.gameOverPanel.SetActive(true);
        gameOver();
    }
}
 

Как создать несколько коллизий в одном скрипте?

Комментарии:

1. Вы бы использовали какую-то форму условного внутри одного метода, чтобы сказать, если я ударюсь о стену, сделайте это так, чтобы и т. Д.

Ответ №1:

У вас может быть только один OnTriggerEnter2D метод, который принимает a Collider2D в качестве аргумента. Объедините три ваших метода в один и используйте if else if else операторы//.

Приведенные ниже примеры сделаны с использованием предоставленного вами кода.

Пример 1

 private void OnTriggerEnter2D(Collider2D collision)
{
    if (collision.GetComponent<Coin>())
    {
        coinCount  = 1;
        Destroy(collision.gameObject);
    }
    else if (collision.GetComponent<Diamond>())
    {
        DiamondCount  = 1;
        Destroy(collision.gameObject);
    }
    else if (collision.gameObject.CompareTag("Finish"))
    {
        collision.gameOverPanel.SetActive(true);
        gameOver();
    }
}
 

Пример 2

Если вы хотите, чтобы все ваши 3 метода были разделены, вы можете переписать их в пользовательские методы, которые все вызываются из одного OnTriggerEnter2D метода.

 private void OnTriggerEnter2D(Collider2D collision)
{
    if (collision.GetComponent<Coin>())
    {
        TakeCoin(collision.gameObject);
    }
    else if (collision.GetComponent<Diamond>())
    {
        TakeDiamond(collision.gameObject);
    }
    else if (collision.gameObject.CompareTag("Finish"))
    {
        FinishAt(collision);
    }
}

private void TakeCoin(GameObject coin)
{
    coinCount  = 1;
    Destroy(coin);
}

private void TakeDiamond(GameObject diamond)
{
    DiamondCount  = 1;
    Destroy(diamond);
}

private void FinishAt(Collider2D finish)
{
    finish.gameOverPanel.SetActive(true);
    gameOver();
}