Esta parte es la continuación del Tutorial Unity 3D principiantes – Mover Player. Modificaremos el código del pasado script MovePlayer, con la adición del componente CharacterController. También haremos unos ajustes en el script RotatePlayer.

Puedes ver todas las partes en: Tutorial Unity 3D

Componente CharacterController

En entradas anteriores creamos una capsula que representaba a nuestro player. Reemplazamos el collider que incluía por defecto por un componente CharacterController.

Añadimos 2 scripts que permitían rotar y mover el player. En el script “MovePlayer” usamos el componente transform para mover la capsula. Hoy en su lugar usaremos el componente CharacterController para moverla y también para detectar colisiones. Ya que este componente simula mejor los movimientos de un FPS.

Acceder al componente CharacterController

Como comentábamos anteriormente tenemos que modificar el script “MovePlayer”. Abrimos el archivo y añadimos lo siguiente:

public float gravity = -9.8f;
   private CharacterController controller;

   void Start()
   {
       controller =  GetComponent<CharacterController>();
   }

Como ahora vamos a detectar colisiones, creamos la variable gravity para aplicar la fuerza de la gravedad en el eje Y del player.

En la segunda línea declaramos una variable controller de tipo CharacterController. En el método Start asignamos el componente CharacterController a controller. Con el método GetComponent<>() accedemos a los componentes del GameObject Player.

Mover el protagonista

 void Update()
    {
        float deltaX = Input.GetAxis("Horizontal") * speed;
        float deltaZ = Input.GetAxis("Vertical") * speed;
       
        Vector3 mov = new Vector3(deltaX, 0, deltaZ);
        mov = Vector3.ClampMagnitude(mov, speed);
        mov.y = gravity;
        mov *= Time.deltaTime;
        mov = transform.TransformDirection(mov);

        controller.Move(mov);
    }

DeltaX y DeltaZ almacenan la cantidad de movimiento en X, Z. Las pasamos como argumentos al nuevo vector “mov”.

La instrucción Vector3.ClampMagnitude()limita la magnitud del vector al valor de la variable speed. Esto hace que el movimiento diagonal no sobrepase el valor del movimiento de un eje.

En mov.y asignamos la gravedad, que mantendrá a nuestro protagonista “pegado” al suelo.

El método TransformDirection()transforma el vector “mov” de coordenadas locales a globales.

Ahora desde nuestra variable controller llamamos a Move(), pasando como parámetro el vector mov.

Modificar el script RotatePlayer

Con la gravedad habilitada, el player no se desplaza de manera uniforme debido a la inclinación vertical que hace cambiar su dirección. Para solucionar esto tenemos que añadir un script RotatePlayer a la capsula y otro a la cámara. El de la capsula permitirá solo la rotación horizontal y el de la cámara la vertical. Al estar la cámara contenida dentro del player (la capsula), su inclinación vertical no afectará a la gravedad.

Al inicio creamos el enum RotateMode y la variable pública mode. De este modo desde el inspector de Unity podemos seleccionar el modo de rotación.

...
    public enum RotateMode
    {
        X = 0,
        Y = 1
    }
    public RotateMode mode= RotateMode.X;
    public float horSpeed = 10.0f;
    public float vertSpeed = 10.0f;
    public float minVertical = -50.0f;
    public float maxVertical = 50.0f;
    
    private float vertical = 0;

Y en el método Update incluimos una estructura de control if/else para ejecutar el correspondiente modo de rotación.

void Update()
    {
        if (mode == RotateMode.X)
        {
            transform.Rotate(0, Input.GetAxis("Mouse X") * horSpeed, 0);
        }
        else
        {
            float horizontal = transform.localEulerAngles.y;

            vertical -= vertSpeed * Input.GetAxis("Mouse Y");
            vertical = Mathf.Clamp(vertical, minVertical, maxVertical);

            transform.localEulerAngles = new Vector3(vertical, horizontal, 0);
        }  
    }

Finalmente añadimos un script RotatePlayer para la capsula y otro para la cámara. Desde el inspector de Unity seleccionamos el modo de rotación X para la primera y el modo de rotación Y para la segunda.


0 comentarios

Deja una respuesta

Marcador de posición del avatar

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *

Este sitio web utiliza cookies para que usted tenga la mejor experiencia de usuario. Si continúa navegando está dando su consentimiento para la aceptación de las mencionadas cookies y la aceptación de nuestra política de cookies, pinche el enlace para mayor información.

ACEPTAR
Aviso de cookies