El movimiento del personaje en este ejemplo es relativo a la cámara. Es algo que me ha costado un poco hacer en Unity pese a que lo he hecho cien veces en Unreal Engine. Si bien es cierto que en general Unity es más sencillo que Unreal, en ocasiones creo que complica las cosas. Por si alguien está buscando hacer algo parecido, el código es el siguiente:
1: /// <summary>
2: /// Método llamado para actualizar el estado cada frame.
3: /// </summary>
4: private void Update () {
5: // Calculamos el desplazamiento horizontal y vertical
6: float hoffset = Input.GetAxis(AXIS_HORIZONTAL);
7: float voffset = Input.GetAxis(AXIS_VERTICAL);
8: // Cambiamos la animación basándonos en los valores de los ejes
9: float hspeed = Math.Abs(hoffset);
10: float vspeed = Math.Abs(voffset);
11: if (hspeed > runningThreshold || vspeed > runningThreshold)
12: {
13: Run();
14: } else if (hspeed > 0.0f || vspeed > 0.0f)
15: {
16: Walk();
17: } else
18: {
19: Idle();
20: return;
21: }
22: // Calculamos el vector de desplazamiento del personaje proyectado sobre los ejes de la cámara
23: Transform cameraTransform = Camera.main.transform;
24: Vector3 forward = cameraTransform.forward;
25: forward.y = 0.0f;
26: forward.Normalize();
27: Vector3 right = cameraTransform.right;
28: right.y = 0.0f;
29: right.Normalize();
30: Vector3 offset = (forward * voffset + right * hoffset) * speedMultiplier * Time.deltaTime;
31: // Calculamos la rotación del personaje hacia la dirección correcta
32: Quaternion targetRotation = Quaternion.LookRotation(offset);
33: Quaternion smoothRotation = Quaternion.Slerp(gameObject.transform.rotation, targetRotation,
34: turnSpeed * Time.deltaTime);
35: // Giramos y movemos el personaje
36: gameObject.transform.rotation = smoothRotation;
37: gameObject.transform.position += offset;
38: }
Nótese que la variable
runningThreshold es un atributo público de la clase. Su valor define el umbral a partir del que cambio la animación de andar a correr. La variable speedMultiplier es otro atributo público que define la velocidad general del personaje. turnSpeed define la velocidad de giro. Cuando se cambia la orientación del personaje, no lo hago directamente, sino que interpolo la rotación para el cambio de orientación se haga suavemente.Nótese también que el formateo de código que proporciona Blogger es bastante cutre :-( Ya buscaré otro.
Todavía queda mucho trabajo en cuanto a la animación del personaje y la transición entre animaciones como se puede observar en el video, pero como primera aproximación no está mal.
No hay comentarios:
Publicar un comentario