Noticias

¡RECUERDA QUE SI ERES UN NUEVO USUARIO, DEBES PRESENTARTE PARA PODER PUBLICAR MENSAJES! | TENEMOS CANAL OFICIAL DE TELEGRAM: t.me/unity3dspain

Temas recientes

sin ideas para colision y deteccion de unidades en tilemap (principiante)

Iniciado por jaunco325, Enero 07, 2020, 11:33:35 PM

Tema anterior - Siguiente tema
Enero 07, 2020, 11:33:35 PM Ultima modificación: Enero 09, 2020, 09:45:25 AM por nomoregames
hola. estoy trabado en algo que no se como hacerlo. por si alguen puede ayudarme o darme una pista de que es lo que tengo que buscar.
 
explico: estoy haciendo un RTS, dibuje el mapa con tilemap y quiero que los respectivos composite collider de las diferenes zonas se comporten como collision para algunas unidades (para que algunas unidades no puedan pasar) y como trigger para otras (para que si puedan pasar pero se siga detectando que estan en la zona para asi recibir por codigo un cambio en sus variables). hay algun codigo para detectar el tag del otro collider y que no lo deje pasar a pesar de ser un trigger, o alguna otra cosa que pueda ayudarme?
 
otro problema que tuve (si esto necesita un post aparte avisenme y lo creo): cree 3 tilemaps diferentes en el mismo grid (tierra, agua, arboles) para poder añadir 3 composite collider diferentes, pero el suelo abarca todo el mapa y por encima tiene pintado el resto de cosas, entonces su collider va a abarcar todo el mapa tambien. pensando en esto me di cuenta que si llegara a pintar por error un arbol arriba del agua o viceversa tendria colliders encimados. hay alguna forma de hacer que al pintar un tile borre los tails de otros tilemaps diferentes, o alguna otra cosa que pueda ayudarme?

1º Estas muy lejos del camino a seguir. 
 
2º Para los RTS o muchos otros juegos las entidades utilizan Pathfinding, el más simple y utilizado es A*
 
3º Si vas a utilizar un sistema de tiles no tiene mucho sentido utilizar colisión para todo, dejaría las colisiones para las entidades.
 
4º Si estas con esta duda es por que aún te falta mucho por aprender... Te recomiendo empezar por algo más simple.

Coincido con @francoe1, separaría los colliders en zonas o "segmentos", para evaluar los distintos enemigos.
 
Has de aprender a diferenciar lo que son "decorados" con objetos interactivos/colisiones. No necesariamente deben estar unidos porque sí.
 
Por otra parte, es muy habitual separar los decorados de los escenarios por "capas", en el sentido en que tienes una capa de Tilemap separada sólo para "suelo", y luego ya capas superiores con objetos, sea navegación (caminos), o interacción (postes, objetos, etc). Todo depende de cómo quieras hacer el juego, pero según qué casos, te puede salir más a cuenta hacer un uno TileMap dónde el suelo ya venga implícito en la propia pieza del Tile.
 
 
 
Consejo: No trates de hacerlo todo modular porque sí. Busca la forma más fácil para ti de entender y conseguir lo que tratas de hacer, y poco a poco vas aprendiendo a pulir la técnica.

Cita de: francoe1 date=15784467781º Estas muy lejos del camino a seguir. 
   
   
      2º Para los RTS o muchos otros juegos las entidades utilizan Pathfinding, el más simple y utilizado es A*
   
   
      3º Si vas a utilizar un sistema de tiles no tiene mucho sentido utilizar colisión para todo, dejaría las colisiones para las entidades.
   
   
      4º Si estas con esta duda es por que aún te falta mucho por aprender... Te recomiendo empezar por algo más simple.
   


1: si me lo imagine pero era lo unico que se me ocurria.

2: si pero eso es el algoritmo de busqueda de caminos. yo estoy hablando de la interaccion de las unidades con su entorno.

3: dejame ver si entendi, entidades = unidades mobiles? eso no haria que las unidades mobiles solo puedan interactuar entre ellas?

4: te doy toda la razon, pero no se con que. si cancelo esto solo me quedaria esperando a que me surga algo que hacer. antes de hacer mi juego iba a ayudar a alguien con un RPG 2D para practicar un poco, pero cancelo el proyecto. a menos que sea buena idea ponerme a copiar juegos solo para ver si puedo hacerlos y luego borrarlos?
 
