User Tag List

Resultados 1 al 8 de 8

Tema: Plataforma con colisión solo desde arriba (de un solo sentido)

  1. #1
    Fecha de ingreso
    Nov 2005
    Ubicación
    Madrid
    Mensajes
    3,992
    Agradecer
    34
    Agradecido 149 veces en 87 posts
    Mencionado
    11 Post(s)
    Tagged
    0 Tema(s)

    Plataforma con colisión solo desde arriba (de un solo sentido)

    Buenas!

    Pues estoy experimentando con unity y me he encontrado con este asunto, he visto distintas soluciones por ahí pero me gustaría confirmar que no hay una forma built-in en unity para realizarlo.

    El caso es que para un juego de plataformas 2.5D, necesito que algunas plataformas se puedan atravesar saltando desde abajo pero que el personaje al caer sobre ellas se mantenga.

    En el modo 2D he visto que existe un componente muy chulo llamado Platform Effector 2D que te permite definir precisamente eso, decidir de qué lado de una plataforma existe colisión, sin embargo para 3D o 2.5D no veo que exista lo mismo, sabéis si existe algo similar?

    Es posible usar componentes de 2D en un juego 2.5D que todo estará en Z=0 ? (O al menos eso creo xD)

    Imagino que al final habrá que programarlo, pero si existe una solución más fina pues mejor!

    Muchas gracias!

  2. #2
    Fecha de ingreso
    Jan 2016
    Ubicación
    Cádiz
    Mensajes
    924
    Agradecer
    321
    Agradecido 109 veces en 73 posts
    Mencionado
    9 Post(s)
    Tagged
    0 Tema(s)
    Entradas de blog
    2
    creo que tengo entendido que 2.5D es totalmente 2D sino que usa esprites diseñados en 3D

  3. #3
    Fecha de ingreso
    Jun 2004
    Ubicación
    Valencia
    Mensajes
    2,116
    Agradecer
    11
    Agradecido 96 veces en 54 posts
    Mencionado
    32 Post(s)
    Tagged
    0 Tema(s)
    No la hay, lo que sea te lo comes tu con papas XD

  4. #4
    Fecha de ingreso
    Nov 2005
    Ubicación
    Madrid
    Mensajes
    3,992
    Agradecer
    34
    Agradecido 149 veces en 87 posts
    Mencionado
    11 Post(s)
    Tagged
    0 Tema(s)
    Cita Iniciado por Eskema Ver mensaje
    No la hay, lo que sea te lo comes tu con papas XD
    Oooooooooooooooh, bueno pues... A programar! Muchas thanks! XD

    Cita Iniciado por futu-block Ver mensaje
    creo que tengo entendido que 2.5D es totalmente 2D sino que usa esprites diseñados en 3D
    Pues esa esperanza tenía yo , pero se ve que no es tan fácil xD

  5. #5
    Fecha de ingreso
    Jul 2006
    Ubicación
    Madriz
    Mensajes
    985
    Agradecer
    104
    Agradecido 115 veces en 64 posts
    Mencionado
    15 Post(s)
    Tagged
    0 Tema(s)
    Hmmm, simplemente podrías activar o desactivar el flag "trigger" en los colisionadores de las plataformas según el personaje esté subiendo o bajando, no?

    Es decir, creas un script para las plataformas del estilo:

    Código:
    ...
    Collider collider;
    
    void Start() {
        collider = GetComponent<Collider>();
    }
    
    void Update() {
        // tendrías que tener una referencia de alguna manera a la velocidad del prota, yo aquí me lo invento, tendrás que verlo en tu caso
        collider.isTrigger = hero.velocity.y > 0;
    }
    ...
    Otra opción es directamente deshabilitar el collider si el prota está subiendo (lo de volverlo "trigger" es por si quieres saber además cuando está atravesando la plataforma porque quieras hacer algo) en plan: collider.enabled = hero.velocity.y < 0;

    El código te lo estoy poniendo así de memoria, pero con la idea no creo que te sea nada difícil implementarlo
    Última edición por DarkDijkstra; 23/06/2017 a las 11:12

  6. #6
    Fecha de ingreso
    Dec 2004
    Mensajes
    25,661
    Agradecer
    36
    Agradecido 960 veces en 629 posts
    Mencionado
    112 Post(s)
    Tagged
    0 Tema(s)
    Entradas de blog
    11
    Cita Iniciado por DarkDijkstra Ver mensaje
    Hmmm, simplemente podrías activar o desactivar el flag "trigger" en los colisionadores de las plataformas según el personaje esté subiendo o bajando, no?

    Es decir, creas un script para las plataformas del estilo:

    Código:
    ...
    Collider collider;
    
    void Start() {
        collider = GetComponent<Collider>();
    }
    
    void Update() {
        // tendrías que tener una referencia de alguna manera a la velocidad del prota, yo aquí me lo invento, tendrás que verlo en tu caso
        collider.isTrigger = hero.velocity.y > 0;
    }
    ...
    Otra opción es directamente deshabilitar el collider si el prota está subiendo (lo de volverlo "trigger" es por si quieres saber además cuando está atravesando la plataforma porque quieras hacer algo) en plan: collider.enabled = hero.velocity.y < 0;

    El código te lo estoy poniendo así de memoria, pero con la idea no creo que te sea nada difícil implementarlo
    Creo que con ese algoritmo podría darse el caso de que el personaje se quedase atascado en medio de la plataforma si la direccion del salto cambia antes de atravesarla por completo ¿no?; creo que sería mas simple que las plataformas solo fuesen colisionables si estan mas abajo que el personaje ¿no?
    OCULUS RIFT, AHORA A 450€ CON DOS MANDOS LA VR SE PUEDE VENDER A UN PRECIO RAZONABLE


  7. El siguiente usuario agradece a chipan este mensaje:

    DarkDijkstra (23/06/2017)

  8. #7
    Fecha de ingreso
    Jul 2006
    Ubicación
    Madriz
    Mensajes
    985
    Agradecer
    104
    Agradecido 115 veces en 64 posts
    Mencionado
    15 Post(s)
    Tagged
    0 Tema(s)
    Cita Iniciado por chipan Ver mensaje
    Creo que con ese algoritmo podría darse el caso de que el personaje se quedase atascado en medio de la plataforma si la direccion del salto cambia antes de atravesarla por completo ¿no?; creo que sería mas simple que las plataformas solo fuesen colisionables si estan mas abajo que el personaje ¿no?
    No te falta razón... no te sobra razón

    Si, cierto, más fácil, activa o desactiva según la coordenada Y del prota sea mayor o menor

  9. #8
    Fecha de ingreso
    Jan 2007
    Ubicación
    Ciudad Catedral, Reino de Dick
    Mensajes
    3,570
    Agradecer
    78
    Agradecido 70 veces en 54 posts
    Mencionado
    7 Post(s)
    Tagged
    0 Tema(s)
    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.
    Última edición por Ñuño Martínez; 23/06/2017 a las 14:25
    Proyectos actuales ----> Bufff..
    Entorno de desarrollo ----> Bufff...

Permisos de publicación

  • No puedes crear nuevos temas
  • No puedes responder temas
  • No puedes subir archivos adjuntos
  • No puedes editar tus mensajes
  •