中文字幕无码a片久久,亚洲日韩在线观看浪潮,人人超人人超碰超国产二区,国产人妻久久一区二区,国产人妻久久一区二区

福感科技有限公司 歡迎您!
聯(lián)系方式

    地址:北京市平谷區(qū)馬坊鎮(zhèn)金河北街17號(hào)院3號(hào)樓7層712

    電話:010-89968230

    網(wǎng)站:http://0743119.com

使用Unity3D的射線碰撞檢測(cè)方法總結(jié)

2020-11-23 19:07:33??????點(diǎn)擊:

射線檢測(cè)故名就是通過射線去檢測(cè)是否和碰撞器產(chǎn)生了交集,和碰撞器與碰撞器發(fā)生交集一樣,如果檢測(cè)到了會(huì)返回一個(gè)真。
射線的用法很多:比如檢測(cè)是否跳躍,通過向地面投射射線控制在地面時(shí)候可以跳起。
        射擊游戲中可以通過定長(zhǎng)射線去判斷目標(biāo)物體是否被擊中等

主要用到的工具類有:

  • Physics
  • RaycastHit 光線投射碰撞
  • Ray 射線


第1種方法:Physics.Linecast 線性投射
從開始位置到結(jié)束位置做一個(gè)光線投射,如果與碰撞體交互,返回真。

 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("發(fā)生了碰撞");   
 }
 else {
     Debug.LogError("碰撞結(jié)束");
 }
第二種方法在場(chǎng)景中投下可與所有碰撞器碰撞的一條光線。可控制投射方向和投射長(zhǎng)度。
Vector3 fwd = transform.TransformDirection(-Vector3.up);
bool grounded =  Physics.Raycast(transform.position,fwd, 10 );
if (grounded)
 {
   Debug.LogError("發(fā)生了碰撞");   
 }
else 
{
    Debug.LogError("碰撞結(jié)束");
 }
第三種方法:在場(chǎng)景中投下可與所有碰撞器碰撞的一條光線,并返回碰撞的細(xì)節(jié)信息。



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("發(fā)生了碰撞");
Debug.LogError("距離是:" + hit.distance);
Debug.LogError("被碰撞的物體是:" + hit.collider.gameObject.name);
}
else {
Debug.LogError("碰撞結(jié)束");
}
注意:這里返回的碰撞器的信息是依次的,先返回第一個(gè)碰撞的,第一個(gè)碰撞結(jié)束后才返回第二個(gè)。


第四種方法:Physics.RaycastAll 所有光線投射。

投射一條光線并返回所有碰撞,也就是投射光線并返回一個(gè)RaycastHit[]結(jié)構(gòu)體。


RaycastHit[] hits;
hits = Physics.RaycastAll(transform.position, -Vector3.up, 100.0F);
int i = 0;
while (i < hits.Length)
{
Debug.LogError("發(fā)生了碰撞");
RaycastHit hit = hits[i];
Debug.LogError("被碰撞的物體是:" + hit.collider.gameObject.name);
i++;
}


第五種方法:控制碰撞的層,可以設(shè)置射線的長(zhǎng)度,并且用debug查看射線的長(zhǎng)度。

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


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("發(fā)生了碰撞");
Debug.LogError("距離是:" + hit.distance);
Debug.LogError("被碰撞的物體是:" + hit.collider.gameObject.name);

}
else {
Debug.LogError("碰撞結(jié)束");
}
第五種:Physics.OverlapSphere 相交球。
返回球型半徑之內(nèi)(包括半徑)的所有碰撞體 collider[]??捎糜谑叭∥锲酚?。此方法在VR交互時(shí)為了提高用戶體驗(yàn),使用較多。
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;
}
}

Copyright 2019 0743119.com

福感科技有限公司 版權(quán)所有 All Rights Reserved

京ICP備20002031號(hào)

010-89968230