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.

Unity 3D genera los prefabricados de objetos con un clic del mouse

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.

Artículos sugeridos
Script para crear un interruptor de luz en Unity
Cómo configurar el controlador de joystick para el movimiento en Unity
Tutorial de ataque cuerpo a cuerpo 2D para Unity
Guión de disparos de armas basado en Raycast y proyectiles para Unity
Selección de unidades estilo RTS para Unity
Cómo usar el controlador Xbox en Unity
Principales activos de Unity de la tienda de activos