需求
鼠標按下選擇某個物體,拖拽,鬆開後停止拖拽
實現代碼
using System.Collections;
using UnityEngine;
public class DragObject : MonoBehaviour {
//目標物體的屏幕空間座標
private Vector3 _vec3TargetScreenSpace;
//目標物體的世界空間座標
private Vector3 _vec3TargetWorldSpace;
//目標物體的空間變換組件
private Transform _trans;
//鼠標的屏幕座標
private Vector3 _vec3MouseScreenSpace;
//偏移量
private Vector3 _vec3Offset;
void Awake()
{
_trans = transform;
}
IEnumerator OnMouseDown()
{
// 把目標物體的世界空間座標轉換到它自身的屏幕空間座標
_vec3TargetScreenSpace = Camera.main.WorldToScreenPoint(_trans.position);
// 存儲鼠標的屏幕空間座標(Z值使用目標物體的屏幕空間座標)
_vec3MouseScreenSpace = new Vector3(Input.mousePosition.x, Input.mousePosition.y, _vec3TargetScreenSpace.z);
// 計算目標物體與鼠標物體在世界空間中的偏移量
_vec3Offset = _trans.position - Camera.main.ScreenToWorldPoint(_vec3MouseScreenSpace);
while (Input.GetMouseButton(0))
{
// 存儲鼠標的屏幕空間座標(Z值使用目標物體的屏幕空間座標)
_vec3MouseScreenSpace = new Vector3(Input.mousePosition.x, Input.mousePosition.y, _vec3TargetScreenSpace.z);
// 把鼠標的屏幕空間座標轉換到世界空間座標(Z值使用目標物體的屏幕空間座標),加上偏移量,以此作爲目標物體的世界空間座標
_vec3TargetWorldSpace = Camera.main.ScreenToWorldPoint(_vec3MouseScreenSpace) + _vec3Offset;
// 更新目標物體的世界空間座標
_trans.position = _vec3TargetWorldSpace;
// 等待固定更新
yield return new WaitForFixedUpdate();
}
}
}
使用方法
直接把該腳本添加到對應物體即可