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

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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 入门小技巧——鼠标拾取并移动物体的主要内容,如果未能解决你的问题,请参考以下文章

Unity3D基础让物体动起来①--UGUI鼠标点击移动

Unity基于响应式编程(Reactive programming)入门

unity3d中点击一个按钮实现相机之间的转换,点选已添加物体,并使用键盘实现移动鼠标实现旋转缩放操作

unity3d 2D平面游戏实现鼠标拖拽物体移动

unity3D鼠标坐标和世界坐标问题

unity3d鼠标点击地图自动寻路,如何让点击场景和小地图都能自动寻路。