Unity Cum se generează obiecte la clic de mouse

În acest tutorial, voi arăta cum să generați un obiect cu un clic de mouse în Unity.

Scriptul se va ocupa de generarea Prefabs pe poziția mouse-ului împreună cu alinierea lor la normalul suprafeței.

Unity 3D generează prefabricatele obiectului cu un clic de mouse

Pași

  • Creați un script nou, numiți-l SC_ClickSpawner și inserați codul de mai jos în el:

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);
        }  
    }
}
  • Atașați scriptul SC_ClickSpawner la Camera principală
  • Atribuiți Prefabs pe care intenționați să le generați matricei Prefabs din SC_ClickSpawner

  • În cazul meu, voi folosi forme simple:

Sfat: Pentru a preveni ca prefabricatele generate să fie "buried" pe suprafață, asigurați-vă că transformarea lor rădăcină (sau pivotul, dacă este un singur obiect) este în partea de jos.

  • Mutați camera principală în fața unei suprafețe

Acum, când apăsați Play, ar trebui să puteți genera un obiect făcând clic stânga pe suprafață și eliminați obiectele ținând apăsat Shift stânga + clic stânga.

Apăsând '1' se va selecta următorul Prefab din listă și apăsând '2' se va selecta pe precedentul.

Articole sugerate
Script pentru crearea unui comutator de lumină în Unity
Cum să configurați controlerul cu joystick pentru mișcare în Unity
Script de împușcare cu arma Raycast și proiectile pentru Unity
Tutorial de atac corp la corp 2D pentru Unity
Selectarea unității în stil RTS pentru Unity
Cum să utilizați controlerul Xbox în Unity
Editor de hărți de înălțime a terenului în joc pentru Unity