एकता माउस क्लिक पर वस्तुओं को कैसे उत्पन्न करें
इस ट्यूटोरियल में, मैं दिखाऊंगा कि Unity में माउस क्लिक से किसी ऑब्जेक्ट को कैसे स्पॉन किया जाए।
स्क्रिप्ट माउस स्थिति पर Prefabs को उत्पन्न करने के साथ-साथ उन्हें सामान्य सतह पर संरेखित करने का काम संभालेगी।
कदम
- एक नई स्क्रिप्ट बनाएं, इसे 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 को असाइन करें जिसे आप SC_ClickSpawner में प्रीफ़ैब्स सरणी में स्पॉन करना चाहते हैं
- मेरे मामले में, मैं सरल आकृतियों का उपयोग करूँगा:
युक्ति: उत्पन्न प्रीफ़ैब को सतह पर "buried" होने से रोकने के लिए, सुनिश्चित करें कि उनका मूल परिवर्तन (या धुरी, यदि यह एक एकल वस्तु है) नीचे है।
- मुख्य कैमरे को किसी सतह के सामने ले जाएँ
अब जब आप Play दबाते हैं तो आपको सतह पर बायाँ-क्लिक करके किसी ऑब्जेक्ट को उत्पन्न करने में सक्षम होना चाहिए और बायाँ Shift + बायाँ क्लिक दबाकर ऑब्जेक्ट को हटा देना चाहिए।
'1' दबाने पर सूची में अगला प्रीफ़ैब चयनित हो जाएगा और '2' दबाने पर पिछला चयनित हो जाएगा।