Make platforms that collide with player from one direction but not the other.

I’m trying to make a platform object which the Character Controller can pass through if it collides with it from below or the sides, but does not go through it if he collides from above.

An example of this kind of platform can be seen here: http://www.youtube.com/watch?v=JFiQH2QMJFA

I was hoping there was a way to tell the Character Controller to ignore the collision reaction with the platform unless the collision flags showed the character coming from above. So far I haven’t been able to achieve this effect. Any advice is appreciated.

I’ve posted a script on this question which can remove the bottom faces from a MeshCollider at runtime. You can specify an angle limit

The Unity plane primitive has a one-sided collider: only the visible side generates collisions. You can use any object as the platform - just remove its original collider (if any), then create a plane (Hierarchy view, Create/Plane) and adjust its dimensions and position to be the platform “ground”. Finally, child the plane to the platform - you can even remove its Mesh Renderer to make it invisible (the collider is independent of the renderer).

EDITED: A simple and seamless alternative is to have a trigger childed to the platform and placed above it, like below:

alt text

In the Inspector, set isTrigger in both (the parent platform and the trigger). When the player enters this trigger, set the platform collider isTrigger to false; when the player exits the trigger, set the platform collider isTrigger to true (script attached to the childed trigger):

function OnTriggerEnter(other: Collider){
  if (other.tag == "Player"){
    transform.parent.collider.isTrigger = false; 
  }
}

function OnTriggerExit(other: Collider){
  if (other.tag == "Player"){
    transform.parent.collider.isTrigger = true;
  }
}