Videojuegos

Cómo mover objeto hasta el puntero al hacer clic con Unity

Si estas aprendiendo a desarrollar videojuegos con Unity, te interesará aprender, de forma práctica y paso a paso, cómo instanciar objetos en el punto en el que se haga click con el ratón.

Publicado el 21 de Julio de 2019
Compartir

Si estas aprendiendo a desarrollar videojuegos con Unity, te interesará aprender, de forma práctica y paso a paso, cómo instanciar objetos en el punto en el que se haga click con el ratón.

Instanciar al hacer click

Vamos a realizar todo el proceso de forma práctica y utilizando Unity, y comenzaremos creando un script nuevo en C#.

Creando un nuevo script

A este nuevo script lo vamos a llamar InstanciateOnMouseClick, por ejemplo, y a continuación pasamos a editarlo con el IDE que tengamos instalado, que en nuestro caso es Visual Studio.

Finalmente el código va a quedar de esta forma:

public class IntanciateOnMouseClick : Monobehaviour
{
  public GameObject prefab;

  void Update()
  {
     if (Input.GetMouseButtonDown(0))
     {
        IntantiateOnPosition(Input.mousePosition);
     }
  }

void IntantiateOnPosition(Vector3 mousePos);

  Ray ray = Camera.main.ScreenPointToRay(mouse.Pos);

  if(Physics.Raycast(ray, out RaycastHit info))
  {
      Debug.Log(“Pinchado en ” + info.collider.name);
      Vector3 intantationPoint = info.point;
      GameObject newGO = Instantiate(prefab, intantiationPoint, Quaternion.identity);
      Rigidbody rb = newGO.GetComponent<Rigidbody>();
      if(rb	== null)
      {
         rb = newGO.AddComponent<Rigidbody>();
      }						

      rb.mass = 10f;
    }

}

Vamos ahora con la explicación del código resultante paso a paso:

Primero haremos que la comprobación para detectar si se ha pulsado botón principal del ratón, en concreto el botón derecho, y en ese caso vamos a llamar al método InstanciateOnMouseClick y lo instanciamos en la posición que determine el cursos del ratón.

  • A continuación necesitaremos la estructura llamada Ray, que es una estructura que contiene simplemente un punto y una dirección, y pediremos a la cámara que cree un rayo que pase por un punto concreto de la pantalla, que va a ser la posición ratón.
  • Después, utilizando un método de la clase de física Physics llamado Raycast, vamos a comprobar si hay algún objeto que se cruce la trayectoria de ese rayo, y esa información la guardaremos en una variable de tipo RaycastHit a la que llamaremos por ejemplo info.
  • Dado que Raycast devuelve un booleano, si encuentra algún objeto entonces se va a imprimir primero la información del objeto que se ha detectado y su nombre.
  • Como necesitamos saber en qué punto se tiene que crear el objeto nuevo, usamos uno de los campos que contiene info, que es el punto de contacto del rayo con el objeto que ha detectado.
  • Con esto ya podemos crear un nuevo objeto usando el método Instantiate e instanciando un prefab, para lo que tenemos que crear también un atributo público de tipo GameObject para especificar qué objeto queremos crear cada vez.
  • Entonces creamos un prefab dónde en instantiationPoint con una rotación de Quaternion.identity, que va a indicar simplemente que no queremos rotar el objeto que estamos instanciando. Esta es la identidad de los cuaterniones y es la que utilizaremos la mayoría de las veces que hagamos una instanciado de un objeto.
  • Después se necesita obtener un componente de este objeto que acabamos de crear, un Rigidbody, por lo tanto creamos una variable de tipo rb a la que indicamos que intente buscar, dentro de ese objeto hemos creado, un componente de tipo Rigidbody.
  • Si por algún motivo el Rigidbody no existe, lo que haremos es añadirlo. Y una vez tenemos el mismo y estamos seguros que existe, le cambiamos la masa.
  • Con esto ya podemos pasar a probar el código, para lo que vamos a montar una pequeña en Unity. Creamos un pequeño escenario desde el menú Hierachy, creando un cubo que va a actuar como suelo.

Creando un cubo como suelo

Cambiamos la escala al cubo, eligiendo los valores X=10, Y=1, Z=10. Después colocamos la cámara para que se vea apropiadamente, y renombramos nuestro cubo como “Ground”.

Renombrar cubo

Creamos otro objeto nuevo, de la misma forma que creamos el cubo, pero en esta ocasión eligiendo un objeto vacío con la opción Create Empty, al que llamaremos “Instanciador”.

Una vez creado, le vamos a poner el componente que acabamos de crear, para lo que es necesario poner un Prefab en el Inspector del componente. En el ejemplo vamos a utilizar un Prefab que ya estaba creado, un simple cubo que no Rigidbody y es perfecto para la prueba.

Tras añadirlo pulsamos Play y podemos comprobar que dónde se haga click con el ratón, se va a crear un cubo.

Creando un cubo

El bamboleo del cubo se debe a que a la hora de crear el cubo se está creando en el punto en el que se está clicando, y resulta que el origen del cubo está en su centro, por lo tanto le estamos diciendo que la mitad del cubo quede bajo el suelo y la otra mitad arriba.

Esto se ve claramente sí justo después del momento en el que vamos a hacer la instanciación insertamos un break. Es decir, nos quedaría así:

…
Debug.Break();
Debug.Log(“Pinchado en ” + info.collider.name);
Vector3 intantationPoint = info.point;
…

De esta forma podemos ir paso a paso, ya que Unity se detiene y podemos ver en la escena como efectivamente el cubo está medio introducido en el suelo.

Cubo medio introducido

Si avanzamos paso a paso vemos como el motor de física se encarga de repeler el cubo y separar los dos objetos.

Quitamos del break y reanudamos el script, y así vemos que no importa donde pinchemos y siempre que haya algún tipo de objeto vamos a crear uno nuevo, y si pinchamos fuera, al no haber ningún objeto no se crea nada.

Lo ideal sería comprobar la etiqueta del objeto, comprobar si el sitio donde hemos pinchado se pueden crear objetos, etcétera, pero sirve como primer ejemplo.


Compartir este post

También te puede interesar...

Tecnología

Plataformas que soportan Unity para crear tus videojuegos

15 Junio 2019 David Erosa García
Desarrollador de Videojuegos

Desarrollador de Videojuegos

35 horas y 55 minutos · Carrera

Los videojuegos 2D están volviendo a tener un gran auge gracias a los dispositivos móviles. Crea ahora el tuyo.

Curso de Unity

Curso de Unity

6 horas y 45 minutos · Curso

Aprende a usar las herramientas de gestión de proyectos y versiones del editor Unity Hub así como la interfaz de Unity, sus conceptos principales y …

  • Desarrollo Móvil
Artículos
Ver todos