Unity Game Dev Log #1

¡Hola a todos! Finalmente, he decidido probar el desarrollo de videojuegos en Unity.

Para no acabar desistiendo, tantos proyectos caídos en batalla, he pensado en tomarlo con calma, poco a poco, documentando cada parte reseñable del avance.


Así pues, como la mayoría, el objetivo de la primera toma de contacto ha consistido en crear un rectángulo a modo «suelo» y un objeto a modo «personaje» que será controlado por el jugador.


A lo que al suelo respecta, poco que comentar, lo único importante que he visto es que el objeto debe tener el componente Box Collider, que por lo visto, es lo que permitirá gestionar las colisiones entre objetos que tengan dicho componente asignado.


El jugador, es un objeto vacío al cual he asignado el componente Character controller y un cilindro dentro de este como «cuerpo» visual.



Tras esto, ha llegado el esperado momento de codificar.


Es la primera vez, ¡Sin complicarse!, ni siquiera el típico movimiento con WASD, un par de variables para controlar la gravedad… (para que si el jugador pulsa la tecla espacio el personaje suba y baje), y un control constante que aplique gravedad para que el personaje (en caso de estar en el aire) vaya bajando en el eje Y.



¡Sencillito! Dejo por aquí el script.


public class PlayerControler : MonoBehaviour
{
    // Variables públicas.
    public float jumpSpeed = 10f;
    public float gravity = 25f;

    // Variables privadas.
    private CharacterController characterController;
    private Vector3 newPosition = Vector3.zero;

    // Start is called before the first frame update
    void Start()
    {
        // Obtenemos el control del personaje.
        characterController = GetComponent <CharacterController>();
    }

    // Update is called once per frame
    void Update()
    {
        // Si se pulsa la barra espaciadora, hacemos que el jugador salte.
        if (Input.GetKey(KeyCode.Space)) {
            newPosition.y = jumpSpeed;
        }

        // Aplicamos gravedad continuamente.
        newPosition.y = newPosition.y - gravity * Time.deltaTime;

        // Actualizamos la posición del jugador.
        characterController.Move(newPosition * Time.deltaTime);
    }
}

El primer fallo, es que no hay ningún control que establezca cuando se puede saltar y cuando no, por lo que indagando un poco he encontrado el método CharacterController.isGrounded, que básicamente sirve para indicar si se está tocando el suelo o no, lo cual, de momento servirá para evitar el spam del salto.


// Si el jugador está tocando el suelo.
if (characterController.isGrounded)
{
    // Si se pulsa la barra espaciadora, hacemos que el jugador salte.
    if (Input.GetKey(KeyCode.Space))
    {
        newPosition.y = jumpSpeed;
    }
}

Implementar el movimiento, a priori, sencillo, dependiendo la tecla pulsada (de esto ya se encarga Unity), con el método Input.GetAxis podemos obtener si el jugador quiere mover al personaje en el eje x (1/-1) o en el eje z(1/-1), multiplicando este número por la velocidad de movimiento obtenemos la nueva posición del personaje.


// Obtenemos posición X y Z.
newPosition.x = Input.GetAxis("Horizontal") * walkSpeed;
newPosition.z = Input.GetAxis("Vertical") * walkSpeed;

Y por supuesto, creando un par de materiales, conseguimos aportar algo de color a la primera escena.



Para rematar el movimiento del personaje, he definido una nueva función dentro del método update para gestionar todos los movimientos del ratón, permitiendo así, mover la cámara y rotar al personaje con este.


void visionUpdate()
{
    // Obtenemos el movimiento horizontal del ratón.
    horizontalCamPosition = Input.GetAxis("Mouse X");

    // Aplicamos la rotación del personaje.
    transform.Rotate(0, (camSpeed * horizontalCamPosition), 0);

    // Obtenemos el movimiento vertical del ratón controlando la rotación máxima y aplicamos la rotación.
    verticalCamPosition += camSpeed * Input.GetAxis("Mouse Y");
    verticalCamPosition = Mathf.Clamp(verticalCamPosition, maxCamDownRotation, maxCamUpRotation);
    cam.transform.localEulerAngles = new Vector3(-verticalCamPosition, 0, 0);
}