Cita de: pioj date=1578463532Coincido con @francoe1, separaría los colliders en zonas o "segmentos", para evaluar los distintos enemigos.
   
   
      Has de aprender a diferenciar lo que son "decorados" con objetos interactivos/colisiones. No necesariamente deben estar unidos porque sí.
   
   
      Por otra parte, es muy habitual separar los decorados de los escenarios por "capas", en el sentido en que tienes una capa de Tilemap separada sólo para "suelo", y luego ya capas superiores con objetos, sea navegación (caminos), o interacción (postes, objetos, etc). Todo depende de cómo quieras hacer el juego, pero según qué casos, te puede salir más a cuenta hacer un uno TileMap dónde el suelo ya venga implícito en la propia pieza del Tile.
   
   
       
   
   
      Consejo: No trates de hacerlo todo modular porque sí. Busca la forma más fácil para ti de entender y conseguir lo que tratas de hacer, y poco a poco vas aprendiendo a pulir la técnica.
   


voy por parrafos:

1: definitivamente no entendi. no es eso lo que yo quize hacer y lo contrario a lo que dijo francoe1?

2: si pero mi juego no tiene decoraciones, todo lo que mencione son terrenos y queria que la unidad se comporte diferente segun el terreno en el que "esta parada".

3: otra cosa que lo que entendi es basicamente lo que hice. excepto la ultima oracion, un tilemap en el que el suelo este implicito en el propio tile? lo podrias explicar un poco mas?

4: eso intento.

hola
 
no he usado nunca TileMap pero he mirado la documentacion y lo que porejemplo puedes hacer si quieres saber encima de que tipo de Tile estas:
 
"TileMap" tiene una funcion "getTile(posicion)" te devuelve el "tile".
 
"Tile" tiene la variable "Sprite" y "sprite" tiene la variable "Texture" y "texture tiene la variable "name" que te dice el nombre de la textura
 
luego haces lo que sea dependiendo del nombre de la textura.
 
tambien desde el "renderer" puedes acceder al sprite y a la texture y entonces a su nombre....
 
..pero como te he dicho al principio nunca he usado tileMap y no se si estos metodos funcionaran realmente como yo supongo...
 
...y no se si te servira saber el nombre para lo que quieres
 
 

Enero 09, 2020, 10:50:32 PM #5 Ultima modificación: Enero 10, 2020, 12:36:54 AM por J Montes
Respecto a tu pregunta:
 


  •    Podrías poner unas unidades en una capa y otras en otra, y crear diferentes colliders. En un collider puedes especificar con qué capas interactúan. Esto para mí tendría sentido si las capas pertenecen cada una a un jugador, o a "jugador" y "npc", o incluso "tierra" y "mar" (raro hacer esto), pero no si quieres separar varios tipos de unidades entre sí.


  •    Si se trata de muchos grupos (ej. tipos de unidades), puedes convertir todos esos colliders en triggers y usar tu propio código para impedir que entren en ellos (o sacarlos si ya han entrado).


Ahora bien. Los colliders tienen uso para calcular colisiones de geometrías más o menos complejas, sujetas a interacciones más o menos complejas (por ejemplo, físicas), y que pueden moverse más o menos libremente. Por ejemplo: un platformer, un scroller, un matamarcianos...
 
Un RTS de tipo Tiled, es todo lo contrario de esto.
 
Sí, podrías usarlo para las balas, pero no tiene sentido que en un RTS calcules los impactos de bala usando un motor de colisiones... quizá para los gráficos, pero en un RTS se deciden los impactos de otra manera (normalmente respecto a unas fórmulas en función de niveles de experiencia, daño, factor aleatorio, etc). Es cierto que podrías reinventar el concepto RTS y hacer los movimientos e interacciones totalmente "continuos", pero entonces dibujar el mapa via TileMap no tiene mucho sentido ¿no?.
 
En general, en un RTS, calcularás el movimiento de las unidades ya cuando haces click (si no pueden moverse ahí o al menos si la posición es inválida, sueles querer avisar al usuario en el momento). Además por comodidad en un RTS puedes querer una unidad tiene que estar en un tile y sólo en uno (al margen de cómo la dibujes). Deberías por tanto usar funciones de trazado de caminos ("pathfinding", por ejemplo A* como bien te decía @francoe1) para decidir por qué tiles mover a una unidad, y usar tus propias fórmulas de distancia y evaluación de bloqueos, disparos, basadas también en la propia posición en la rejilla (normalmente ¿eh?).
 
