OnCollisionEnter будет вызываться индивидуально один раз для каждого объекта, который начинает касаться вашего игрока в течение этого кадра.
Вам потребуется создать способ отслеживания нескольких вызовов OnCollisionEnter группы объектов, касающейся вашего игрока в этой точке. Один из способов - создать логическое значение для каждого типа проверяемого тега:
private bool touchedGround = false;
private bool touchedEnemy = false;
private void LateUpdate() {
touchedGround = false;
touchedEnemy = false;
}
private void OnCollisionStay2D(Collision2D collision) {
if (collision.gameObject.CompareTag("ground")) {
touchedGround = true;
}
if (collision.gameObject.CompareTag("enemy")) {
touchedEnemy = true;
}
if (touchedGround && touchedEnemy) {
isDead = true;
rb2d.velocity = Vector2.zero;
GameController.Instance.Die();
}
}
В конце каждого OnCollisionEnter вы проверяете, встречались ли оба тега. В LateUpdate вы сбрасываете флаги в false, чтобы следующий кадр вы перепроверяли.
Как примечание, это решение не очень расширяемо. Вы можете использовать слои (LayerMask) и немного логической логики, позволяющей сравнивать несколько категорий за одну операцию. Но это был бы другой вопрос.