Jump to content
Sign in to follow this  
jaunco325

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

Recommended Posts

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?

Share this post


Link to post
Share on other sites

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.

Share this post


Link to post
Share on other sites

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.

Share this post


Link to post
Share on other sites
17 hours ago, francoe1 said:

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.

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?

13 hours ago, pioj said:

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.

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.

Share this post


Link to post
Share on other sites

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

 

Share this post


Link to post
Share on other sites

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! :3_grin: 

 

Edited by J Montes

Share this post


Link to post
Share on other sites
51 minutes ago, J Montes said:

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/ )

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.

Screenshot_30.png

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.

3 hours ago, Igor said:

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

 

gracias eso me resulta muy util

Edited by jaunco325

Share this post


Link to post
Share on other sites

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

  • Like 1

Share this post


Link to post
Share on other sites
Sign in to follow this  

UnitySpain © Todos los derechos reservados 2020
×
×
  • Create New...