首页 > 代码库 > 【转】Unity3D 入门小技巧——鼠标拾取并移动物体

【转】Unity3D 入门小技巧——鼠标拾取并移动物体

http://blog.csdn.net/sysujackjiao/article/details/69396274

一、鼠标拾取物体的原理

在Unity3D当中,想要在观察面(Aspect)中拾取物体(有碰撞属性)的方法一般如下:

1、声明一个观察的摄像机、一个从摄像机原点出发的射线Ray以及一个用于检测碰撞的RaycastHit;

2、将射线Ray定义为从摄像机原点出发并且指向当前鼠标所在的坐标(屏幕坐标);

3、定义碰撞RaycastHit为射线Ray与有碰撞属性的物体的碰撞点。

具体代码实现如下(C#代码):

 

[csharp] view plain copy
 
  1. <span style="font-size:10px;">using System.Collections;  
  2. using System.Collections.Generic;  
  3. using UnityEngine;  
  4.   
  5. public class camera : MonoBehaviour  
  6. {  
  7.     public Camera ca;  
  8.     private Ray ra;  
  9.     private RaycastHit hit;  
  10.   
  11.     // Use this for initialization  
  12.     void Start()  
  13.     {  
  14.   
  15.     }  
  16.   
  17.     // Update is called once per frame  
  18.     void Update()  
  19.     {  
  20.             ra = ca.ScreenPointToRay(Input.mousePosition);  
  21.             if (Physics.Raycast(ra, out hit))  
  22.             {    
  23.                        
  24.             }  
  25.     }  
  26. }</span>  

应用一:当鼠标按住不动时,移动被选定物体随鼠标一起移动

[csharp] view plain copy
 
  1. <span style="font-size:10px;">using System.Collections;  
  2. using System.Collections.Generic;  
  3. using UnityEngine;  
  4.   
  5. public class camera : MonoBehaviour  
  6. {  
  7.     public Camera ca;  
  8.     private Ray ra;  
  9.     private RaycastHit hit;  
  10.   
  11.     // Use this for initialization  
  12.     void Start()  
  13.     {  
  14.   
  15.     }  
  16.   
  17.     // Update is called once per frame  
  18.     void Update()  
  19.     {  
  20.         if (Input.GetMouseButton(0))  
  21.         {  
  22.             ra = ca.ScreenPointToRay(Input.mousePosition);  
  23.             if (Physics.Raycast(ra, out hit))  
  24.             {  
  25.                 hit.collider.gameObject.transform.position = ca.ScreenToWorldPoint(new Vector3(Input.mousePosition.x, Input.mousePosition.y, hit.collider.gameObject.transform.position.z));  
  26.             }  
  27.         }  
  28.     }  
  29. }</span>  

应用二:当鼠标点击物体时,物体随鼠标一起移动;当鼠标再次点击时,放下物体。

[csharp] view plain copy
 
  1. <span style="font-size:12px;">using System.Collections;  
  2. using System.Collections.Generic;  
  3. using UnityEngine;  
  4.   
  5. public class camera : MonoBehaviour {  
  6.     public Camera ca;  
  7.     private Ray ra;  
  8.     private RaycastHit hit;  
  9.     private int flag = 0;  
  10.   
  11.     // Use this for initialization  
  12.     void Start () {  
  13.           
  14.     }  
  15.       
  16.     // Update is called once per frame  
  17.     void Update () {  
  18.         if (Input.GetMouseButtonDown(0))  
  19.         {  
  20.             ra = ca.ScreenPointToRay(Input.mousePosition);  
  21.             if (Physics.Raycast(ra, out hit))  
  22.             {  
  23.                if (flag == 0)  
  24.                 {  
  25.                     flag = 1;  
  26.                 } else  
  27.                 {  
  28.                     flag = 0;  
  29.                 }  
  30.             }  
  31.         }  
  32.         if (flag == 1)  
  33.         {  
  34.             hit.collider.gameObject.transform.position = ca.ScreenToWorldPoint(new Vector3(Input.mousePosition.x, Input.mousePosition.y, hit.collider.gameObject.transform.position.z));  
  35.         }  
  36.   
  37.     }  
  38. }  
  39. </span>  
技术分享

 

 

 

Unity3D鼠标坐标转世界坐标和局部坐标

鼠标坐标转世界坐标和局部坐标:
    Vector3 MousePosition2Local () {
        mousePosition = Input.mousePosition; //获取屏幕坐标
        mouseWorldPos = Camera.main.ScreenToWorldPoint (mousePosition); //屏幕坐标转世界坐标
        mouseLocalPos = transform.parent.transform.InverseTransformPoint (mouseWorldPos); //世界坐标转本地坐标

        return CorrectPos(mouseLocalPos);
    }

 

 

【转】Unity3D 入门小技巧——鼠标拾取并移动物体