[Unity] Mapa "infinito"

Ancoreig

Hola a todos, hace poco he retomado tras más de un año sin tocar un juego de hordas top down que empecé para practicar con Unity. Quiero cambiar muchas cosas de las que planteé en su momento y una de ellas es el mapa, el cuál tenía unos límites físicos y que ahora quiero hacer "infinito", pero no sé muy bien cómo plantearlo. Dejo cutre paint como lo tengo ahora mismo:

Es decir, cuando toca alguno de los límites se teletransporta al opuesto cardinalmente... sin embargo y he aquí el problema, si me está siguiendo un enemigo, nada más que mi personaje se teletransporta, a la vista del jugador ese enemigo ha desaparecido, cuando en realidad el enemigo sigue en la posición antigua y está dando media vuelta para buscar al jugador a su nuevo punto, por lo que el teletransporte no es fluido y no da esa sensación de infinitud que es la que busco.

Lo único que se me ha ocurrido es que cuando el jugador toque ese teletransporte, él y todos los enemigos (+ proyectiles etc) que estén a la vista del jugador se teletransporten junto a él manteniendo sus posiciones, pero no me acaba de convencer mucho esta solución... alguna idea más? Gracias de antemano!

1
Wasd

Llevo tiempo sin tocar gamedev, pero si teletransportas al personaje, tendrás que transportar también lo relativo a él que quieras mantener en su "campo de visión" (en otras palabras, lo que se te ha ocurrido sería correcto).

Supongo que habrá otras técnicas para hacer lo que dices o algo similar, sin embargo yo empezaría por explorar si realmente necesitas hacer esa modificación de coordenadas, ya que un mundo más abierto no debería implicar esos teletransportes tan a la ligera.

Esos teletransportes pueden tener sentido en un juego tipo Zelda 2D de antaño, donde iba por cuadrícula y los enemigos no traspasaban su cuadrado.

Coge mi opinión con pinzas.

Yerboth

No es más sencillo hacer que el personaje no se mueva, sino que lo que se mueva sea el mapa?

Dará la misma sensación de movimiento, tipo los juegos de coches antiguos

1
Czhincksx

Necesitas dos cosas.

Primero 3 copias de tu personaje que te digan a donde vas pero a una distancia igual al alto, ancho y diagonal de la pantalla. Así cuando estás entre medias de un borde empiezas a desaparecer por un lado y a aparecer por el otro.

También necesitas guardarte la información del salto de tu personaje principal. Cuándo has saltado y desde dónde hasta dónde. Así los enemigos, cuando vayan a seguirte, pueden comprobar cuándo empezaron a seguirte y si es antes del salto, pueden ir primero al punto donde saltaste y luego ya a tu nuevo emplazamiento.

1 mes después
Thanat0s

Entiendo que el teletransporte es para simular el mapa infinito, pero creo que esa solución no es la adecuada, desde mi punto de vista.

Puedes cargar mapa a medida que va caminando en esa dirección o incluso generar proceduralemente el mapa.

B

Solución 1: Regiones
Dividir el juego en regiones que contengan enemigos y objetos.

  • Cada región sabe cuales son las 8 regiones que tiene a su alrededor en las 4 direcciones cardinales + diagonales.
  • Empiezas con 9 regiones (la que está en cámara y las 8 colindantes).
  • Cuando sales de una región, se desactivan las 8 regiones colindantes
  • Cuando entras a una región, se activan las 8 regiones colindantes y si alguna no existe, se crea una nueva. Esto tiene que hacerse después de la desactivación de regiones de la regla anterior.

Si por alguna razón no quieres que sea infinito (principalmente para limitar cuanta ram ocupa el juego) siempre puedes reciclar trozos desactivados que se hayan quedado muy lejos de la zona en la que está el personaje y volver a generar otros nuevos cuando vuelva. Si es un juego tipo vampire survivors no importa mucho que el mundo cambie cuando vuelvas, el jugador no suele saber ni dónde está.

Solución 2: Mover el mundo, no el jugador

  • El jugador solo se puede mover dentro de unos límites de la pantalla y si intenta atravesarlos movemos a todos los enemigos y objetos en lugar de al jugador, pero en sentido inverso.
  • Hay una región de juego (un trigger), cuando un enemigo la abandona, lo mueves al lado contrario. De esta forma el mundo es un bucle como pretendías, pero el jugador nunca cambia de sitio y todo es más fácil de gestionar.

Usuarios habituales