• 您的位置:首頁 > 新聞動態 > Unity3D

    Unity3D的射(shè)線碰撞檢測(cè)方法總結

    2019/12/12      點擊:

    射線(xiàn)檢測故名就是通過射線(xiàn)去檢測是否和碰撞器產生了交集,和碰撞(zhuàng)器與碰撞器發生交集一樣,如果檢測到了會返回一(yī)個真。
    射線的用法很多:比(bǐ)如檢測是否跳躍,通(tōng)過向地麵投(tóu)射射線控製在地麵時候可以跳起。
            射擊遊戲中可以通過(guò)定長射線去判斷目標物體是否被擊中等(děng)

    主要用(yòng)到(dào)的工具類有:

    • Physics
    • RaycastHit 光線投射(shè)碰撞
    • Ray 射線(xiàn)


    第(dì)1種方法:Physics.Linecast 線性投射
    從開(kāi)始位置到(dào)結束位(wèi)置做一個光線投射,如果與碰(pèng)撞體交(jiāo)互,返回真。

     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("碰撞結束");
     }
    第二種方法在場景中投下可與所有碰撞(zhuàng)器碰撞的一條光線。可控製投射(shè)方向和投射長度(dù)。
    Vector3 fwd = transform.TransformDirection(-Vector3.up);
    bool grounded =  Physics.Raycast(transform.position,fwd, 10 );
    if (grounded)
     {
       Debug.LogError("發生了碰撞");   
     }
    else 
    {
        Debug.LogError("碰撞結束");
     }
    第三(sān)種方法:在場景中投(tóu)下可與所有碰撞器碰撞的一條光線,並返回碰撞的細節信息。



    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("發生了碰撞(zhuàng)");
    Debug.LogError("距離(lí)是(shì):" + hit.distance);
    Debug.LogError("被碰撞的物體是:" + hit.collider.gameObject.name);
    }
    else {
    Debug.LogError("碰撞結束");
    }
    
    注意:這(zhè)裏返回的碰撞器的信息是依次的,先返回第一個碰撞的(de),第一個碰撞結束後才返回第(dì)二個。


    第四種方法:Physics.RaycastAll 所有光線投(tóu)射。

    投射一條光(guāng)線並返回所有碰撞,也(yě)就是投射光線並返回一個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("被碰撞的物體(tǐ)是:" + hit.collider.gameObject.name);
    i++;
    }


    第五種方法:控製碰撞的層,可以設置射線(xiàn)的長度,並(bìng)且用debug查(chá)看(kàn)射線的長度。

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


    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("碰撞結束");
    }
    第五種(zhǒng):Physics.OverlapSphere 相交球。
    返回球型半徑之內(包括半徑)的所有碰撞體 collider[]。可用於拾取物品用(yòng)。此方法在VR交互(hù)時為了提高用戶體(tǐ)驗,使用較(jiào)多。
    Collider[] col =  Physics.OverlapSphere(transform.position,1f, 1 << LayerMask.NameToLayer("zhuangbei"));
    if (col.Length > 0)
    {
    foreach (Collider zhuangbei in col)
    {
      zhuangbei.gameObject.GetComponent().material.color = Color.red;
    }
    }




    网站地图 正能量网-传播正能量弘扬主旋律-免费正能量网站www正能量-免费正能量网站www正能量下载在线观看官网