So a few months back I was working in a 2D project. It happened very frequently where 2D colliders (box etc) suddenly stop detecting collision for no reason. I have to disable/re-enable the collider or the gameObject the collider’s attached to for collision detection to get back. I thought this was a 2D bug. After some searching, I found a lot of people complaining about 2D so yeah, it’s a 2D bug… I got around it by writing a script that ‘refreshes’ the object on certain intervals (very silly)
But now I’m in 3D, and actually just came across this problem… I was recording a demo for my team and it happened a couple of times during that video. Have a look (@1:55 where I was shooting the left arm, but it didn’t react till I disabled/renabled its collider. Also its clearly visible after 3:10 - The right legs/thighs and his left arm afterwards… the raycast is just going right through them to the other side…)
If anyone have any idea It’d be really appreciated.
Thanks!
Edit:
A little info: I’m not instantiating bullets with speed and detecting their collision with body parts, I’m just using raycasts to shoot. Notice at 3:10 the raycast isn’t even intersecting/hitting the legs - when I disable/renable the leg it immediately detects the ray… In other words I don’t really need to shoot for some parts not to detect the raycast…
I actually have two raycasts, one for debugging (why you see the red ray with the red dot at the end…), and one for shooting (does the actual detection)
private void OnDrawGizmos()
{
Vector3 tipPos = gunTip.position;
Vector3 tipFwd = gunTip.forward;
Vector3 end;
RaycastHit hit;
if (Physics.Raycast(tipPos, tipFwd, out hit, Distance, shootingMask))
{
end = hit.point;
}
else end = tipPos + tipFwd * Distance;
GizHelper.DrawLine(tipPos, end, Color.red);
GizHelper.DrawSphere(dbgLastShot, .025f, Color.red);
GizHelper.DrawSphere(end, .025f, Color.red);
}
private void Shoot()
{
// Sound, muzzle and ammo decrease...
RaycastHit hit;
if (Physics.Raycast(gunTip.position, gunTip.forward, out hit, Distance, shootingMask))
{
log("Shot: " + hit.collider.name);
dbgLastShot = hit.point;
var receiver = hit.collider.GetInterface<IHitReceiver>();
if (receiver != null)
{
receiver.ReceiveHit(gunTip.position, damage);
}
}
}