- Home /
Physics2D.SetLayerCollisionMask delays before being applied
I'm currently working on a 2D platformer, and if the player touches a fatal hazard but has an extra life, they will temporarily become invulnerable, and able to walk through obstacles.
So the way I have this set up is that there are two public LayerMask objects in the character controller script. One for vulnerable, one for invulnerable. I set the values of these layer masks in Unity in the inspector for the character prefab.
The vulnerable LayerMask collides with hazards, obstacles, ground, power ups, and most other things.
The invulnerable (I call it the ghostLayerMask) LayerMask collides only with ground (prevents player from falling through floor -- only the main ground elements are set to this layer) and powerups.
But I'm getting inconsistent results using Physics2D.SetLayerCollisionMask() to set these to the character.
Layer 8 is dedicated to the main character so my code looks like this:
if (invulnerable)
{
Physics2D.SetLayerCollisionMask(8, ghostLayerMask);
}
else
{
Physics2D.SetLayerCollisionMask(8, vulnerableLayerMask);
}
It does work, but very inconsistently. After some debug logs and break points, I left the Physics2D Project Settings window open while running the game. I can see from the Layer Collision Matrix that after these methods are called, it takes 1 or 2 seconds to kick in. This, of course, makes for a bad player experience.
I've tried moving the if (invulnerable) check to Update() and FixedUpdate(), but I see the same results. The Console shows the method executed, but the Layer Collision Matrix only updates a few seconds later.
Is there a Physics2D flag I need to set or something? Any help or suggestions appreciated.
Unity 2017.1, Mac OS 10.12.5, iOS Platform in Build Settings
Your answer
Follow this Question
Related Questions
After Collision Matrix change in runtime, effects not immediatly visible 1 Answer
using IsTouchingLayer without collision 0 Answers
Is Overlap Circle Supposed to return inactive colliders? 1 Answer
Workarounds for Higher Control When Using Physics2D? 0 Answers
Physics2D.Linecast ignoring walls 1 Answer