using UnityEngine;// 这个脚本实现了,本脚本所在的游戏物体能够被拖拽
public class DragObjectT : MonoBehaviour
{private Vector3 screenPoint; // 存储物体在屏幕上的位置private Vector3 offset; // 存储鼠标点击位置与物体实际位置的偏移量private bool isDragging = false; // 标志位,表示物体是否正在被拖拽void Update(){// 检测鼠标左键是否按下if (Input.GetMouseButtonDown(0)){RaycastHit hit;Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition); // 从摄像机发射一条射线到鼠标位置// 使用射线检测是否击中了某个物体if (Physics.Raycast(ray, out hit)){// 检查被击中的物体是否是本脚本所附加的物体if (hit.collider.gameObject == gameObject){screenPoint = Camera.main.WorldToScreenPoint(gameObject.transform.position); // 将物体的世界坐标转换为屏幕坐标offset = gameObject.transform.position - Camera.main.ScreenToWorldPoint(new Vector3(Input.mousePosition.x, Input.mousePosition.y, screenPoint.z)); // 计算偏移量isDragging = true; // 设置拖拽标志位为真}}}// 检测鼠标左键是否持续按下并且物体正在被拖拽if (Input.GetMouseButton(0) && isDragging){Vector3 curScreenPoint = new Vector3(Input.mousePosition.x, Input.mousePosition.y, screenPoint.z); // 获取当前鼠标位置的屏幕坐标Vector3 curPosition = Camera.main.ScreenToWorldPoint(curScreenPoint) + offset; // 将屏幕坐标转换为世界坐标并加上偏移量transform.position = curPosition; // 更新物体的位置}// 检测鼠标左键是否释放if (Input.GetMouseButtonUp(0)){isDragging = false; // 设置拖拽标志位为假}}
}