Unity Hoe objecten te spawnen met een muisklik

In deze tutorial laat ik zien hoe je een object kunt spawnen met een muisklik in Unity.

Het script zorgt voor het spawnen van de Prefabs op de muispositie, samen met het uitlijnen ervan op de normale oppervlakte.

Unity 3D Spawn de objectprefabs met een muisklik

Stappen

  • Maak een nieuw script, noem het SC_ClickSpawner en plak de onderstaande code erin:

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);
        }  
    }
}
  • Voeg het SC_ClickSpawner-script toe aan de hoofdcamera
  • Wijs de Prefabs die u wilt spawnen toe aan de Prefabs-array in de SC_ClickSpawner

  • In mijn geval zal ik eenvoudige vormen gebruiken:

Tip: Om te voorkomen dat voortgebrachte prefabs zich "buried" in het oppervlak bevinden, moet u ervoor zorgen dat hun worteltransformatie (of het draaipunt, als het een enkel object is) zich onderaan bevindt.

  • Beweeg de hoofdcamera voor een oppervlak

Als je nu op Afspelen drukt, zou je een object moeten kunnen spawnen door met de linkermuisknop op het oppervlak te klikken en de objecten te verwijderen door de linkershift + linkerklik ingedrukt te houden.

Als u op '1' drukt, wordt de volgende Prefab in de lijst geselecteerd en als u op '2' drukt, wordt de vorige geselecteerd.

Voorgestelde artikelen
Script voor het maken van een lichtschakelaar in eenheid
RTS-stijl eenheidselectie voor Unity
Raycast- en projectielgebaseerd schietscript voor Unity
Joystickcontroller instellen voor beweging in eenheid
2D Melee Attack-tutorial voor Unity
Hoe u het nieuwe HDRP-watersysteem in eenheid kunt gebruiken
Ultimate Spawner 2.0 - Een baanbrekende troef