Unity3D总结:关于射线碰撞

转载 2014年06月16日 16:29:09

方法一:Physics.Raycast 光线投射

1.static function Raycast (origin : Vector3direction : Vector3distance : float = Mathf.InfinitylayerMask : int = kDefaultRaycastLayers) : bool
一个静态的发射射线的方法,在场景中投下可与所有碰撞器碰撞的一条光线。
参数解释:
origin:射线起始点
direction:射线方向
   distance:射线长度
   layerMask:只选定Layermask层内的碰撞器,其它层内碰撞器忽略。
返回布尔类型,当光线投射与任何碰撞器交叉时为真,否则为假。
(注意:如果从一个球型体的内部到外部用光线投射,返回为假。 )这一点测试不成功!
2.static function Raycast (origin : Vector3direction : Vector3out hitInfo : RaycastHitdistance : float = Mathf.InfinitylayerMask : 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 : Raydistance : float = Mathf.Infinity, layerMask : int = kDefaultRaycastLayers) : RaycastHit[]
static function RaycastAll (origin : Vector3, direction : Vector3, distance : float = Mathf.Infinity, layermask : int = kDefaultRaycastLayers) : RaycastHit[]

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

相关文章推荐

Unity3D总结:关于射线碰撞

方法一:Physics.Raycast 光线投射 1.static function Raycast (origin : Vector3, direction : Vector3, distance ...

[Unity3D]射线碰撞检测+LayerMask的使用

射线:射线是3D世界中一个点向一个方向发射的一条无终点的线,在发射轨迹中与其他物体发生碰撞时,它将停止发射 。用途:在unity中射线应用范围比较广, 多用于碰撞检测(如:子弹飞行是否击中目标)、角色...

Unity3D【碰撞与射线】

忽略碰撞      有些时候我们不想让指定的两对象发生碰撞,即要忽略他们的碰撞。     忽略碰撞情况下的限制: 1. 保存场景时忽略状态不能保存...

unity3d中固定视角射线碰撞以及使障碍物透明

因为之前有学习过DX9,处理方式为从摄像机处向玩家所在位置反射一条射线,如果射线撞上了其他物体,则改变该物体的alpha值,使之透明。unity3d作为一款引擎存在让这个问题变的无比的简单,因为几乎要...

Unity3D Ray射线

  • 2013年08月24日 22:00
  • 66KB
  • 下载

Unity 3D中的射线与碰撞检测

在我们的游戏开发过程中,有一个很重要的工作就是进行碰撞检测。例如在射击游戏中子弹是否击中敌人,在RPG游戏中是否捡到装备等等。在进行碰撞检测时,我们最常用的工具就是射线,Unity 3D的物理引擎也为...

Unity3d非物理引擎模拟碰撞效果

  • 2017年08月12日 14:47
  • 179KB
  • 下载

Unity3D笔记第十二天——鼠标事件、物理类、射线

鼠标事件 OnMouseDown:鼠标在GUIElement或Collider之上,按下鼠标,该事件即被触发 OnMouseDrag:鼠标在GUIElement或Collider之上,按下鼠标并保...

Htc Vive Sdk(OpenVR),Unity3d 开发,手柄射线

开发引擎:Unity3d 设备:Htc Vive Htc Vive Sdk(OpenVR),Unity3d 开发,Hello World Htc Vive Sdk(OpenVR),Unity3d 开...

Unity3D射线检测如何使用Layers和LayerMask

在Unity中用int32数据类型来表示32个Layer层,int32表示二进制一共有32位(0—31)。在Unity中每个GameObject都有Layer属性,默认的Layer都是Default。...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Unity3D总结:关于射线碰撞
举报原因:
原因补充:

(最多只允许输入30个字)