Unity3D的射線碰撞檢測方法總結
2019/12/12 點(diǎn)擊:
射線檢測(cè)故名就是通過射線去檢測是否和碰撞器產生了交集,和碰撞器與碰撞器發(fā)生交集一樣,如(rú)果檢測到了會返回一個真。
射線的用法很多(duō):比(bǐ)如檢測是否(fǒu)跳躍,通過向地麵投射射線控製在地麵時候可以跳起。
射擊遊戲中可以通過定(dìng)長射線(xiàn)去(qù)判斷目標(biāo)物體是否被擊(jī)中等
主(zhǔ)要用到的工具類有:
- Physics
- RaycastHit 光線投射碰撞
- Ray 射線
第1種方法:Physics.Linecast 線性投射
從開始位置到結束位置(zhì)做一個光線投射,如果與(yǔ)碰撞體交互,返回真。
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("碰撞結束"); }第二種方法:在場(chǎng)景(jǐng)中投下可與所有碰撞器碰撞的一條光線。可控製投射方向和投射長(zhǎng)度。
Vector3 fwd = transform.TransformDirection(-Vector3.up); bool grounded = Physics.Raycast(transform.position,fwd, 10 ); if (grounded) { Debug.LogError("發生了碰(pèng)撞"); } else { Debug.LogError("碰撞結束(shù)"); }第三種方(fāng)法:在場(chǎng)景中投下可(kě)與所(suǒ)有碰撞器(qì)碰撞的一條光線,並(bìng)返回碰撞的(de)細節信(xìn)息。
RaycastHit hit; bool grounded = Physics.Raycast(transform.position, -Vector3.up, out hit); // 可控製投射距(jù)離bool grounded = Physics.Raycast(transform.position, -Vector3.up, out hit,100.0); if (grounded) { Debug.LogError("發生了碰撞"); Debug.LogError("距離是(shì):" + hit.distance); Debug.LogError("被碰撞的物體是:" + hit.collider.gameObject.name); } else { Debug.LogError("碰撞結束"); }注意:這(zhè)裏返回的碰撞器的信息是依次的,先返回第一個碰(pèng)撞的,第一(yī)個碰撞結束後才返回第二(èr)個。
第四種方法:Physics.RaycastAll 所有光線(xiàn)投射。
投射一條光線並返(fǎn)回所有碰撞,也就是投射光線並返(fǎn)回一個(gè)RaycastHit[]結構體(tǐ)。
RaycastHit[] hits; hits = Physics.RaycastAll(transform.position, -Vector3.up, 100.0F); int i = 0; while (i < hits.Length) { Debug.LogError("發生了碰撞(zhuàng)"); RaycastHit hit = hits[i]; Debug.LogError("被碰(pèng)撞(zhuàng)的物體是:" + hit.collider.gameObject.name); i++; }

第五種方法:控製碰撞的層,可以設置射線的(de)長度,並(bìng)且用debug查看射線的(de)長度。
使(shǐ)用層的時候,要(yào)注意,要給別的(de)對象也附上層的(de)名字,不能用缺(quē)省,會出問題。
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("被碰撞的(de)物體是:" + hit.collider.gameObject.name);} else { Debug.LogError("碰撞結束"); }第五種:Physics.OverlapSphere 相交球。
返回球型半徑之內(包括半徑)的所(suǒ)有碰撞(zhuàng)體 collider[]。可用於拾取物品用。此方(fāng)法在VR交互時為了提高用戶體驗,使用較多。
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; } }
- 上一篇:Unity3D跨屏幕、全屏顯示方法 2019/12/14
- 下一篇:WISEGLOVE數據手套的部分高校(xiào)客戶 2019/11/29