1. 程式人生 > >unity3d 射線的原理,基礎用法

unity3d 射線的原理,基礎用法

oid engine clas distance pda int rigidbody pub tps

射線:射線是3D世界中一個點向一個方向發射的一條無終點的線,在發射軌跡中與其他物體發生碰撞時,它將停止發射 。

Ray射綫類和RaycastHit射綫投射信息類是射綫常用的兩個工具類。

用途:射線多用於碰撞檢測(如:射擊遊戲裏是否擊中目標)、角色移動、判斷是否觸碰到3D世界中的哪些物體對象,進而操作等。

基礎API:

Ray 射線類 :【使用鼠標拾取或者判斷子彈是否碰到對象,需要往特定方向發射射綫。方向可能是世界坐標中的一個矢量方向,或屏幕上某一點。針對後者,提供了兩個API,如下:】

1、Ray Camera.main.ScreenPointToRay(Vector3 pos) 返回一條射線Ray從攝像機的近口點nearClip到屏幕指定一個點;若射綫未碰撞到物體,碰撞點hit.point的值是(0,0,0);pos:利用實際像素值表示射綫到屏幕上的位置。pos的x或者y分量由0增到最大值,射綫將由一邊移到另一邊。但pos是在屏幕上,故z分量始終是0;

2、Ray Camera.main.ViewportPointToRay(Vector3 pos) 返回一條射線Ray從攝像機到視口(視口之外無效)指定一個點;pos:用單位化比例值的方式表示射綫到屏幕上的位置。

RaycastHit 光線投射碰撞信息:

1、bool Physics.Raycast(Vector3 origin, Vector3 direction, float distance, int layerMask)

射綫與碰撞器發生碰撞時返回真,否則未穿過任何碰撞器返回false。【origin:在世界坐標中射線起點;direction:射線的方向矢量;distance:

射線長度,即起點到終點的距離,默認是無限長;layerMask:顯示層掩碼,指定層次的碰撞器碰撞,其他層次的碰撞則會忽略掉】

2、 bool Physics.Raycast(Ray ray, Vector3 direction, RaycastHit out hit, float distance, int layerMask)

在場景中投下可與所有碰撞器碰撞的一條光線,並返回碰撞的信息,包括位置等的信息。

3、 bool Physics.Raycast(Ray ray, float distance, int layerMask)

當光線投射與任何碰撞器交叉時為真,否則為假。

4、 bool Physics.Raycast(Vector3 origin, Vector3 direction, RaycastHit out hit,float distance, int layerMask)

當光線投射與任何碰撞器交叉時為真,否則為假。

註:如果從一個球型體的內部到外部用光線投射,返回為假。

  distance: 射線的長度

  hit: 使用c#中out關鍵字傳入一個空的碰撞信息類,然後碰撞後賦值。可以得到碰撞物體的transform,rigidbody,point等信息。

  layerMask: 只選定Layermask層內的碰撞器,其它層內碰撞器忽略。 選擇性的碰撞

5、RaycastHit[] RaycastAll(Ray ray, float distance, int layerMask)

投射一條光線並返回所有碰撞,也就是投射光線並返回一個RaycastHit[]結構體。

6、layerMask:共有32個層,對應使用一個32位證書的各個位來表示每個層級,儅這個位為1表示使用該層,為0表示不使用該層。

將代碼直接拖拽到主相機上,或者其他對象身上: 

using UnityEngine;
using System.Collections;

public class RayTest : MonoBehaviour {
 
    void Start () {    
    }     
    void Update () 
    {
        if(Input.GetMouseButton(0))
        {
            Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition);//從攝像機發出到點擊坐標的射線
            RaycastHit hitInfo;
            if(Physics.Raycast(ray,out hitInfo))
            {
                Debug.DrawLine(ray.origin,hitInfo.point);//scene視圖可看到 DrawLine(Vector3 origin,Vector3 end,Color col):衹有儅發生碰撞時,在Scene視圖才可以看到畫出的射綫。
                GameObject Obj = hitInfo.collider.gameObject; Debug.Log("click object name is " + Obj.name); if(Obj.tag == "xx")//當射線碰撞目標為名字為xx的對象 ,執行以下操作  { DoSomething.... } } } } }

若有不對之處,還請幫忙指正哦。

射綫的講解很清楚的一個鏈接:https://blog.csdn.net/u013490128/article/details/53317996

unity3d 射線的原理,基礎用法