您的位置:首页 > 移动开发 > Unity3D

[Unity小技巧] 使用射线Raycast判断某个方向是否有碰撞体

2017-02-15 22:59 766 查看
我们做游戏开发的时候,可能会遇到类似这样的一个问题:一个物体加上了Rigidbody刚体受重力下降,在它下降的时候(还没与下方物体产生碰撞),我们需要提前知道它的下方是否有碰撞体(能接住它)。类似下面的:



思路(以2D为例):

我们可以使用射线Raycast实现判断。形象的说,就是从上方物体自身向下投射一条射线,该方法能返回射线投射到的碰撞体RaycastHit2D,我们则可以通过返回的碰撞体判断处于下方的物体。如果RaycastHit2D为空,则下方没有碰撞体。

方法如下:

Physics2D.Raycast(Vector2 origin, Vector2 direction, float distance, int layerMask);

参数解释:

1、origin:射线投射的原点

2、direction:射线投射的方向

3、distance:射线的长度

4、layerMask:射线只会投射到layerMask层的碰撞体(注意此int参数的写法:1 << 层数)

比如上面的gif图里,我想让上方的正方体CubeUp在刚下降的时候就检测下方是否有碰撞体,如果有(CubuDown)则打印:

public class NewBehaviourScript : MonoBehaviour {

void Start () {
if (Physics2D.Raycast(this.transform.position, Vector2.down, 10.0f,
1 << LayerMask.NameToLayer("Collider"))) {
string colliderName = Physics2D.Raycast(this.transform.position, Vector2.down, 10.0f,
1 << LayerMask.NameToLayer("Collider")).collider.gameObject.name;
Debug.Log("Collider " + colliderName + " is under the CubeUp");
}
else {
Debug.Log("No collider is under the CubeUp");
}
}

void Update () {

}
}


可以看到这里需要把下方物体CubuDown的Layer设置为Collider(上方物体CubeUp不需要设置):


   


运行后:



即可以检测到下方有碰撞体。

关于layerMask的问题:

1、如果CubuDown没有设置Layer为Collider:则射线不会投射到CubuDown上,显示“No collider is under the CubeUp”


 
  


2、如果CubeUp与CubuDown均设置Layer为Collider:则射线会投射到CubeUp自身,即返回的碰撞体为CubeUp自身,显示“Collider
CubeUp is under the CubeUp”


 
  


        第2个问题的原因是:由于射线的原点在CubeUp 内部,所以投射的射线会先投射到CubeUp 的碰撞体。因此我们才不能设置CubeUp 的Layer为Collider。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息