Plataformas que soportan Unity para crear tus videojuegos
Una de las mayores ventajas de Unity es la gran cantidad de plataformas que soporta. Si quieres estar al tanto de cuáles...
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.
Tabla de contenidos
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.
Vamos a realizar todo el proceso de forma práctica y utilizando Unity, y comenzaremos creando un script nuevo en C#.
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.
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.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.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.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.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.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
.Rigidbody
no existe, lo que haremos es añadirlo. Y una vez tenemos el mismo y estamos seguros que existe, le cambiamos la masa.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”.
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.
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.
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.
También te puede interesar
Una de las mayores ventajas de Unity es la gran cantidad de plataformas que soporta. Si quieres estar al tanto de cuáles...
Aprende a usar las herramientas de gestión de proyectos y versiones del editor Unity Hub así como la...