碰撞检测与触发检测

【Unity入门】碰撞检测与触发检测

z转载自:http://www.cnblogs.com/zengbinsi/p/zengbinsi_unity3d_004.html?utm_source=tuicool&utm_medium=referral#undefined

 

  在Unity里面,游戏物体的碰撞我们可以通过刚体组件(Rigidbody)和碰撞器组件(Collider)来进行检测。首先在场景里面添加一个Plane面板作为地面,然后在Plane面板的上方一定高度处放一个Cube立方体。 

  然后给Cube立方体添加一个刚体组件(Rigidbody)。运行游戏,这时候我们可以看到立方体掉在了面板上面。 

  立方体和面板产生了碰撞,并且静止在面板上,这时候我们可以可以通过脚本来进行检测,比如立方体掉在面板上的时候我们可以将其销毁。给立方体添加一个检测碰撞的脚本组件CubeCollision,语言使用C#。代码如下:

复制代码
 1 /**
 2  *  Copyright (c) Clarence Zeng Binsi
 3  * 
 4  *      Author:     ZengBinsi
 5  *      Date:       2016/01/25 16:10:28
 6  *      Desc:       Collision test
 7  */
 8 
 9 
10 
11 
12 using UnityEngine;
13 using System.Collections;
14 
15 public class CubeCollision : MonoBehaviour {
16 
17 
18     // Use this for initialization
19     void Start () {
20 
21     }
22 
23     // Update is called once per frame
24     void Update () {
25 
26     }
27 
28 
29 
30 
31     // 碰撞开始
32     void OnCollisionEnter(Collision collision) {
33         // 销毁当前游戏物体
34         Destroy(this.gameObject);
35     }
36 
37     // 碰撞结束
38     void OnCollisionExit(Collision collision) {
39 
40     }
41 
42     // 碰撞持续中
43     void OnCollisionStay(Collision collision) {
44 
45     }
46 
47 }
复制代码

  在MonoBehaviour类中,OnCollisionEnter、OnCollisionExit和OnCollisionStay是碰撞时的回调方法,我们可以在CubeCollision类中重载它们。当绑定了CubeCollision脚本组件的游戏物体发生碰撞时,OnCollisionEnter便会被触发调用一次。然后,在整个碰撞过程中会持续调用OnCollisionStay方法,直到碰撞接触被解除时,OnCollisionExit被触发一次。这是一个完整的碰撞接触过程,这三个方法都有一个Collision类型的参数,用于保存碰撞信息。 

  如果我们想要在当前脚本中去操作被立方体碰撞到的对象(面板),那么我们可以通过这三个方法的参数collision来获得被碰撞的游戏物体的碰撞器组件对象(collider)。然后通过collider对象可以得到碰撞器组件挂载的游戏物体的信息。

复制代码
1     // 碰撞开始
2     void OnCollisionEnter(Collision collision) {
3         var name = collision.collider.name;
4 
5         Debug.Log("Name is " + name);
6     }
复制代码

  这样子就可以得到被碰撞的游戏物体的名称。 

  如果我们有很多游戏物体,名称各不相同,如果要检测某一类型的,我们可以通过给游戏对象设置Tag值来进行区分。我们给面板对象设置一个Tag值: 

  然后修改代码为获取Tag值:

复制代码
1     // 碰撞开始
2     void OnCollisionEnter(Collision collision) {
3         var tag = collision.collider.tag;
4 
5         Debug.Log("Tag is " + tag);
6     }
复制代码

  重新运行游戏: 

  除了碰撞之外,Unity还支持接触检测。因为使用碰撞检测,发生碰撞的游戏物体之间会有碰撞模拟,比如撞到东西会反弹或者停顿一下之类的。有时候我们只是想要检测物体与物体之间是否发生接触,但是不要产生碰撞的效果,这时候我们可以使用触发器来进行接触检测。 

  首先,我们把立方体Cube的碰撞器设置为触发类型:

  像这样,我们在Cube的检查视图中找到碰撞器组件,将该组件的IsTrigger属性勾选上,这样在游戏物体发生接触的时候就不会有碰撞的效果了,而是会直接穿过去。Unity的碰撞器有很多类型,Cube的碰撞器类型是盒子碰撞器(BoxCollider),另外还有球形碰撞器、胶囊体碰撞器等。

  然后,我们在CubeCollision脚本组件里面重载以下三个方法:

复制代码
 1     // 开始接触
 2     void OnTriggerEnter(Collider collider) {
 3         Debug.Log("开始接触");
 4     }
 5 
 6     // 接触结束
 7     void OnTriggerExit(Collider collider) {
 8         Debug.Log("接触结束");
 9     }
10 
11     // 接触持续中
12     void OnTriggerStay(Collider collider) {
13         Debug.Log("接触持续中");
14     }
复制代码

  MonoBehaviour类的OnTriggerEnter、OnTriggerExit和OnTriggerStay是触发检测的三个回调方法,OnTriggerEnter在游戏物体发生接触时调用一次,OnTriggerExit在游戏物体完全分离时调用一次,而OnTriggerStay在游戏物体接触过程中持续调用。 

  【值得注意的是,触发器回调的这三个方法的参数都是Collider类型,表示的就是被碰撞的游戏物体的触发器组件对象。】

  重新运行游戏,我们可以在控制台看到调试信息: 

  这时候Cube会直接从Plane中穿下去,不会停在面板上。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值