《鼠标点击物体,物体跟随光标移动》与《鼠标按住左键不放拖拽物体》

今天做了个关于鼠标拾取的例子,现在场景中有一个物体,我们想实现一个功能是:点击一次物体,再移动鼠标,物体会跟随鼠标的光标移动的功能。

现在场景中有一个测量工具磁钢表,它就是我们所说的物体,如图:

附上代码:

public class MouseFollow2 : MonoBehaviour {
    Camera camera;
    Quaternion _cigangbiaoRotateStart = Quaternion.Euler(90f, 90f, 180f);
    Quaternion _cigangbiaoRotateEnd = Quaternion.Euler(0f, 270f, 0f);
    public float rotateSpeed;
    private bool isInput;
    Vector3 screenPosition;
    Vector3 mScreenPosition;
    Vector3 offset;


// Use this for initialization
void Start () {

}

// Update is called once per frame
void Update () {
        if (isInput)
        {
            
            transform.localRotation = Quaternion.RotateTowards(_cigangbiaoRotateStart, _cigangbiaoRotateEnd, rotateSpeed);


            //鼠标屏幕上新位置
            mScreenPosition = new Vector3(Input.mousePosition.x, Input.mousePosition.y, screenPosition.z);


            // 对象新坐标 
            transform.position = offset + camera.ScreenToWorldPoint(mScreenPosition);
            
        }

}
    IEnumerator OnMouseDown()
    {


        camera = Camera.main;
        if (camera)
        {
            //转换对象到当前屏幕位置
            screenPosition = camera.WorldToScreenPoint(transform.position);


            //鼠标屏幕坐标
            mScreenPosition = new Vector3(Input.mousePosition.x, Input.mousePosition.y, screenPosition.z);
            //获得鼠标和对象之间的偏移量,拖拽时相机应该保持不动
            offset = transform.position - camera.ScreenToWorldPoint(mScreenPosition);
            print("drag starting:" + transform.name);


            //若鼠标左键一直按着则循环继续
            if(Input.GetMouseButton(0))
            {


                if (!isInput)
                {
                    isInput = true;
                }
                else
                {
                    isInput = false;
                }
            }
          
            
            yield return new WaitForFixedUpdate();


            print("drag compeleted");


           


        }
    }
}

将该脚本绑在这个物体对象上,功能完成。现在你可以按下鼠标左键一次选中该物体,移动光标,物体会跟随光标移动,再点击鼠标左键一次,物体“被放在了你想要放置的位置”。

下面是关于鼠标左键按住不放的功能代码,同样将这段代码绑定在物体对象上,实现该功能。

public class MouseFollow2 : MonoBehaviour {
    Camera camera;
    Quaternion _cigangbiaoRotateStart = Quaternion.Euler(90f, 90f, 180f);
    Quaternion _cigangbiaoRotateEnd = Quaternion.Euler(0f, 270f, 0f);
    public float rotateSpeed;


// Use this for initialization
void Start () {

}

// Update is called once per frame
void Update () {
     

}
    IEnumerator OnMouseDown()
    {


        camera = Camera.main;
        if (camera)
        {
            //转换对象到当前屏幕位置
            Vector3  screenPosition = camera.WorldToScreenPoint(transform.position);
            //鼠标屏幕坐标
            Vector3 mScreenPosition = new Vector3(Input.mousePosition.x, Input.mousePosition.y, screenPosition.z);
            //获得鼠标和对象之间的偏移量,拖拽时相机应该保持不动
            Vector3 offset = transform.position - camera.ScreenToWorldPoint(mScreenPosition);
            print("drag starting:" + transform.name);


            //若鼠标左键一直按着则循环继续
            if(Input.GetMouseButton(0))
            {

   transform.localRotation = Quaternion.RotateTowards(_cigangbiaoRotateStart, _cigangbiaoRotateEnd, rotateSpeed);


            //鼠标屏幕上新位置
            mScreenPosition = new Vector3(Input.mousePosition.x, Input.mousePosition.y, screenPosition.z);


            // 对象新坐标 
            transform.position = offset + camera.ScreenToWorldPoint(mScreenPosition);
            }
          
            
            yield return new WaitForFixedUpdate();


            print("drag compeleted");


           


        }
    }
}



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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值