方法一: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参数
-
originThe starting point of the ray in world coordinates.
在世界坐标,射线的起始点。 -
directionThe direction of the ray.
射线的方向。 -
distanceThe length of the ray
射线的长度。 -
hitInfoIf true is returned, hitInfo will contain more information about where the collider was hit (See Also: RaycastHit).
如果返回true,hitInfo将包含碰到器碰撞的更多信息。 -
layerMaskA Layer mask that is used to selectively ignore colliders when casting a ray.
只选定Layermask层内的碰撞器,其它层内碰撞器忽略。
当光线投射与任何碰撞器交叉时为真,否则为假。
使用c#中out关键字传入一个空的碰撞信息类,然后碰撞后赋值。可以得到碰撞物体的transform,rigidbody,point等信息。
然后设置物体的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 []
static function RaycastAll ( origin : Vector3 , direction : Vector3 , distance : float = Mathf.Infinity , layermask : int = kDefaultRaycastLayers) : RaycastHit []
投射一条光线并返回所有碰撞,也就是投射光线并返回一个RaycastHit[]结构体。
有一部分人说没效果,我想可能是layer值没有设置正确,layer的值应该是等于2的n次方,这个n是layer面板上的值,只要设置正确,应该是没有问题的