Home | Clases | Unity: Plataformas en 3D | Receta 1: Movimiento y cámara para un jugador (esfera) en 3D

Receta 1: Movimiento y cámara para un jugador (esfera) en 3D


Introducción

En esta receta, trataremos de crear un jugador como una esfera y conseguir que se mueva en ambos ejes ya demás pueda saltar si está sobre el suelo. Además, haremos que la cámara le siga en dichos movimientos. Puedes comprobar el objetivo final haciendo clic AQUÍ.

Creación del escenario

Empezaremos creando un Jugador mediante una Sphere, así como un suelo sobre el que moverse mediante un Plane.

Adicionalmente, añadiremos a la Sphere un Rigidbody para que se vea afectado por las fuerzas físicas Physics de Unity.

El Suelo tendrá una Scale de 2,1,2 en XYZ para que haya espacio para moverse, y el Jugador tendrá una posición en Y de 3 para comprobar que cae al arrancar el juego.

Por último, para comprobar mejor el resultado, ajustaremos la Main Camera a Position XYZ 0, 5, -15 y Rotation XYZ 15, 0, 0.



Movimiento con el teclado

Para conseguir el movimiento con el teclado en los ejes X y Z, haremos uso de los ejes (Axis) Horizontal y Vertical proporcionados por Unity, que puedes comprobar en Edit > Project Settings > Input y que se controlan con las FLECHAS del teclado o con las teclas WASD.

Crea un nuevo C# script dentro de Assets > Scripts con el nombre JugadorController, arrástralo al objeto Jugador para añadirselo como Component y añade el siguiente código. Observa los comentarios para entender el funcionamiento de cada instrucción:


using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class JugadorController : MonoBehaviour {

//Declarlo la variable de tipo RigidBody que luego asociaremos a nuestro Jugador
private Rigidbody rb;

//Declaro la variable pública velocidad para poder modificarla desde la Inspector window
[Range(1,10)]
public float velocidad = 5;

void Start () {

//Capturo el rigidbody del jugador al iniciar el juego
rb = GetComponent<Rigidbody>();

}

void FixedUpdate () {

//Capturo el movimiento en horizontal y vertical de nuestro teclado
float movimientoH = Input.GetAxis("Horizontal");
float movimientoV = Input.GetAxis("Vertical");

//Genero el vector de movimiento asociado, teniendo en cuenta la velocidad
Vector3 movimiento = new Vector3(movimientoH * velocidad, 0.0f, movimientoV * velocidad);

//Aplico ese movimiento al RigidBody del jugador
rb.AddForce(movimiento);

}
}


Ahora tu jugador debería moverse en las direcciones X y Z mediante las teclas. Desde la Inspector Window del jugador podrás además modificar la velocidad de movimiento mediante el deslizador Velocidad.


Salto

Para saltar utilizaremos el control Jump por defecto, que corresponde a la barra espaciadora. Además, comprobaremos si está cayendo para aplicarle una gravedad un poco mayor.

Para ello, primero debemos añadir al suelo la etiqueta (tag) Suelo:

  • Selecciona el Suelo y haz clic en el desplegable Tag de la Inspector Window.
  • Haz clic en Add Tag... y crea una nueva llamada Suelo usando el botón +.
  • Selecciona el Suelo otra vez, haz clic en el desplegable Tag de la Inspector Window y asígnale la etiqueta Suelo recién creada.

Para finalizar. modifica el código del script JugadorController:


using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class JugadorController : MonoBehaviour {

//Declarlo la variable de tipo RigidBody que luego asociaremos a nuestro Jugador
private Rigidbody rb;

//Declaro la variable pública velocidad para poder modificarla desde la Inspector window
[Range(1,10)]
public float velocidad = 5;

//Declaro la variable pública salto para poder modificarla desde la Inspector window
[Range(1,10)]
public float salto = 7;

void Start () {

//Capturo el rigidbody del jugador al iniciar el juego
rb = GetComponent<Rigidbody>();

}

void FixedUpdate () {

//Capturo el movimiento en horizontal y vertical de nuestro teclado
float movimientoH = Input.GetAxis("Horizontal");
float movimientoV = Input.GetAxis("Vertical");

//Genero el vector de movimiento asociado, teniendo en cuenta la velocidad
Vector3 movimiento = new Vector3(movimientoH * velocidad, 0.0f, movimientoV * velocidad);

//Aplico ese movimiento al RigidBody del jugador
rb.AddForce(movimiento);

//Si pulsa el botón de saltar y está en el suelo
if (Input.GetButtonDown("Jump") && isSuelo()){
//Aplico el movimiento vertical con la potencia de salto
rb.velocity += Vector3.up * salto;
}

}

//Compruebo si el jugador está en el suelo antes de saltar (para que no vuele)
private bool isSuelo(){

//Genero el array de colisiones de la esfera/jugador pasando su centro y su radio
Collider[] colisiones = Physics.OverlapSphere(transform.position, 0.5f);
//Recorro ese array y si está colisionando con el suelo devuelvo true
foreach (Collider colision in colisiones){
if (colision.tag == "Suelo"){
return true;
}
}
return false;

}
}



