先抛出问题:
Rigidbody组件是什么?有什么用?
Collider组件是什么?有什么用?
怎么实现碰撞事件?
怎么实现触发事件?
怎么又实现触发事件又实现碰撞事件?
Rigidbody组件:
简要来说,它是一个专门用于物理模拟的组件,这个组件允许你使用重力以及其他因素对游戏对象施加影响。Rigidbody组件还会受施加力的影响,从而产生更真实的运动效果。其属性如下所示:
![](https://img-blog.csdnimg.cn/img_convert/f2adf7893b6fa28b416ce470da0eb1ce.png)
主要介绍一下Is Kinematic属性:
如果启用了该属性,则附加该Rigidbody组件的物体不会与物理系统产生交互,就相当于没有了物理模拟,也就没有了碰撞、重力等物理现象了。该行为仅在某些特定情况下用。
Collider组件:
所有碰撞体的基类。这种组件决定了游戏对象何时以及怎样进入、离开其它对象的物理空间,抑或简单地碰撞并弹开。对于给定的游戏对象来说,只能添加一个Rigidbody组件,但可以添加多个Collider组件。其Box的属性如下
![](https://img-blog.csdnimg.cn/img_convert/976375354de0c371a01bbaa0b0ad298e.png)
主要讲一下Is Trigger属性:
默认情况下,碰撞体的Is Trigger属性并未启用,物理系统会把碰撞体视为实体,当启用该属性时,游戏对象就会穿过该碰撞体。
怎么实现碰撞事件:
首先前提是碰撞双方必须有一方附加了Rigidbody组件,而且都必须附加至少一个Collider组件(未启用Is Trigger)。
然后就可以在脚本中接收到碰撞事件了,具体代码如下:
private void OnCollisionEnter(Collision collision)
{
Debug.Log("Collision effect!");
}
![](https://img-blog.csdnimg.cn/img_convert/d0f2820d72f58e43e1374ec75d3a7ee0.png)
碰撞的生效范围取决于你的设置。
怎么实现触发事件:
前提与碰撞事件一样,不同的是,必须有一方Collider的Is Trigger属性启用了。
然后就可以在启用Is Trigger属性的游戏对象上的脚本接收到该事件了,具体代码如下:
private void OnTriggerEnter(Collider other)//注意参数类型是Collider
{
Debug.Log("Trigger effect!");
}
![](https://img-blog.csdnimg.cn/img_convert/bda4b9bb433486b2b7c192e5c92e62c7.png)
实例:比如说靠近门的一定范围会自动打开、接近敌人会引发警报等
怎么又实现触发事件又实现碰撞事件
但是在开启了Is Trigger属性的游戏对象会被其他物体所穿过,即不在有碰撞的效果。
所以如果想要即有触发器的效果又有碰撞器的效果就需要在添加两个Collider组件,一个打开了Is Trigger,一个没有打开。
private void OnTriggerEnter(Collider other)
{
if(other.gameObject.name=="PlayerName")//条件是触发对象为玩家
{
Debug.Log("Player detected -attack!");
}
}
private void OnCollisionEnter(Collision collsion)
{
if (collision.gameObject.name == "PlayerName")//条件是碰撞对象为玩家
{
Debug.Log("Collision effect!");
}
}
![](https://img-blog.csdnimg.cn/img_convert/5b3260d9d0211393fc802d4e4599df06.png)
实例:比如说又想靠近敌人触发警报,又能够与敌人产生碰撞。