1.把这段脚本拖给想要拖拽的物体,然后加上碰撞盒就可以了。
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();
}
}
}
public Texture2D[] pic = new Texture2D[4];
private Color c;
private Texture origPic;
private int index;
private Vector3 screenPoint;
private Vector3 scanPos;
private Vector3 offset;
private Vector3 origPos;
static public bool bDrag;
// Use this for initialization
void Start()
{
c = GetComponent<Renderer>().material.color;
origPic = GetComponent<Renderer>().material.mainTexture;
//pic = new Texture2D[4];
index = 0;
scanPos = this.transform.position;
origPos = scanPos;
bDrag = false;
}
// Update is called once per frame
void Update()
{
}
void OnMouseDown()
{
print("Mouse down");
GetComponent<Renderer>().material.color = c;
GetComponent<Renderer>().material.mainTexture = pic[index];
index++;
if (index == 3)
index = 0;
/////
screenPoint = Camera.main.WorldToScreenPoint(scanPos);
offset = scanPos - Camera.main.ScreenToWorldPoint(new Vector3(Input.mousePosition.x, Input.mousePosition.y, screenPoint.z));
Vector3 curScreenPoint = new Vector3(Input.mousePosition.x, Input.mousePosition.y, screenPoint.z);
Vector3 curPosition = Camera.main.ScreenToWorldPoint(curScreenPoint) + offset;
//print(curPosition);
transform.position = curPosition;
}
void OnMouseEnter()
{
print("Mouse enter");
index = 0;
GetComponent<Renderer>().material.color = Color.red;
}
void OnMouseExit()
{
print("Mouse exit");
GetComponent<Renderer>().material.color = c;
GetComponent<Renderer>().material.mainTexture = origPic;
}
void OnMouseDrag()
{
bDrag = true;
Vector3 curScreenPoint = new Vector3(Input.mousePosition.x, Input.mousePosition.y, screenPoint.z);
Vector3 curPosition = Camera.main.ScreenToWorldPoint(curScreenPoint) + offset;
transform.position = curPosition;
print("curPosition" + curPosition);
}
void OnMouseUp()
{
print("mouse up");
//transform.TransformPoint(origPos);
bDrag = false;
transform.position = origPos;
}