domingo, 9 de septiembre de 2018

Controlando al personaje con movimientos relativos a la cámara

No estoy teniendo mucho tiempo últimamente, pero he avanzado en poder controlar al personaje. Ahora se puede utilizar un controlador o el teclado para mover al personaje en diferentes direcciones. Cuando se usa el teclado el personaje simplemente corre en la dirección deseada. En el caso del controlador, se utiliza la posición de los ejes para determinar la velocidad del personaje y la animación utilizada (andar o correr).



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