unity3d 射线的原理,基础用法

射线:射线是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

用途:射线多用于碰撞检测(如:射击游戏里是否击中目标)、角色移动、判断是否触碰到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

猜你喜欢

转载自www.cnblogs.com/allyh/p/9190725.html