الوحدة كيفية إنتاج الكائنات عند النقر بالماوس

في هذا البرنامج التعليمي، سأوضح كيفية إنشاء كائن بنقرة ماوس في Unity.

سيتعامل البرنامج النصي مع وضع Prefabs في موضع الماوس بالإضافة إلى محاذاتها مع السطح الطبيعي.

يقوم Unity 3D بإنشاء المباني الجاهزة للكائن بنقرة ماوس

خطوات

  • قم بإنشاء سكريبت جديد، وأطلق عليه اسم SC_ClickSpawner، والصق الكود أدناه بداخله:

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);
        }  
    }
}
  • قم بإرفاق البرنامج النصي SC_ClickSpawner بالكاميرا الرئيسية
  • قم بتعيين Prefabs الذي تنوي نشره في مصفوفة Prefabs في SC_ClickSpawner

  • في حالتي، سأستخدم أشكالًا بسيطة:

نصيحة: لمنع المباني الجاهزة الناتجة من أن تكون "buried" في السطح، تأكد من أن تحويل الجذر (أو المحور، إذا كان كائنًا واحدًا) موجود في الأسفل.

  • حرك الكاميرا الرئيسية أمام السطح

الآن عندما تضغط على Play، يجب أن تكون قادرًا على إنتاج كائن عن طريق النقر بزر الماوس الأيسر على السطح وإزالة الكائنات عن طريق الضغط على Left Shift + Left Click.

سيؤدي الضغط على '1' إلى تحديد المبنى الجاهز التالي في القائمة، بينما يؤدي الضغط على '2' إلى تحديد السابق.