Movimiento y salto con el ratón

Para poder mover el jugador con el ratón, actuaremos de manera muy similar, creando variables de velocidad para los dos ejes del ratón y usando el botón derecho para saltar. Ten en cuenta que este método solo es válido al jugar a pantalla completa, ya que en caso contrario al salir de la pantalla de juego pierdes el foco del ratón. E código modificado de JugadorController sería el siguiente:


using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class JugadorController : MonoBehaviour {

//Declarlo la variable de tipo RigidBody que luego asociaremos a nuestro Jugador
private Rigidbody rb;

//Declaro la variable pública velocidad para poder modificarla desde la Inspector window
[Range(1,10)]
public float velocidad = 5;

//Declaro las variables públicas velocidad ratón para poder modificarlas desde la Inspector window
[Range(10,50)]
public float velocidadRatonX = 15;
[Range(10,50)]
public float velocidadRatonY = 20;

//Declaro la variable pública salto para poder modificarla desde la Inspector window
[Range(1,10)]
public float salto = 7;

void Start () {

//Capturo el rigidbody del jugador al iniciar el juego
rb = GetComponent<Rigidbody>();

}

void FixedUpdate () {

//Capturo el movimiento en horizontal y vertical de nuestro teclado
float movimientoH = Input.GetAxis("Horizontal");
float movimientoV = Input.GetAxis("Vertical");

//Genero el vector de movimiento asociado, teniendo en cuenta la velocidad
Vector3 movimiento = new Vector3(movimientoH * velocidad, 0.0f, movimientoV * velocidad);

//Aplico ese movimiento al RigidBody del jugador
rb.AddForce(movimiento);

//Si pulsa el botón de saltar y está en el suelo
if (Input.GetButtonDown("Jump") && isSuelo()){
//Aplico el movimiento vertical con la potencia de salto
rb.velocity += Vector3.up * salto;
}

//Si ya está cayendo, aplico un poco más de gravedad para que sea más natural
if (rb.velocity.y < 0){
rb.velocity = new Vector3(rb.velocity.x, rb.velocity.y * 1.1f, rb.velocity.z);
}

//Capturo el movimiento en horizontal y vertical de nuestro ratón
float mouseH = Input.GetAxis("Mouse X");
float mouseV = Input.GetAxis("Mouse Y");

//Genero el vector de movimiento asociado, teniendo en cuenta la velocidad del ratón
Vector3 movimientoMouse = new Vector3(mouseH * velocidadRatonX, 0.0f, mouseV * velocidadRatonY);

//Aplico ese movimiento al RigidBody del jugador
rb.AddForce(movimientoMouse);

//Si pulsa el botón derecho del ratón y está en el suelo
if (Input.GetMouseButtonDown(1) && isSuelo()){
//Aplico el movimiento vertical con la potencia de salto
rb.velocity += Vector3.up * salto;
}

}

//Compruebo si el jugador está en el suelo antes de saltar (para que no vuele)
private bool isSuelo(){

//Genero el array de colisiones de la esfera/jugador pasando su centro y su radio
Collider[] colisiones = Physics.OverlapSphere(transform.position, 0.5f);
//Recorro ese array y si está colisionando con el suelo devuelvo true
foreach (Collider colision in colisiones){
if (colision.tag == "Suelo"){
return true;
}
}
return false;

}
}



Seguimiento de Cámara

Antes de finalizar, vamos a aplicar a nuestra Main Camera un script para que pueda seguir a nuestro Jugador a una determinada distancia siempre fija:

  • Crea un nuevo C# script llamado CamaraController.
  • Arrástralo a la cámara.
  • Añade el código que se muestra a continuación.
  • Arrastra el objeto Jugador a la variable Jugador de la Inspector Window de la Main Camera (componente CamaraController)
  • Modifica la Position XYZ de la Main Camera para que coincida con 0, 10, -10 y la Rotation para que coincida con 45, 0, 0.


using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class CamaraController : MonoBehaviour {

//Referencia a nuestro jugador
public GameObject jugador;

//Para registrar la diferencia entre la posición de la cámara y la del jugador
private Vector3 offset;

void Start () {

//diferencia entre la posición de la cámara y la del jugador
offset = transform.position - jugador.transform.position;


}

// Se ejecuta cada frame, pero después de haber procesado todo. Es más exacto para la cámara
void LateUpdate () {

//Actualizo la posición de la cámara
transform.position = jugador.transform.position + offset;

}
}


Con esto estaría terminada la receta, espero que te haya resultado útil.

Puedes comprobar su funcionamiento haciendo clic AQUÍ.
Fecha de publicación: 19/09/2020
Asignaturas: desarrollo de entornos interactivos multidispositivo
Temas: unity
Utilizamos cookies propias y de terceros para mejorar su experiencia en la navegación. Al seguir navegando entendemos que acepta su uso.
Si lo desea, consulte nuestras políticas de privacidad y cookies
ENTENDIDO
[X] Cerrar

Contacta conmigo


[X] Cerrar

Acceso alumnos