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

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

[Unity小技巧] 使用射线Raycast判断某个方向是否有碰撞体_第1张图片


思路(以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不需要设置):

[Unity小技巧] 使用射线Raycast判断某个方向是否有碰撞体_第2张图片   [Unity小技巧] 使用射线Raycast判断某个方向是否有碰撞体_第3张图片

运行后:


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



关于layerMask的问题:

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

[Unity小技巧] 使用射线Raycast判断某个方向是否有碰撞体_第4张图片    


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

[Unity小技巧] 使用射线Raycast判断某个方向是否有碰撞体_第5张图片    

        第2个问题的原因是:由于射线的原点在CubeUp 内部,所以投射的射线会先投射到CubeUp 的碰撞体。因此我们才不能设置CubeUp 的Layer为Collider。



你可能感兴趣的:(unity,射线,Raycast,碰撞体,unity(c#)游戏开发)