User Tag List

Resultados 1 al 9 de 9

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

  1. #1

    Fecha de ingreso
    Nov 2005
    Ubicación
    Madrid
    Mensajes
    4,183
    Mencionado
    16 Post(s)
    Tagged
    0 Tema(s)
    Agradecer Thanks Given 
    56
    Agradecer Thanks Received 
    253
    Thanked in
    Agradecido 154 veces en [ARG:2 UNDEFINED] posts

    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
    3,294
    Mencionado
    36 Post(s)
    Tagged
    0 Tema(s)
    Agradecer Thanks Given 
    1,525
    Agradecer Thanks Received 
    707
    Thanked in
    Agradecido 464 veces en [ARG:2 UNDEFINED] posts
    Entradas de blog
    3
    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,122
    Mencionado
    33 Post(s)
    Tagged
    0 Tema(s)
    Agradecer Thanks Given 
    11
    Agradecer Thanks Received 
    102
    Thanked in
    Agradecido 57 veces en [ARG:2 UNDEFINED] posts
    No la hay, lo que sea te lo comes tu con papas XD

  4. #4

    Fecha de ingreso
    Nov 2005
    Ubicación
    Madrid
    Mensajes
    4,183
    Mencionado
    16 Post(s)
    Tagged
    0 Tema(s)
    Agradecer Thanks Given 
    56
    Agradecer Thanks Received 
    253
    Thanked in
    Agradecido 154 veces en [ARG:2 UNDEFINED] posts
    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
    1,297
    Mencionado
    28 Post(s)
    Tagged
    0 Tema(s)
    Agradecer Thanks Given 
    176
    Agradecer Thanks Received 
    322
    Thanked in
    Agradecido 172 veces en [ARG:2 UNDEFINED] posts
    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 12:12

  6. #6

    Fecha de ingreso
    Dec 2004
    Mensajes
    28,615
    Mencionado
    199 Post(s)
    Tagged
    0 Tema(s)
    Agradecer Thanks Given 
    188
    Agradecer Thanks Received 
    2,607
    Thanked in
    Agradecido 1,629 veces en [ARG:2 UNDEFINED] posts
    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?
    Google stadia es un fracaso, google stadia funciona mal, google admite su fracaso con stadia la latencia es el problema intrinseco de stadia, el público abandona google stadia, stadia mal.

  7. El siguiente usuario agradece a chipan este mensaje:

    DarkDijkstra (23/06/2017)

  8. #7

    Fecha de ingreso
    Jul 2006
    Ubicación
    Madriz
    Mensajes
    1,297
    Mencionado
    28 Post(s)
    Tagged
    0 Tema(s)
    Agradecer Thanks Given 
    176
    Agradecer Thanks Received 
    322
    Thanked in
    Agradecido 172 veces en [ARG:2 UNDEFINED] posts
    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,638
    Mencionado
    7 Post(s)
    Tagged
    0 Tema(s)
    Agradecer Thanks Given 
    151
    Agradecer Thanks Received 
    100
    Thanked in
    Agradecido 79 veces en [ARG:2 UNDEFINED] posts
    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 15:25
    Proyectos actuales ----> MinGRo
    Entorno de desarrollo ----> FreePascal | Vim

  10. #9

    Fecha de ingreso
    Sep 2011
    Ubicación
    En una consola portátil de 4 bits
    Mensajes
    160
    Mencionado
    1 Post(s)
    Tagged
    0 Tema(s)
    Agradecer Thanks Given 
    2
    Agradecer Thanks Received 
    1
    Thanked in
    Agradecido 1 vez en 1 post
    Sé que el tema es viejo ya, pero quería decir que en principio sí, las herramientas 2D (o al menos las que conozco) se pueden usar en 3D y viceversa. Por mucho que digan (a menos que haya cambiado mucho la cosa en el último año) Unity no tiene motor 2D, sino el mismo motor 3D funcionando en un plano único de z.
    De hecho, el circle collider se suele usar en las ruedas de los coches en los ejemplos 3D de carreras.

    Yo usaría para lo de las colisiones de las plataformas algo similar a lo que se hace para detectar el suelo: usar un trigger en la cabeza, y cuando detecte colisión con una plataforma, la mueva a un layer de colisión diferente en la que el prota no choque, y cuando choque con la que tiene en los pies, se vuelva a la capa de colisión sólida para el prota. Aun quedaría solucionar el tema de los enemigos, pero creo que moviendo a los malos entre sus dos propias capas de colisión (para que puedan seguir interactuando con el prota de forma independiente a las plataformas) puede servirte.
    Lo mismo, como el tema de las colisiones lo lleva la gráfica y va integrado en el motor, te da hasta más rendimiento que usando aritmética discreta.

Permisos de publicación

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