Unity Cómo generar objetos al hacer clic con el mouse
En este tutorial, mostraré cómo generar un objeto con un clic del mouse en Unity.
La secuencia de comandos se encargará de generar los prefabricados en la posición del mouse y también los alineará con la superficie normal.
Pasos
- Crea un nuevo script, llámalo SC_ClickSpawner y pega el siguiente código dentro de él:
SC_ClickSpawner.cs
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class SC_ClickSpawner : MonoBehaviour
{
public GameObject[] prefabs; //Prefabs to spawn
Camera c;
int selectedPrefab = 0;
int rayDistance = 300;
// Start is called before the first frame update
void Start()
{
c = GetComponent<Camera>();
if(prefabs.Length == 0)
{
Debug.LogError("You haven't assigned any Prefabs to spawn");
}
}
// Update is called once per frame
void Update()
{
if (Input.GetKeyDown(KeyCode.Alpha1))
{
selectedPrefab++;
if(selectedPrefab >= prefabs.Length)
{
selectedPrefab = 0;
}
}
else if (Input.GetKeyDown(KeyCode.Alpha2))
{
selectedPrefab--;
if (selectedPrefab < 0)
{
selectedPrefab = prefabs.Length - 1;
}
}
if (Input.GetMouseButtonDown(0) && Input.GetKey(KeyCode.LeftShift))
{
//Remove spawned prefab when holding left shift and left clicking
Transform selectedTransform = GetObjectOnClick();
if (selectedTransform)
{
Destroy(selectedTransform.gameObject);
}
}
else if (Input.GetMouseButtonDown(0))
{
//On left click spawn selected prefab and align its rotation to a surface normal
Vector3[] spawnData = GetClickPositionAndNormal();
if(spawnData[0] != Vector3.zero)
{
GameObject go = Instantiate(prefabs[selectedPrefab], spawnData[0], Quaternion.FromToRotation(prefabs[selectedPrefab].transform.up, spawnData[1]));
go.name += " _instantiated";
}
}
}
Vector3[] GetClickPositionAndNormal()
{
Vector3[] returnData = new Vector3[] { Vector3.zero, Vector3.zero }; //0 = spawn poisiton, 1 = surface normal
Ray ray = c.ScreenPointToRay(Input.mousePosition);
RaycastHit hit = new RaycastHit();
if (Physics.Raycast(ray, out hit, rayDistance))
{
returnData[0] = hit.point;
returnData[1] = hit.normal;
}
return returnData;
}
Transform GetObjectOnClick()
{
Ray ray = c.ScreenPointToRay(Input.mousePosition);
RaycastHit hit = new RaycastHit();
if (Physics.Raycast(ray, out hit, rayDistance))
{
Transform root = hit.transform.root;
if (root.name.EndsWith("_instantiated"))
{
return root;
}
}
return null;
}
void OnGUI()
{
if(prefabs.Length > 0 && selectedPrefab >= 0 && selectedPrefab < prefabs.Length)
{
string prefabName = prefabs[selectedPrefab].name;
GUI.color = new Color(0, 0, 0, 0.84f);
GUI.Label(new Rect(5 + 1, 5 + 1, 200, 25), prefabName);
GUI.color = Color.green;
GUI.Label(new Rect(5, 5, 200, 25), prefabName);
}
}
}
- Adjunte el script SC_ClickSpawner a la cámara principal
- Asigne los Prefabs que desea generar a la matriz de Prefabs en SC_ClickSpawner.
- En mi caso, usaré formas simples:
Consejo: Para evitar que las casas prefabricadas generadas estén "buried" en la superficie, asegúrese de que su transformación raíz (o el pivote, si es un solo objeto) esté en la parte inferior.
- Mueva la cámara principal frente a una superficie
Ahora, cuando presiones Reproducir deberías poder generar un Objeto haciendo clic izquierdo en la superficie y eliminar los Objetos manteniendo presionado Mayúsculas Izquierda + Clic Izquierdo.
Al presionar '1' se seleccionará el siguiente Prefab en la lista y al presionar '2' se seleccionará el anterior.