1. 程式人生 > >關於Unity中的3D拾取

關於Unity中的3D拾取

for screen 畫面 原理 epo per touch date 檢測

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是數據成員

Camera.main

關於Unity中的3D拾取