方法一:
利用ViewportToWorldPoint,把视口坐标转为世界坐标
public void OnDrag(PointerEventData eventData)
{
Vector3 pos1 = Camera.main.ScreenToViewportPoint(Input.mousePosition);
Vector3 pos2 = Camera.main.WorldToViewportPoint(transform.position);
Vector3 pos = new Vector3(pos1.x, pos1.y, pos2.z);
transform.position = Camera.main.ViewportToWorldPoint(pos);
}
方法二:
利用ScreenToWorldPoint,把屏幕坐标转为世界坐标
public void OnDrag(PointerEventData eventData)
{
//1:把物体的世界坐标转为屏幕坐标 (依然会保留z坐标)
var currPosition = Camera.main.WorldToScreenPoint(transform.position);
//2:更新物体屏幕坐标系的x,y
currPosition = new Vector3(Input.mousePosition.x, Input.mousePosition.y, currPosition.z);
//3:把屏幕坐标转为世界坐标
var newPosition = Camera.main.ScreenToWorldPoint(currPosition);
//4:更新物体的世界坐标
transform.position = newPosition;
}
方法三:
利用射线检测
public void OnDrag(PointerEventData eventData)
{
//得到摄像机与物体所在平面的距离
ray = Camera.main.ScreenPointToRay(Input.mousePosition);
//射线碰到了物体
if (Physics.Raycast(ray, out hit))
{
transform.position = hit.point;
}
}
注意:方法三在一直点在一个物体上时,物体会不停靠近摄像机,直到贴脸。所以如果需要固定一个方向,比如Z值,或Y值。固定Y值时,物体沿地面移动,代码如下
ray = Camera.main.ScreenPointToRay(Input.mousePosition);
//射线碰到了物体
if (Physics.Raycast(ray, out hit, 100))
{
transform.position = new Vector3(hit.point.x, transform.position.y, hit.point.z);
}
固定Z值时,物体上下左右移动,但改不了前后。
ray = Camera.main.ScreenPointToRay(Input.mousePosition);
//射线碰到了物体
if (Physics.Raycast(ray, out hit, 100))
{
transform.position = new Vector3(hit.point.x, transform.position.y, hit.point.z);
}
版权声明:本文为qq_38893210原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。