Yo estoy trabajando en un motor "de la vieja escuela", y aunque se basa en tilemap hago algo que puede servirte.
Cada casilla del mapa ("plataforma", en tu caso) incluye el estado del "borde", indicando si es sólido o no. Así, cuando muevo un objeto compruebo si la casilla a la que va a entrar tiene el borde correspondiente sólido, y si es así entonces el objeto no puede desplazarse más allá. Por ejemplo, si es el jugador que está saltando, lo que compruebo es si es sólido por abajo, y si está cayendo, compruebo si es sólido por arriba, etc. Te pongo código real:
Código:
(* Checks adjacent tile. *)
FUNCTION TmngTileMap.CanMoveUp (aSpr: TmngSprite): BOOLEAN;
VAR
TileX, TileY, bL, bR, bT, bB: INTEGER;
BEGIN
aSpr.GetBoundingBox (bL, bT, bR, bB);
{ Comprueba la tesela ocupada por la parte superior izquierda del sprite. }
TileX := bL DIV fTileWidth;
IF TileX < 0 THEN EXIT (FALSE);
TileY := (bT - 1) DIV fTileHeight;
IF TileY < 0 THEN EXIT (FALSE);
IF (GetAttribute (TileX, TileY) AND tlBottom) <> 0 THEN EXIT (FALSE);
{ Comprueba la tesela ocupada por la parte superior derecha del sprite. }
TileX := bR DIV fTileWidth;
IF TileX >= fWidth THEN EXIT (FALSE);
RESULT := (GetAttribute (TileX, TileY) AND tlBottom) = 0
END;
Hay otros tres métodos para izquierda, derecha y abajo.
Como ves, primero obtengo el bounding box del objeto, después calcula la posición de la tesela, pero en tu caso sería buscar las plataformas cercanas y que estén en la posición correcta (debajo del objeto, por ejemplo). Como ves, sólo compruebo las teselas que están debajo del límite inferior del bounding box, tú sólo deberías comprobar las plataformas que están debajo del plano inferior del bounding box.
Después, en el juego...
Código:
{ Check if there is a wall and move sprite if it is possible. }
IF ((sX < 0) AND fMaze.CanMoveLeft (fSpr))
OR ((sX > 0) AND fMaze.CanMoveRight (fSpr)) THEN
fSpr.X := fSpr.X + sX
ELSE
sX := 0;
IF ((sY < 0) AND fMaze.CanMoveUp (fSpr))
OR ((sY > 0) AND fMaze.CanMoveDown (fSpr)) THEN
fSpr.Y := fSpr.Y + sY
ELSE
sY := 0;
sX y sY son la velocidad del objeto.
Si puedes trasladar eso a Unity, ya lo tienes.
Marcadores