[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)则打印:
可以看到这里需要把下方物体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。
思路(以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。
相关文章推荐
- unity使用手势时,通过射线判断是否触碰到了某物体
- Unity 使用物理射线(Physics.Raycast),实现扇形区域碰撞检测三种方法
- Unity 使用物理射线(Physics.Raycast),实现扇形区域碰撞检测三种方法
- Unity5.3.4 设置Raycast投射的射线不碰撞触发器Trigger
- 【Unity】使用射线碰撞限制人物主角多次跳跃
- 使用射线法判断echarts上地图中的点是否在地图范围中
- Unity3d 射线测试+使用手势判断是否触碰了某物体
- [Unity]Ray射线物理检测碰撞和LayerMask的使用
- 判断一个指针是否为空,abort()、assert、抛出异常的使用、ASSERT与VERIFY宏的区别
- 在SQLServer 2000中,使用SQL语句判断某一字段是否为空
- 几个C#编程的小技巧 (二) (判断文件或文件夹是否存在 )
- 使用JS判断checkbox是否至少有选择一项
- 使用javascript+正则表达式判断输入日期是否为yyyy-mm-dd
- C#判断IP地址是否合法函数-使用正则表达式-2个
- 使用正则表达式判断字符串是否还有字母
- C#判断IP地址是否合法函数-使用正则表达式-2个
- 一个判断session是否过期的小技巧
- 判断IP地址是否合法的sql2000使用存储过程跟函数
- 判断用户使用的浏览器是否对系统合适的脚本代码
- 判断IP地址是否合法的sql2000使用存储过程跟函数