Unity Cara Memunculkan Objek di Klik Mouse

Dalam tutorial ini, saya akan menunjukkan cara menelurkan Objek dengan klik mouse di Unity.

Skrip akan menangani pemijahan Prefabs pada posisi mouse dan menyelaraskannya ke permukaan normal.

Unity 3D Memunculkan Prefab Objek dengan Klik Mouse

Langkah

  • Buat skrip baru, beri nama SC_ClickSpawner, dan tempelkan kode di bawah ini ke dalamnya:

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);
        }  
    }
}
  • Lampirkan skrip SC_ClickSpawner ke Kamera Utama
  • Tetapkan Prefabs yang ingin Anda tampilkan ke array Prefabs di SC_ClickSpawner

  • Dalam kasus saya, saya akan menggunakan bentuk sederhana:

Tip: Untuk mencegah prefab yang dihasilkan menjadi "buried" di permukaan, pastikan transformasi akarnya (atau pivot, jika berupa objek tunggal) berada di bagian bawah.

  • Gerakkan Kamera Utama di depan suatu permukaan

Sekarang ketika Anda menekan Play Anda seharusnya dapat memunculkan sebuah Objek dengan mengklik kiri pada permukaan dan menghapus Objek dengan menahan Shift Kiri + Klik Kiri.

Menekan '1' akan memilih Prefab berikutnya dalam daftar dan menekan '2' akan memilih yang sebelumnya.

Artikel yang Disarankan
Script Membuat Saklar Lampu di Unity
Cara Mengatur Pengontrol Joystick untuk Gerakan di Unity
Pemilihan Unit Bergaya RTS untuk Persatuan
Skrip Penembakan Senjata Berbasis Raycast dan Proyektil untuk Unity
Tutorial Serangan Jarak Dekat 2D untuk Unity
Cara Menggunakan Pengontrol Xbox di Unity
Editor Peta Ketinggian Medan dalam game untuk Unity