查看: 1075|回复: 2
打印 上一主题 下一主题

射线碰撞

[复制链接]
ku 智囊团   

89

主题

2

听众

5万

积分

首席设计师

Rank: 8Rank: 8

纳金币
25
精华
1

最佳新人 活跃会员 热心会员 灌水之王 突出贡献

跳转到指定楼层
楼主
发表于 2013-4-22 21:29:24 |只看该作者 |倒序浏览
pstatus"> 本帖最后由 艾西格亚 于 2013-4-23 17:09 编辑

射线碰撞         
                                                                                 
                                                                                                                                                               


方法一:Physics.Raycast 光线投射

1.static function Raycast (origin : Vector3, direction : Vector3, distance : float = Mathf.Infinity, layerMask : int = kDefaultRaycastLayers) : bool

一个静态的发射射线的方法,在场景中投下可与所有碰撞器碰撞的一条光线。
参数解释:
origin:射线起始点
direction:射线方向
distance:射线长度
layerMask:只选定Layermask层内的碰撞器,其它层内碰撞器忽略。
返回布尔类型,当光线投射与任何碰撞器交叉时为真,否则为假。
(注意:如果从一个球型体的内部到外部用光线投射,返回为假。 )这一点测试不成功!

2.static function Raycast (origin : Vector3, direction : Vector3, out hitInfo : RaycastHit, distance : float = Mathf.Infinity, layerMask : int = kDefaultRaycastLayers) : bool

在场景中投下可与所有碰撞器碰撞的一条光线,并返回碰撞的细节信息。
Parameters参数
origin
The starting point of the ray in world coordinates.
在世界坐标,射线的起始点。
direction
The direction of the ray.
射线的方向。
distance
The length of the ray
射线的长度。
hitInfo
If true is returned, hitInfo will contain more information about where the collider was hit (See Also: RaycastHit).
如果返回true,hitInfo将包含碰到器碰撞的更多信息。

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

Returns
当光线投射与任何碰撞器交叉时为真,否则为假。
使用c#中out关键字传入一个空的碰撞信息类,然后碰撞后赋值。可以得到碰撞物体的transform,rigidbody,point等信息。

详细解释一下: LayerMask 层蒙版
如图所示,每一个物体都有一个Tag和Layer标签,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 光线投射
static function RaycastAll (ray : Ray, distance : float = Mathf.Infinity, layerMask : int = kDefaultRaycastLayers) : RaycastHit[]
static function RaycastAll (origin : Vector3, direction : Vector3, distance : float = Mathf.Infinity, layermask : int = kDefaultRaycastLayers) : RaycastHit[]

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

分享到: QQ好友和群QQ好友和群 腾讯微博腾讯微博 腾讯朋友腾讯朋友 微信微信
转播转播0 分享淘帖0 收藏收藏0 支持支持0 反对反对0
回复

使用道具 举报

2722

主题

42

听众

3万

积分

资深设计师

Rank: 7Rank: 7Rank: 7

纳金币
38268
精华
111

最佳新人 活跃会员 热心会员 灌水之王 突出贡献

沙发
发表于 2013-4-23 04:02:37 |只看该作者
谢谢楼主的分享了,一直对raycast有些不解,现在清楚多了
回复

使用道具 举报

may    

8830

主题

81

听众

7万

积分

首席设计师

Rank: 8Rank: 8

纳金币
52336
精华
343

最佳新人 热心会员 灌水之王 活跃会员 突出贡献 荣誉管理 论坛元老

板凳
发表于 2013-4-23 16:44:42 |只看该作者
先支持再说,楼主的分享很不错
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

手机版|纳金网 ( 闽ICP备2021016425号-2/3

GMT+8, 2024-11-11 12:44 , Processed in 0.090399 second(s), 28 queries .

Powered by Discuz!-创意设计 X2.5

© 2008-2019 Narkii Inc.

回顶部