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; // 设置拖拽标志位为假
}
}
}
标签:鼠标,物体,Vector3,世界坐标,Unity,UI,Input,拖拽,mousePosition From: https://www.cnblogs.com/guangzhiruijie/p/18492445