3D拾取
3D游戲實際上看到的是2D畫面,我們在屏幕上點擊,想要找到哪個3D物體,我們實際上是在一個2維平面內做3D拾取。
3D拾取實際上是,當玩家點擊屏幕的時候,會從顯示屏幕的攝像頭發射一條射線,射到它所照射的平面上,射線第一次碰撞到的物體就是玩家所選的物體。
1: 游戲中需要用戶觸摸/點擊 操作3D世界里面的3D物體,那么需要判斷用戶點擊的是3D中的哪個物體;
2: 3D拾取的原理: 從攝像機到屏幕空間的觸摸點發出一條射線,這條射線第一個撞到哪個3D物體就會認為哪個3D物體被用戶選擇;
3: 代碼編寫
(1) 發射一條射線: Ray ray = Camera.main.ScreenPointToRay(Touch.position);
(2) 檢測撞到那個物體: Raycast hit; bool Physics.Raycast(ray, out hit);
(3) hit.transform, 獲得物體的transform組件, name可以獲得被碰撞的物體的名字;
(4) Camera.main獲取當前我們的主Camera
(5) 如果要拾取,需要有一個碰撞器
3D拾取實例
1.創建Unity工程目錄
2.創建一個立方體Cube,自帶Box Collider(其他物體想要參與3D拾取的必須有碰撞器組件才可以)
3.創建一個腳本ray_test掛載到Cube節點下
4.打開ray_test
using UnityEngine; using System.Collections; public class ray_test : MonoBehaviour { // Use this for initialization void Start () { } // Update is called once per frame void Update () { if (Input.GetMouseButtonDown(0)) {//判斷鼠標是否按下 // 從攝像機開始,到屏幕觸摸點,發出一條射線 Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition); // 撞擊到了哪個3D物體 RaycastHit hit; if (Physics.Raycast(ray, out hit)) { Debug.Log(hit.transform.name);//打印出碰撞到的節點的名字 } } } }
5.點擊Game視圖中的Cube,控制台打印出Cube的名字Cube
注意:
獲取主攝像機方法,main是數據成員,使用的時候注意Main Camera節點的Tag必須是MainCamera
Camera.main