Documentos de Académico
Documentos de Profesional
Documentos de Cultura
Parte 1: https://medium.com/@yonem9/fundamentos-unity-gameplay-
parte-1-teor%C3%ADa-dise%C3%B1o-y-el-editor-de-unity-5f8713e9b0e6
Índice (los enlaces van al documentro Drive original donde escribí este
artículo)
Créditos 1
Recursos 1
Mover el personaje 1
Rotar el personaje 13
Animar el personaje 21
Créditos
Curso original creado por Joshua Kinney traducido por Yone Moreno
Jiménez.
Recursos
Materiales a usar durante el curso (animaciones y modelos 3d, más la
escena/mapa del juego) son 1.5GB comprimido en .zip) Los he subido para
que estén disponible públicamente en : Enlace
Mover el personaje
En la anterior parte de este curso empezamos viendo teoría sobre diseño.
Luego continuamos haciendo un esbozo del script del jugador, Player,
donde listamos las variables y métodos que debería tener:
Pero el problema es que no es flexible y sería engorroso de cambiar. Así que
lo que vamos a hacer es separar cada método en su propio script, por
ejemplo haremos un script nuevo:
Y lo llamamos PlayerMovement:
Queremos mover al jugador tanto por teclado como por mando, abrimos el
script en el editor:
Escribimos:
float lh = Input.GetAxis(“Horizontal”);
Lo mismo hacemos:
Para el eje vertical, es decir la w d junto al joystick arriba abajo.
Por último, en el eje z es decir desde adelante hacia atrás queremos que se
mueva lo que el jugador pida que hemos almacenado en lv.
Ahora lo que nos gustaría hacer es:
Puesto que nos interesa que el movimiento sea fluido, es decir, que se
mueva el personaje cada pocos milisegundos independientemente de lo
potente que sea el dispositivo de juego, usaremos una función llamada
FixedUpdate()
En concreto FixedUpdate() es una función que se llama cada 20ms.
rb.velocity = moveVelocity;
Con lo cual logramos que cada 20 ms el personaje sea empujado por las
físicas en la dirección de moveVelocity.
Una cuestión que no hemos tenido en cuenta en el Update():
Escribimos en la moveSpeed 10
Y nos da un error:
NullReferenceException
En este caso lo que ocurre es que no le hemos dado un rigidbody con el que
trabajar, es decir, si existe la variable rb de tipo RigidBody, pero está vacía.
rb = GetComponent<RigidBody>();
Con ello expresamos: coge el componente del tipo RigidBody del objeto
actual (el personaje) y guárdalo en la variable rb.
Rotar el personaje
Hasta ahora hemos conseguido mover al personaje mediante el control del
jugador.
Está frase es una versión abreviada, sin tener que usar el GetComponent… y
sirve porque en Unity la Main Camera tiene el tag MainCamera:
La razón por la que se usa este tipo de datos, es que existe un concepto
llamado en español bloqueo del cardán y en inglés gimbal lock, significa
que cuando dos ejes de los tres usados para rotar se alinean, el objeto pierde
un grado de libertad restringiéndoe sus movimientos.
Con esa frase expresamos: nos creamos una variable de tipo Quaternion
llamada cameraRelativeRotation, a la cual le asignamos el resultado de la
llamada a la función Quaternion.FromToRotation() la cual usa como primer
parámetro la posición actual, y como segundo la posición hacia la que
queremos rotar, por ello se usa en los paréntesis (Vector3.forward,
cameraForward);
Más info.
A partir de aquí queremos hacer que rote de verdad. Para ello vamos a
poner la condición de que rote sólo si el jugador está dándole velocidad al
personaje:
Es decir, creamos un rayo, tipo Ray, llamado lookRay, que parte desde la
posición del objeto actual (el personaje), ello se expresa con
transform.position, y termina el rayo en la posición que nos diga la cámara,
mediante lookToward.
transform.LookAt(lookRay.GetPoint(1));
Lo que expresa la anterior frase es que el objeto actual (el personaje) mire
hacia un punto que está a un metro por delante del inicio del rayo llamado
lookRay. LookAt() es una función que nos ofrece Unity para rotar la
posición del objeto de forma que mire hacia el punto que le decimos: Más
Info
De forma que con lo anterior ya podemos movernos y rotar al personaje:
Animar el personaje
En realidad ya hemos configurado nuestro personaje, en la lección 1, para
que tenga los estados y animaciones necesarias, para hacer que esté ocioso,
camine y corra:
Pulsamos en el personaje y clicamos en la pestaña de Animator:
anim = GetComponent<Animator>();
anim.SetFloat(“blendSpeed”, rb.velocity.magnitude);