[Unity] Vector 3 vs Vector 2

marod

Buenos días a todos.

Una duda más sobre Unity (Voy a acabar petando el foro de dudas mías...)

Mi duda trata sobre la diferencia entre Vector3 y Vector2, no la duda tan básica de saber que uno tiene 3 ejes de cordenadas y el otro solo dos, sino que estoy siguiendo un tutorial de Unity de las Live Sessions de 2D, y con camara ortográfica en teoría debería utilizar casi siempre Vector2, pero el señor que explica las cosas dice que aunque estemos en 2D, usemos Vector3... Y sinceramente, no entiendo el porqué.

Por ejemplo, para hacer un Spawn de sprites, necesita la posición de donde va a empezar a spawnear, pues declara la variable SpawnPosition como Vector3...

Gracias y un saludo.

javifugitivo

No domino mucho unity pero imagino que con Vector3 puedes controlar la profundidad, así sabrás que objetos quieres que se vean delante de otros.

1 1 respuesta
marod

#2 Si no existiera en Unity las Sorting Layers que hace justamente lo qué describes lo entendería, pero existiendo lo veo tontería usar Vector3 en 2D. A ver sí alguien me ilumina.

1 respuesta
VicoViper

#3 Piensa en Limbo, o en Little big Planet, y lo entendrás. Aunque trabajes en 2d, te puede interesar mucho el trabajar con la profundidad. De esa forma puedes poner un fondo, o un objeto entre la cámara y el personaje, o hacer que los personajes pasen tras una mesa, o por delante de esta.
Colocando las UI delante de la cámara y el juego detrás, te aseguras de que nunca habrá problemas.

Además. Todos los transform.position son vector3, así que aunque quieras trabajar en 2D y tuvieras un vector 2D miPosicion(x,y), tendrías que generar siempre un vector3 de tipo new Vector3(miPosicion.x,miPosicion.y,0), para poder aplicárselo al personaje.

Yo por ejemplo, en lo que estoy trabajando ahora, hago que z sea igual a y/100 de esa forma, los PNJ que se cruzan entre ellos hacen que los más altos estén en una posición más atrasada respecto a la cámara. y si se cruzan, el que esté más abajo siempre se renderiza por encima del que está detrás.

2 respuestas
r2d2rigo

Para que preguntes.

Ahora en serio, salvo que estes trabajando directamente en screen space (u otra proyeccion estrictamente 2D), lo mas comodo y optimo es utilizar Vector3. La camara ortografica que usas no deja de ser una proyeccion 3D, pero montada de tal manera que no hay perspectiva y todos los objetos tienen el mismo tamaño independientemente de su profundidad. Si se usasen Vector2 (que se puede), el renderer tiene que crear Vector3 temporales (como dice #4) para poder transformarlos correctamente con las matrices de proyeccion.

Mas info: https://en.wikipedia.org/wiki/3D_projection

1 1 respuesta
marod

#4 #5 Ante todo decir que soy nuevo en esto de Unity, y si respondo a vuestras explicaciones es porque no lo acabo de entender bien.

Lo de jugar con la profundidad es lo mismo que he dicho en #3, si no existieran las sorting layers lo entendería el plan de jugar con el eje Z para ganar profundidad, pero existen y veo tontería no aprovecharlas.

Lo de transformar yo lo que utilizo es el metodo de rigidbody2D MovePosition() para moverlo a un nuevo vector, y MoveRotation() para rotarlo, y todo con Vectores 2D. Que no se me ha dado el caso de usar Transform.

Y lo de usar siempre Vector3 pudiendo usar Vector2 al fin y al cabo no lo veo muy optimo, porque haces que el procesador haga un ciclo más para calcular el eje Z, pudiendo hacer que solo calcule dos ciclos, el eje X e Y.

Pero que vamos, vosotros tendréis mas experiencia que yo en Unity, y si decís que es mejor usar Vector3, yo lo uso xD

1 respuesta
VicoViper

#6 Fíate, de verdad. Que es lo mejor. Piensa siempre en 3D (excepto cuando hagas UI, canvas y esas cosas)

Y las Sorting layers!! claro!! Úsalas!! no lo dudes, usa todo lo que puedas... PEEEEEERO Cuando tengas 20 enemigos en pantalla formados por 3 sprites diferentes con elementos de escenario por delante y por detrás de cada uno, y que además se están desplazando arriba y abajo, y cruzándose son el player (o los dos player) que además están en otra capa... Con cada uno en una posición distinta con tamaños distintos y tal...
Y veas que las Sorting Layer, los Order in Layer y los Tags son insuficientes, verás que poder usar el eje z es un milagro ;)

Y para muestra: Una imagen.

1 respuesta
marod

#7 Vale, con ese ejemplo ya me ha quedado todo mucho más claro. He de decir, que también depende del juego que quieras hacer, sí se trata de un Beat'em up, es normal que quieras utilizar el Z si quieres que los enemigos se pongan por delante y por detrás de tu personaje, las sorting layers en este caso no creo que sirvan mucho. Pero os haré caso e intentaré programar en Vector3.

Gracias.

Usuarios habituales

  • marod
  • VicoViper
  • r2d2rigo
  • javifugitivo