Unity Cách sinh ra các đối tượng khi nhấp chuột

Trong hướng dẫn này, tôi sẽ hướng dẫn cách tạo ra một Đối tượng bằng một cú nhấp chuột trong Unity.

Tập lệnh sẽ xử lý việc sinh ra Prefabs trên vị trí chuột cùng với việc căn chỉnh chúng với bề mặt bình thường.

Unity 3D tạo ra các Prefab đối tượng chỉ bằng một cú nhấp chuột

bước

  • Tạo một tập lệnh mới, đặt tên là SC_ClickSpawner và dán mã bên dưới vào trong tập lệnh đó:

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);
        }  
    }
}
  • Đính kèm tập lệnh SC_ClickSpawner vào Camera chính
  • Gán Prefabs mà bạn dự định sinh ra vào mảng Prefabs trong SC_ClickSpawner

  • Trong trường hợp của tôi, tôi sẽ sử dụng các hình dạng đơn giản:

Mẹo: Để ngăn các prefab được sinh ra hiển thị "buried" trên bề mặt, hãy đảm bảo biến đổi gốc của chúng (hoặc trục xoay, nếu đó là một đối tượng) ở dưới cùng.

  • Di chuyển Camera chính phía trước một bề mặt

Bây giờ, khi bạn nhấn Play, bạn sẽ có thể tạo ra một Đối tượng bằng cách nhấp chuột trái vào bề mặt và loại bỏ các Đối tượng bằng cách giữ Shift trái + Nhấp chuột trái.

Nhấn '1' sẽ chọn Prefab tiếp theo trong danh sách và nhấn '2' sẽ chọn Prefab trước đó.

Bài viết được đề xuất
Tập lệnh tạo công tắc đèn trong Unity
Cách thiết lập bộ điều khiển cần điều khiển để chuyển động trong Unity
Hướng dẫn tấn công cận chiến 2D cho Unity
Tập lệnh bắn súng dựa trên Raycast và đạn cho Unity
Lựa chọn đơn vị kiểu RTS cho sự thống nhất
Cách sử dụng Bộ điều khiển Xbox trong Unity
Tài sản thống nhất hàng đầu từ Cửa hàng tài sản