Mesh collider doesn't call OnCollisionEnter for all collisions, only some

The issue I’m having is that the colliders are all working perfectly physics-wise (the player and bullets bounce off the objects), but do not always trigger OnCollisionEnter.

I’m making a 2.5d, top-down flight game with floating islands the player can fly around and shoot etc. The bullets need to collide with the islands and be destroyed.

The initial setup, which best suited my needs, was a concave mesh collider on the islands and a primitive collider and rigidbody on the bullet (along with my Bullet.cs script below). In this setup roughly 70% of the bullets go straight through the island or go through one side and collide with the back (this can be lowered to about 10% by massively dropping the fixed timestep). 25% of the bullets bounce off without triggering any of the OnCollision functions. Only about 5% trigger OnCollisionEnter.

I have tried a range of different combinations of collider setups based on suggestions I saw here and on the forums:

Changing the island mesh collider to convex meant that all the bullets hit the island, but only about 10% triggered OnCollisionEnter.

Adding a rigidbody along with the convex mesh collider meant that everything worked correctly. Unfortunately, a convex collider is no use to me.

Taking an hour or two to carefully build the island shape out of primitives also got good results.

From what I have read in the docs, the initial setup should work - a collision between a static, concave, mesh collider and a rigidbody, primitive collider should trigger OnCollisionEnter 100% of the time.

My next step is to start rebuilding all the island colliders with primitives, or put together a script to do that for me, but I am hoping that I’ve done some silly little thing wrong which can be fixed before I have to invest all that time.

Thanks to anyone who can offer some help!!


using UnityEngine;
using System.Collections;

public class Bullet : MonoBehaviour {
	public float speed = 60;
	void Awake() 
		rigidbody.velocity = transform.TransformDirection(Vector3.forward * speed);
	void OnCollisionEnter(Collision collision) 
		Debug.Log("Bonk " + collision.gameObject);
	protected void KillSelf() 
		var sphere = GameObject.CreatePrimitive(PrimitiveType.Sphere);
        sphere.transform.position = gameObject.transform.position;


ok your issue is that the bullet is literally just teleporting thru the plane of the collider, what u should do is take the collider off the bullet and keep it for visual effect only and then make a raycast bullet system that detects the shot, then you wont get any bullet failures