DETECCIÓN DE INPUTS

Seguramente en todos los juegos que hagamos queramos detectar el input del usuario, ya sea por teclas, touch de un dispositivo o desde un joystick. Unity cuenta con un script que nos facilita todo ese trabajo en gran manera (aunque nunca vamos a estar conformes y siempre vamos a querer hacer el nuestro). Ese script se llama Input (casualmente como lo que detecta… Ja). Y contiene todo un conjunto de funciones que podemos utilizar. Vamos a empezar con un ejemplo simple, y hagamos que nuestra nave se mueva cuando presiono una tecla, en lugar de moverse continuamente:

 

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

public class Hero : MonoBehaviour
{
    public float speed;
    
    // Use this for initialization
    void Start ()
    {
        
    }
    
    // Update is called once per frame
    void Update ()
    {
        if (Input.GetKey(KeyCode.RightArrow))
        {
            transform.position += Vector3.right * speed * Time.deltaTime;
        }
    }
}

 

 

De esta manera nuestra nave debería moverse únicamente al presionar la flecha derecha, caso contrario debería quedarse quieto. Ahora… Un pequeño ejercicio rápido, pero que puede servir para acostumbrarse a estas estructuras:

Hagan que nuestra nave se mueva en todas las direcciones, tocando cada tecla correspondiente.

 

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

public class Hero : MonoBehaviour
{
    public float speed;
    
    // Use this for initialization
    void Start ()
    {
        
    }
    
    // Update is called once per frame
    void Update ()
    {
        if (Input.GetKey(KeyCode.RightArrow))
        {
            transform.position += Vector3.right * speed * Time.deltaTime;
        }else if (Input.GetKey(KeyCode.LeftArrow))
        {
            transform.position += Vector3.left * speed * Time.deltaTime;
        }else if (Input.GetKey(KeyCode.DownArrow))
        {
            transform.position += Vector3.down * speed * Time.deltaTime;
        }else if (Input.GetKey(KeyCode.UpArrow))
        {
            transform.position += Vector3.up * speed * Time.deltaTime;
        }
    }
}

 

 

Como verán… Esta solución lo que hace es que se pueda mover SOLAMENTE en una dirección. Pero… ¿Qué pasaría si quiero moverme en diagonal? ¿Pueden resolverlo? Intenten!!

 

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

public class Hero : MonoBehaviour
{
    public float speed;
    
    // Use this for initialization
    void Start ()
    {
        
    }
    
    // Update is called once per frame
    void Update ()
    {
        if (Input.GetKey(KeyCode.RightArrow))
        {
            transform.position += Vector3.right * speed * Time.deltaTime;
        }else if (Input.GetKey(KeyCode.LeftArrow))
        {
            transform.position += Vector3.left * speed * Time.deltaTime;
        }
        
        if (Input.GetKey(KeyCode.DownArrow))
        {
            transform.position += Vector3.down * speed * Time.deltaTime;
        }else if (Input.GetKey(KeyCode.UpArrow))
        {
            transform.position += Vector3.up * speed * Time.deltaTime;
        }
    }
}

 

 

Pueden ver cuál era el problema? Básicamente el else if estaba haciendo que se ejecutara una sentencia O LA OTRA, pero no AMBAS. Así que con ese pequeño fix ya podemos corregir eso.