Unity3D 之射線檢測


這里來記錄下射線檢測的相關內容:

射線檢測故名就是通過射線去檢測是否和碰撞器產生了交集,和碰撞器與碰撞器發生交集一樣,會返回一個真。

射線的用法很多:比如檢測是否跳躍,通過向地面投射射線控制在地面時候可以跳起。

        射擊游戲中可以通過定長射線去判斷目標物體是否被擊中,等

主要用到的工具類是:

Physics

RaycastHit 光線投射碰撞

Ray 射線

第一種是:

Physics.Linecast 線性投射

從開始位置到結束位置做一個光線投射,如果與碰撞體交互,返回真。

        Debug.DrawLine(transform.position, Line_floor.position, Color.red, 1f);
        bool grounded  = Physics.Linecast(transform.position, Line_floor.position, 1 << LayerMask.NameToLayer("Ground"));
        if (grounded)
        {
            Debug.LogError("發生了碰撞");   
  
        }
        else {
            Debug.LogError("碰撞結束");
        }

第二種:

在場景中投下可與所有碰撞器碰撞的一條光線。可控制投射方向和投射長度

 Vector3 fwd = transform.TransformDirection(-Vector3.up);
  bool grounded =  Physics.Raycast(transform.position,fwd, 10 );
        if (grounded)
        {
            Debug.LogError("發生了碰撞");   
  
        }
        else {
            Debug.LogError("碰撞結束");
        }

第三種:

在場景中投下可與所有碰撞器碰撞的一條光線,並返回碰撞的細節信息。

    RaycastHit hit;
         bool grounded = Physics.Raycast(transform.position, -Vector3.up, out hit);
         // 可控制投射距離bool grounded = Physics.Raycast(transform.position, -Vector3.up, out hit,100.0);
        if (grounded)
        {
            Debug.LogError("發生了碰撞");
            Debug.LogError("距離是:" + hit.distance);
            Debug.LogError("被碰撞的物體是:" + hit.collider.gameObject.name);
  
        }
        else {
            Debug.LogError("碰撞結束");
        }

注意,這里返回的碰撞器的信息是依次的,先返回第一個碰撞的,第一個碰撞結束后才返回第二個。

第四種:

Physics.RaycastAll 所有光線投射

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

        RaycastHit[] hits;
        hits = Physics.RaycastAll(transform.position, -Vector3.up, 100.0F);
        int i = 0;

        while (i < hits.Length)
        {
            Debug.LogError("發生了碰撞");
            RaycastHit hit = hits[i];
            Debug.LogError("被碰撞的物體是:" + hit.collider.gameObject.name);
            i++;
        }

 第五種:

控制碰撞的層,可以設置射線的長度,並且用debug查看射線的長度。

使用層的時候,要注意,要給別的對象也附上層的名字,不能用缺省,會出問題。

          RaycastHit hit;
         // Debug.DrawLine()
          bool grounded = Physics.Raycast(transform.position, transform.up, out hit, 10000f, 1 << LayerMask.NameToLayer("Diren"));
          Debug.DrawRay(transform.position, transform.up * 10000f, Color.red);
          if (grounded)
         {
             Debug.LogError("發生了碰撞");
             Debug.LogError("距離是:" + hit.distance);
             Debug.LogError("被碰撞的物體是:" + hit.collider.gameObject.name);
  
         }
         else {
             Debug.LogError("碰撞結束");
         } 

第五種:

Physics.OverlapSphere 相交球

返回球型半徑之內(包括半徑)的所有碰撞體 collider[]。可用於拾取物品用。

   Collider[] col =  Physics.OverlapSphere(transform.position,1f, 1 << LayerMask.NameToLayer("zhuangbei"));
        if (col.Length > 0)
        {
            foreach (Collider zhuangbei in col)
            {
                zhuangbei.gameObject.GetComponent<Renderer>().material.color = Color.red;
            }
        }

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM