Unity射线检测使用

方法一:Physics.Raycast 光线投射

1.staticfunction Raycast (origin : Vector3direction : Vector3distance : float= Mathf.InfinitylayerMask : int = kDefaultRaycastLayers) : bool

一个静态的发射射线的方法,在场景中投下可与所有碰撞器碰撞的一条光线。

参数解释:

origin:射线起始点

direction:射线方向

   distance:射线长度

   layerMask:只选定Layermask层内的碰撞器,其它层内碰撞器忽略。

返回布尔类型,当光线投射与任何碰撞器交叉时为真,否则为假。

(注意:如果从一个球型体的内部到外部用光线投射,返回为假。)这一点测试不成功!

2.staticfunction Raycast (origin : Vector3direction : Vector3out hitInfo : RaycastHitdistance :float = Mathf.InfinitylayerMask : int = kDefaultRaycastLayers) : bool

在场景中投下可与所有碰撞器碰撞的一条光线,并返回碰撞的细节信息。

Parameters参数

·        origin

The starting pointof the ray in world coordinates.
在世界坐标,射线的起始点。

·        direction

The direction ofthe ray.
射线的方向。

·        distance

The length ofthe ray
射线的长度。

·        hitInfo

If true isreturned, hitInfo will contain more information about where the collider washit (See Also: RaycastHit).
如果返回truehitInfo将包含碰到器碰撞的更多信息。

·        layerMask

A Layer maskthat is used to selectively ignore colliders when casting a ray. 
只选定Layermask层内的碰撞器,其它层内碰撞器忽略。

Returns

当光线投射与任何碰撞器交叉时为真,否则为假。

使用c#中out关键字传入一个空的碰撞信息类,然后碰撞后赋值。可以得到碰撞物体的transform,rigidbody,point等信息。

 

详细解释一下: 

LayerMask 层蒙版

 

如图所示,每一个物体都有一个TagLayer标签,tag就是一个简单的标签,可以用来区分不同的物体,LayerMask的作用是可以选择性地过滤物体,例如当投射射线时,比如camera.cullingmask和光线投射时候。

 

如图,可以在TagManager中编辑tag和Layer

 

然后设置物体的Layer层级,在摄像机中设置camera.cullingmask,可以控制摄像机的渲染层级,用在射线上,可以控制射线碰撞什么,不碰撞什么。

 

//Raycast hit

RaycastHit hit;

LayerMask mask= 1 << 8;

void testRay(){

if(Physics.Raycast(transform.position,Vector3.right,out

 hit,100, mask.value)){

Debug.DrawLine(transform.position,hit.point,Color.red,1);

}

 

}

 

上面的例子是从当前脚本所绑定的物体做标点向右发射长度100的射线,射线碰撞层级为8,其他层级忽略。

为了测试,我们在碰撞到物体后画一条红色线条,表示射线,停留一秒钟。

上面这些是射线的一些基本操作。

 

 

方法二:Physics.RaycastAll 光线投射

staticfunction RaycastAll (ray : Raydistance : float = Mathf.Infinity, layerMask : int = kDefaultRaycastLayers) : RaycastHit[]
static function RaycastAll (origin : 
Vector3, direction : Vector3, distance : float = Mathf.Infinity, layermask :int = kDefaultRaycastLayers) : RaycastHit[]

 

投射一条光线并返回所有碰撞,也就是投射光线并返回一个RaycastHit[]结构体。

 

 

 

有一部分人说没效果,我想可能是layer值没有设置正确,layer的值应该是等于2的n次方,这个n是layer面板上的值,只要设置正确,应该是没有问题的

 

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值