También he tenido que reducir la posición de la cámara para conseguir un efecto de tercera persona además de incluir ojos al personaje (para conocer su horizonte visual).



Finalmente, el resultado.



Y de este modo, (por rápido que parezca) creerme si os digo que ¡No lo ha sido!, concluimos con el primer día de desarrollo de videojuegos en Unity.


Si alguien le interesa… dejo por aquí el Script completo de control de movimiento del personaje.


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

public class PlayerControler_1 : MonoBehaviour
{
    // Variables públicas.
    public float walkSpeed = 10f;
    public float jumpSpeed = 10f;
    public float gravity = 25f;

    public Camera cam;
    public float maxCamUpRotation = 35f;
    public float maxCamDownRotation = -35f;
    public float camSpeed = 1.5f;

    // Variables privadas.
    private CharacterController characterController;
    private Vector3 newPosition = Vector3.zero;
    private float verticalCamPosition, horizontalCamPosition;

    // Start is called before the first frame update
    void Start()
    {
        characterController = GetComponent<CharacterController>();
    }

    // Update is called once per frame
    void Update()
    {

        // Si el jugador está tocando el suelo.
        if (characterController.isGrounded)
        {
            // Si se pulsa la barra espaciadora, hacemos que el jugador salte.
            if (Input.GetKey(KeyCode.Space))
            {
                newPosition.y = jumpSpeed;
            }
        }

        // Obtenemos posición X y Z.
        newPosition.x = Input.GetAxis("Horizontal") * walkSpeed;
        newPosition.z = Input.GetAxis("Vertical") * walkSpeed;

        // Aplicamos gravedad continuamente.
        newPosition.y = newPosition.y - gravity * Time.deltaTime;

        // Actualizamos la posición con relación a la rotación aplicada.
        newPosition = transform.TransformDirection(newPosition);

        // Actualizamos la posición del jugador.
        characterController.Move(newPosition * Time.deltaTime);

        visionUpdate();
    }

    void visionUpdate()
    {
        // Obtenemos el movimiento horizontal del ratón.
        horizontalCamPosition = Input.GetAxis("Mouse X");

        // Aplicamos la rotación del personaje.
        transform.Rotate(0, (camSpeed * horizontalCamPosition), 0);

        // Obtenemos el movimiento vertical del ratón controlando la rotación máxima y aplicamos la rotación.
        verticalCamPosition += camSpeed * Input.GetAxis("Mouse Y");
        verticalCamPosition = Mathf.Clamp(verticalCamPosition, maxCamDownRotation, maxCamUpRotation);
        cam.transform.localEulerAngles = new Vector3(-verticalCamPosition, 0, 0);
    }
}
Te podría interesar...
Unity Game Dev Log #1

Unity Game Dev Log #1

¡Hola a todos! He comenzado a desarrollar videojuegos 3D con Unity desde cero. Os comparto todos los progreso ...

Descargar ROMs de Nintendo Gameboy

Descargar ROMs de Nintendo Gameboy

¡Menudo chollazo! Mirad cómo descargar todas las ROMs de Nintendo Gameboy gratis desde el directorio públic ...

Descargar libros gratis de Amazon Prime

Descargar libros gratis de Amazon Prime

¿Sabíais que tenéis cientos de libros gratis incluidos en tu suscripción de Amazon Prime? ¡Aprovechaos de ...

Este sitio web utiliza cookies propias y de terceros para mejorar nuestros servicios y mostrarle publicidad relacionada con sus preferencias mediante el análisis de sus hábitos de navegación. Si continua navegando, consideramos que acepta su uso.

Puede obtener más información, o bien conocer cómo cambiar la configuración de su navegador en nuestra política de Cookies.