Соприкосновение пуль и врагов в unity не работает, хотя присутствует и коллайдер и rigitbody
Есть объект player, который может стрелять пулями. На пулях висит circle collider(Is Trigger включен) и rigidbody 2d , гравитация нулевая. Также есть враги с capsule collider(Is Trigger включен) и точно таким же rigidbody 2d. При соприкосновении пуля и враг должн уничтожиться, но соприкосновения просто не происходит. Объекты находятся в одной плосткости(0 по оси z). Не могу найти ошибку. Код пули Bullet.cs:
using UnityEngine;
public class Bullet : MonoBehaviour
{
public float speed = 5f;
public Rigidbody2D rb;
private float destroyTime = 3f;
// Start is called before the first frame update
void Start()
{
Invoke("DestroyBullet", destroyTime);
Vector3 dir = Camera.main.ScreenToWorldPoint(Input.mousePosition) - transform.position;
rb.velocity = dir * speed * Time.deltaTime;
}
private void OnCollisionEnter2D(Collision2D collision)
{
if (collision.gameObject.CompareTag("Enemy"))
{
DestroyBullet();
Debug.Log("Попал");
}
}
private void DestroyBullet()
{
Destroy(this.gameObject);
}
}
Код врага Enemy.cs:
using UnityEngine;
public class Enemy : MonoBehaviour
{
[SerializeField] private int lives = 5; // count of lives
private Rigidbody2D rb;
private SpriteRenderer sprite;
private void Awake()
{
rb = GetComponent<Rigidbody2D>();
}
private void OnCollisionEnter2D(Collision2D collision)
{
if (collision.gameObject.CompareTag("Player"))
{
Player.Instance.Die();
}
if (collision.gameObject.CompareTag("Bullet"))
{
Die();
}
}
private void Die()
{
Destroy(this.gameObject);
}
}
Возможно пригодится код оружия(откуда стреляют) Weapon.cs:
using UnityEngine;
public class Weapon : MonoBehaviour
{
[SerializeField] private float offset = 0f;
public Transform firePoint;
public GameObject bullet;
public float timeShot;
public float startTime;
public static Weapon Instance { get; set; }
private void Awake()
{
Instance = this;
}
// Update is called once per frame
void Update()
{
Vector3 difference = Camera.main.ScreenToWorldPoint(Input.mousePosition) - transform.position;
float rotateZ = Mathf.Atan2(difference.y, difference.x) * Mathf.Rad2Deg;
transform.rotation = Quaternion.Euler(0f, 0f, rotateZ + offset);
if (timeShot <= 0)
{
if (Input.GetButtonDown("Fire1"))
{
Shoot();
timeShot = startTime;
}
}
else
{
timeShot -= Time.deltaTime;
}
}
private void Shoot()
{
Instantiate(bullet, firePoint.position, firePoint.rotation);
}
}
Ответы (1 шт):
Автор решения: Дмитрий Литвиненко
→ Ссылка
Ответ нашелся: при включенных триггерах объекты не взаимодействуют с помощью OnCollision2D. Нужно либо снять все триггеры(что я и сделал), либо использовать OnTriggerEnter2D.

