x


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.

more ▼

asked May 18 '12 at 10:33 PM

TurplePurtle gravatar image

TurplePurtle
17 1 1 3

(comments are locked)
10|3000 characters needed characters left

2 answers: sort voted first

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

more ▼

answered May 20 '12 at 01:32 AM

Bunny83 gravatar image

Bunny83
45.1k 11 48 206

Works great! Thanks!

May 20 '12 at 04:40 AM TurplePurtle
(comments are locked)
10|3000 characters needed characters left

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;
  }
}
more ▼

answered May 19 '12 at 12:44 AM

aldonaletto gravatar image

aldonaletto
41.3k 16 42 195

Awesome! Passing through the plane isn't as seamless as I'd like, but it might work well with a few tweaks.

May 19 '12 at 01:02 AM TurplePurtle

There's a seamless alternative that uses a trigger instead of the plane collider - take a look at my answer.

May 20 '12 at 01:12 AM aldonaletto

The issue I see is that this assumes there will only be a single entity interacting with the platform at a time. Interesting approach though.

May 20 '12 at 04:31 AM TurplePurtle

You're right: when some character is over the platform, the others will get headaches trying to pass through it. Definitely, not suitable for multiple characters!

May 20 '12 at 12:15 PM aldonaletto
(comments are locked)
10|3000 characters needed characters left
Your answer
toggle preview:

Up to 2 attachments (including images) can be used with a maximum of 524.3 kB each and 1.0 MB total.

Follow this question

By Email:

Once you sign in you will be able to subscribe for any updates here

By RSS:

Answers

Answers and Comments

Topics:

x2485
x146
x37
x7
x5

asked: May 18 '12 at 10:33 PM

Seen: 1096 times

Last Updated: May 20 '12 at 12:15 PM