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.
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 đó.