实现物体拖拽

在XY平面拖拽

1.使用Camera.main.WorldToScreenPoint 获取到了物体的屏幕坐标的Z值,一般情况下我们觉得屏幕坐标只有XY,这里的Z是物体到摄像机的距离,在下一步使用屏幕坐标转换到世界坐标时传入就可以让物体在原来的Z轴上保持移动。

2.鼠标点中物体的时候计算出一个偏移量,这样就可以保证我们不会在点下去的时候让物体的中心点与点击位置重合而是在点物体的任意位置都可以自然的拖动。

完整代码


public class ObjectDragger : MonoBehaviour
{
    private Vector3 screenPoint;
    private Vector3 offset;
    void OnMouseDown()
    {
        screenPoint = Camera.main.WorldToScreenPoint(gameObject.transform.position);
        offset = gameObject.transform.position - Camera.main.ScreenToWorldPoint(new Vector3(Input.mousePosition.x, Input.mousePosition.y, screenPoint.z));
    }
void OnMouseDrag()
{
    Vector3 curScreenPoint = new Vector3(Input.mousePosition.x, Input.mousePosition.y, screenPoint.z);
    transform.position = Camera.main.ScreenToWorldPoint(curScreenPoint) + offset;
}
}

在XZ平面拖拽

完整代码


public Camera mainCamera;
public Vector3 offset;
private void OnMouseDown()
{
    offset = transform.position - GetPoint();
}
private void OnMouseDrag()
{
    transform.position = GetPoint()+offset;
}
private Vector3 GetPoint()
{
    var dis = (mainCamera.transform.position - transform.position).magnitude;
    var mousePosition = new Vector3(Input.mousePosition.x, Input.mousePosition.y, dis);
    var pos = mainCamera.ScreenToWorldPoint(mousePosition);
    Vector3 fwd = mainCamera.transform.forward;
    float k = (1 - pos.y) / fwd.y;
    pos += fwd * k;
    return pos;
}

比起XY拖拽稍有瑕疵,如果想自行控制拖拽物体的高度,需要做以下修改

去掉offset,将1变为变量height,height的值为最后拖拽时的物体y值

需要注意,当相机角度为(0,0,0)时,参数fwd的y值为0,这时会出现除零操作


public Camera mainCamera;
public float height=2;
private void OnMouseDrag()
{
    transform.position = GetPoint();
}
private Vector3 GetPoint()
{
    var dis = (mainCamera.transform.position - transform.position).magnitude;
    var mousePosition = new Vector3(Input.mousePosition.x, Input.mousePosition.y, dis);
    var pos = mainCamera.ScreenToWorldPoint(mousePosition);
    Vector3 fwd = mainCamera.transform.forward;
    float k = (height - pos.y) / fwd.y;
    pos += fwd * k;
    return pos;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值