Así que pasarás mucho tiempo convirtiendo coordenadas de pantalla/ratón a coordenadas del Tilemap y viceversa. Como te comenta @Igor, la documentación es tu amiga aquí si vas a usar Tilemap, ¡echa un ojo a todos sus métodos! (sin embargo ojo, GetTile no te devuelve el tile debajo del ratón sino el tile en coordenadas de "rejilla").
 
Tilemap Scripting: https://docs.unity3d.com/ScriptReference/Tilemaps.Tilemap.html
 

La jugada completa (fuente: https://forum.unity.com/threads/2017-tilemap-system-select-tile-with-mouse-ingame.506249/ )
 

      public Grid grid; //  You can also use the Tilemap object
        public void Update() {
            Vector3 mouseWorldPos = Camera.main.ScreenToWorldPoint(Input.mousePosition);
            Vector3Int coordinate = grid.WorldToCell(mouseWorldPos);
            Debug.Log(coordinate);
        }

 
Con esto claro, puedes empezar a pensar en mover unidades pero seguramente sea mejor que pienses en el espacio del Grid, y lo uses para posicionar tus unidades y otras entidades.  Como bien te comentan, tienes toda la API de Tilemap y de Grid para acceder a los Tags, capas de tiles, y materiales (es mejor usar "Tilemap Tags" que mirar el tipo de tile, porque si los reordenas o editas la textura...). Echa un ojo a https://docs.unity3d.com/ScriptReference/Tilemaps.Tilemap.GetTileFlags.html y similares.
 
Yo, un RTS sencillo (así de entrada), lo haría sin Colliders, o usándolos solo para interacciones visuales de cosas como balas o IK, si es que fuera necesario. Es verdad que puedes necesitar excepciones en tu PathFinding con los tiles que tengan ángulos (hay variantes de A* que soportan esto). Aunque eso sí, lo haría en un grid hexagonal ¡muerte a las tiles cuadradas!  
 
 

Enero 09, 2020, 11:41:11 PM #6 Ultima modificación: Enero 09, 2020, 11:43:14 PM por jaunco325
Cita de: J Montes date=1578606632Tilemap Scripting: https://docs.unity3d.com/ScriptReference/Tilemaps.Tilemap.html
   
   
      La jugada completa (fuente: https://forum.unity.com/threads/2017-tilemap-system-select-tile-with-mouse-ingame.506249/ )
   


mi pregunta principal que seguro me va a ayudar mucho a futuro: como hiciste para encontrar eso?

cada vez que busco algo en esa pagina me dice que no hay resultado.
 

 
muchas gracias por la ayuda
 
hoy por un momento pense en hacer las colisiones por codigo, pero despues pense que el pathfinding no lo iba a identificar como un obsaculo a evitar.
 
"muerte a los tiles cuadrados" *inserte imagen de homero simpson desapareciendo entre los arbustos* al principio queria usar tiles isometricos, pero despues pense que los tiles cuadrados iban a ser mas facil de programar.
 
Cita de: Igor date=1578598376hola
   
   
      no he usado nunca TileMap pero he mirado la documentacion y lo que porejemplo puedes hacer si quieres saber encima de que tipo de Tile estas:
   
   
      "TileMap" tiene una funcion "getTile(posicion)" te devuelve el "tile".
   
   
      "Tile" tiene la variable "Sprite" y "sprite" tiene la variable "Texture" y "texture tiene la variable "name" que te dice el nombre de la textura
   
   
      luego haces lo que sea dependiendo del nombre de la textura.
   
   
      tambien desde el "renderer" puedes acceder al sprite y a la texture y entonces a su nombre....
   
   
      ..pero como te he dicho al principio nunca he usado tileMap y no se si estos metodos funcionaran realmente como yo supongo...
   
   
      ...y no se si te servira saber el nombre para lo que quieres
   
   
       
   


gracias eso me resulta muy util

Fijate que tengas seleccionada la versión correcta, debajo del título de la página de la documentación.


Etiquetas: