Unity3D的射線碰撞檢測方法(fǎ)總結
射線檢測故名就是通(tōng)過射線去檢測是否和碰(pèng)撞器產生了交(jiāo)集,和碰撞器(qì)與碰撞器發生交集一樣,如果檢(jiǎn)測到了會返回一個真。
射線的用法(fǎ)很(hěn)多:比如檢測是否跳躍,通過向地麵投射(shè)射(shè)線控製(zhì)在地麵時(shí)候可以跳起。
射擊遊戲中(zhōng)可(kě)以通過(guò)定長射線去判斷目標(biāo)物(wù)體是否被擊中等
主要用到的工具類有:
- Physics
- RaycastHit 光線投射(shè)碰撞
- Ray 射線
第1種方法:Physics.Linecast 線性投(tóu)射
從開始位置到結束位置做一個光線投射,如果與碰撞體交互,返回真。
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("碰撞結束");
}
第二種方法:在場景中投下可與所有碰撞器碰撞的一條光線。可控製投射(shè)方向和投(tóu)射長度。Vector3 fwd = transform.TransformDirection(-Vector3.up);
bool grounded = Physics.Raycast(transform.position,fwd, 10 );
if (grounded)
{
Debug.LogError("發生了碰撞");
}
else
{
Debug.LogError("碰撞結束");
}
第三種方法:在場景中投下可(kě)與所有碰撞器(qì)碰撞的一條光線,並返回碰撞的細節信息。
RaycastHit hit;
bool grounded = Physics.Raycast(transform.position, -Vector3.up, out hit);
// 可(kě)控製投射距離bool grounded = Physics.Raycast(transform.position, -Vector3.up, out hit,100.0);
if (grounded)
{
Debug.LogError("發生(shēng)了碰撞");
Debug.LogError("距離是:" + hit.distance);
Debug.LogError("被碰撞的物體是:" + hit.collider.gameObject.name);
}
else {
Debug.LogError("碰撞結束");
}
注意:這裏(lǐ)返回的碰撞器的信息是依次的,先(xiān)返回第一個碰撞的,第一個碰撞結束後才返回(huí)第二個。
第四種方法:Physics.RaycastAll 所有光線投射。
投射一條光線並返回所(suǒ)有碰撞,也就是投射光(guāng)線(xiàn)並返回一個RaycastHit[]結構(gòu)體。
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++;
}
第五種方法(fǎ):控製碰撞的層,可以設(shè)置射線的(de)長度,並且用debug查看射線的長度。
使用層的時(shí)候,要注意,要給別(bié)的對象也附上層的名字,不能用缺省,會(huì)出問題(tí)。
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("碰撞結束");
}
第(dì)五種(zhǒng):Physics.OverlapSphere 相(xiàng)交球。返(fǎn)回球型半(bàn)徑之內(包括半徑)的(de)所(suǒ)有碰撞體 collider[]。可用於拾取物品用。此方(fāng)法在VR交互時為了提高用(yòng)戶體驗,使用較多。
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;
}
}
- 上(shàng)一篇:Unity3D跨屏幕、全屏顯示方法 2019/12/14
- 下一篇:WISEGLOVE數據手套的部分(fèn)高校客戶 2019/11/29
