using UnityEngine; using UnityEngine.EventSystems; public class UIDragToScene3D : MonoBehaviour, IBeginDragHandler, IDragHandler, IEndDragHandler { public GameObject buildingPrefab; // 对应的建筑预制件 private GameObject previewObject; // 拖动时显示的建筑物(实际的 3D 模型) /// /// 开始拖动时 /// /// public void OnBeginDrag(PointerEventData eventData) { Debug.Log("Drag Started"); // 创建一个 3D 物体作为拖动中的预览对象 if (buildingPrefab != null) { previewObject = Instantiate(buildingPrefab); previewObject.GetComponent().enabled = false; // 禁用碰撞体,避免干扰物理检测 } } // 拖动中 public void OnDrag(PointerEventData eventData) { if (previewObject != null) { // 获取鼠标的世界坐标 Vector3 mouseWorldPosition = GetMouseWorldPosition(); previewObject.transform.position = mouseWorldPosition; // 更新预览对象的位置 } } /// /// 拖动结束时 /// /// public void OnEndDrag(PointerEventData eventData) { Debug.Log("Drag Ended"); if (previewObject != null) { // 在拖动结束时将预览对象转为实际的建筑物 previewObject.GetComponent().enabled = true; // 恢复碰撞体 previewObject = null; // 清空预览对象 } } /// /// 获取鼠标的世界坐标 /// /// private Vector3 GetMouseWorldPosition() { Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition); if (Physics.Raycast(ray, out RaycastHit hit, Mathf.Infinity)) { // 如果射线命中地面,返回命中的点 return hit.point; } else { // 如果没有命中地面,返回一个默认点 return ray.GetPoint(10); // 默认距离相机 10 个单位 } } }