zoukankan      html  css  js  c++  java
  • 【转】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);
        }

     

     

  • 相关阅读:
    GPON和820.1p学习及资料(zt)
    modelsim(3)
    JTAG 学习 -SVF格式
    看来人工智能不可阻挡,将和网络与计算机一样服务于各行各业!
    【管理心得之二十六】职场中的“武功”
    【管理心得之二十五】组织中的骂名 ----------墙头草
    【管理心得之二十四】成功乃失败之母
    【管理心得之二十三】道是道,非常道。名可名,非常名。
    【管理心得之二十二】小人物 仰视 大授权
    【管理心得之二十一】管得少就是管得好
  • 原文地址:https://www.cnblogs.com/mimime/p/6757467.html
Copyright © 2011-2022 走看看