Comunidad orientada al desarrollo de videojuegos

Unity3d :: Como manejar el ratón en primera persona

En los juegos en primera persona para plataformas no móviles (PC por ejemplo) a menudo se maneja el protagonista con la ayuda del ratón.

Imaginaos un escenario donde el protagonista se mueve en 2 dimensiones (arriba – abajo y izquierda – derecha) siguiendo el movimiento del ratón. Parece fácil, pero que pasa cuando el ratón llega al final de la pantalla, pero el protagonista todavía tiene que seguir moviéndose en la misma dirección. Además de ello, si publicáis vuestro juego para Windows Store (el antiguo METRO) al llegar al final de la pantalla si damos con el lugar adecuado de la pantalla aparecen los menús de Windows 8, volviendo nuestro protagonista incontrolable.

En este post veremos cómo afrontar este problema.

Primero vamos a preparar el entorno para reproducir el problema.

Vamos a crear una escena sin gravedad con un par de cubos y una capsula de protagonista:

clip_image002[4]

Vamos a implementar una script de nuestro protagonista que moverá al protagonista en 2 dimensiones (x, y) persiguiendo el movimiento del ratón:

using UnityEngine;

using System.Collections;

 

public class PlayerScript : MonoBehaviour

{

 

       private Vector3 oldMouse;

      

       void Awake ()

       {

              this.oldMouse = Input.mousePosition;

       }

      

       void Update ()

       {

              float deltaX = Input.mousePosition.x – this.oldMouse.x;

              float deltaY = Input.mousePosition.y – this.oldMouse.y;

              this.transform.position += newVector3(deltaX/100.0f, deltaY/100.0f, 0.0f);

              this.oldMouse = Input.mousePosition;

       }

      

}

Cuando asignaremos nuestro script a la capsula (que es nuestro protagonista), la capsula perseguirá el movimiento del ratón (no la posición exacta, si no el movimiento, es decir, si el ratón va arriba, la capsula se moverá hacia arriba).

Si ejecutáis este código veréis que el movimiento está bastante limitado por llegar al final de la pantalla.

¿Cómo solucionarlo? ¡Muy fácil! Moviendo el ratón hacia el centro.

Si lo intentáis hacer en plan “Input.mousePosition = Vector3.zero” el compilador dará un error porque no está permitido asignar la posición del cursor directamente.

Para nuestro caso usaremos Screen.lockCursor.

Screen.lockCursor = true ocultara el ratón y colocara la posición del mismo en el centro de la pantalla.

Vamos a modificar nuestro código para incorporar la funcionalidad nueva de recolocar el ratón en el centro de la pantalla cuando este muy cerca del borde de la pantalla:

using UnityEngine;

using System.Collections;

 

public class PlayerScript : MonoBehaviour

{

 

       private Vector3 oldMouse;

       private float padding = 10.0f;

 

       void Awake ()

       {

              Screen.lockCursor = true;

              this.oldMouse = Input.mousePosition;

       }

      

       void Update ()

       {

              if (Screen.lockCursor)

                     Screen.lockCursor = false;

              else

              {

                     float deltaX = Input.mousePosition.x – this.oldMouse.x;

                     float deltaY = Input.mousePosition.y – this.oldMouse.y;

                     this.transform.position += newVector3(deltaX/100.0f, deltaY/100.0f, 0.0f);

              }

              if (

                     Input.mousePosition.x > Screen.width – this.padding ||

                     Input.mousePosition.x < this.padding ||

                     Input.mousePosition.y > Screen.height – this.padding ||

                     Input.mousePosition.y < this.padding

              )

              {

                     Screen.lockCursor = true;

              }

              this.oldMouse = Input.mousePosition;

       }

      

}

En este cambio hemos introducido una variable nueva padding. Su propósito es establecer un padding para que el cursor se recoloca no al llegar al borde de la pantalla si no un poco antes. Para juegos de Windows 8 es necesario establecer un padding para que el ratón nunca llegue a las zonas de los menús de Windows 8.

En el método Awake bloqueamos el cursor para que desde el comienzo salga en el centro de la pantalla.

En el método Update primero comprobamos si el cursor está bloqueado o no. Si está bloqueado lo desbloqueamos para que se pueda mover el ratón.

Si no está bloqueado, movemos el protagonista según el movimiento del ratón.

Luego comprobamos si el ratón ha salido de la zona establecida del movimiento. Si ha salido, bloqueamos el cursor para que vuelva al centro y en el siguiente Update lo desbloqueamos para que se pueda mover.

Esta es la solución. Por supuesto a este código le tendréis que añadir muchas más cosas y customizarlo a vuestro gusto 🙂

¡Atención! Si ejecutáis este código, el ratón no podrá llegar al final de la pantalla del juego, por lo tanto el botón de Unity3D de parar el juego no será alcanzable… Usad “Ctrl + P” para parar el juego.

P.D. El paquete con la demo esta aquí: https://db.tt/cHVEXsyQ

, , , , ,

Leave a Reply