Unity学习之——拖动物体(摄像机透视、正交模式均可)


1.点中物体拖动的方法(将脚本挂在需要拖动的物体上即可)


public class Test : MonoBehaviour 
{
    bool IsDrag=false;//是否能拖动
    Vector3 offset;//两者的向量
    Vector3 screenPoint;//物体的屏幕坐标
    void Update()
    {
      screenPoint = Camera.main.WorldToScreenPoint(transform.position);//得到物体的屏幕坐标 
      if (Input.GetKey(KeyCode.Mouse0) && IsDrag)//拖动中
      {
           Vector3 curScreenSpace = new Vector3(Input.mousePosition.x, Input.mousePosition.y, screenPoint.z);//实时计算鼠标屏幕坐标 
           Vector3 curPosition = Camera.main.ScreenToWorldPoint(curScreenSpace)+offset;//将当前鼠标的屏幕坐标转换成世界坐标,再加上两者间的距离
           transform.position = curPosition;//新坐标赋值
      }
      if (Input.GetKeyUp(KeyCode.Mouse0) && IsDrag)
        {
             IsDrag = false;//左键抬起,重新初始化           
        }
    }
  /// <summary>
  /// 回调函数,当物体被鼠标点中时才执行
  /// </summary>
  void OnMouseDown()
    {
        IsDrag = true;//可以拖动
        offset = transform.position - Camera.main.ScreenToWorldPoint(new Vector3(Input.mousePosition.x, Input.mousePosition.y, screenPoint.z));//计算此刻物体与鼠标之间的距离,由于鼠标坐标是二维,因此要转成世界坐标      
    }
}

2.点中屏幕拖动的方法(类似飞机大战,将脚本挂在需要拖动的物体上即可)



public class Test2 : MonoBehaviour 
{
     Vector3 offset;//两者的向量
     Vector3 screenPoint;//物体的屏幕坐标

     void Start () 
     {
        screenPoint = Camera.main.WorldToScreenPoint(transform.position);//得到物体的屏幕坐标      
     }
      void Update () 
     {
        Vector3 vector = Input.mousePosition;//实时计算鼠标的屏幕坐标
        if (Input.GetKeyDown(KeyCode.Mouse0))
        {
            offset = screenPoint - vector;//鼠标按下,计算鼠标与物体的距离(物体的坐标要先转换成屏幕坐标,这步很重要)
        }
        if (Input.GetKey(KeyCode.Mouse0))
        {
            Vector3 curPosition = vector + offset;//鼠标坐标加上两者的距离
            transform.position = Camera.main.ScreenToWorldPoint(curPosition);//将屏幕坐标转化成世界坐标并赋值
            screenPoint = Camera.main.WorldToScreenPoint(transform.position);//重新计算物体的屏幕坐标      
        }
      }
   }

猜你喜欢

转载自blog.csdn.net/www1501766557/article/details/85835530