几个类型碰撞器:
1. 静态碰撞器: 就是只有碰撞器,但没有刚体的
2.刚体碰撞器: 带Rigidbody的碰撞器,这个是最基本的碰撞器
3.运动学刚体碰撞器: 带Rigidbody, 而且Rigidbody的Is Kinematic打勾的,注意这个碰撞器是不能加力的,只能修改他的transform才能移动
Triggers 触发器
仅需要选中Inspector中的IsTrigger属性选择框。触发器不受物理引擎控制,当和一个触发器发生碰撞时会发出三个独特的触发信息,为了使两个触发器碰撞时发出碰撞事件,其中一个必须包含刚体.
今天遇到的一个情况是:如果刚体碰撞器不动,静态碰撞器去碰撞,则不会触发任何信息,而如果静态碰撞器不动,刚体碰撞器(包括运动学刚体碰撞器)去碰撞静态碰撞器,则会触发碰撞,如果是触发器,则会触发事件。所以下面的表格提供了触发的条件,但主动性大家也还需要注意,不然要纠结一段时间的。
Collision detection occurs and messages are sent upon collision | ||||||
| Static Collider 静态碰撞器 | Rigidbody Collider 刚体碰撞器 | Kinematic Rigidbody Collider 运动学刚体碰撞器 | Static Trigger Collider 静态触发碰撞器 | Rigidbody Trigger Collider 刚体触发碰撞器 | Kinematic Rigidbody Trigger Collider 运动学刚体触发碰撞器 |
Static Collider 静态碰撞器 | | Y | | | | |
Rigidbody Collider 刚体碰撞器 | Y | Y | Y | | | |
Kinematic Rigidbody Collider 运动学刚体碰撞器 | | Y | | | | |
Static Trigger Collider 静态触发碰撞器 | | | | | | |
Rigidbody Trigger Collider 刚体触发碰撞器 | | | | | | |
Kinematic Rigidbody Trigger Collider 运动学刚体触发碰撞器 | | | | | | |
Trigger messages are sent upon collision | ||||||
| Static Collider 静态碰撞器 | Rigidbody Collider 刚体碰撞器 | Kinematic Rigidbody Collider 运动学刚体碰撞器 | Static Trigger Collider 静态触发碰撞器 | Rigidbody Trigger Collider 刚体触发碰撞器 | Kinematic Rigidbody Trigger Collider 运动学刚体触发碰撞器 |
Static Collider 静态碰撞器 | | | | | Y | Y |
Rigidbody Collider 刚体碰撞器 | | | | Y | Y | Y |
Kinematic Rigidbody Collider 运动学刚体碰撞器 | | | | Y | Y | Y |
Static Trigger Collider 静态触发碰撞器 | | Y | Y | | Y | Y |
Rigidbody Trigger Collider 刚体触发碰撞器 | Y | Y | Y | Y | Y | Y |
Kinematic Rigidbody Trigger Collider 运动学刚体触发碰撞器 | Y | Y | Y | Y | Y | Y |
上面这个老外用的是 OnControllerColliderHit(),这个是用于角色碰撞的,物体如果附加了Charactor Controller(Unity自带的用于角色控制的脚本)则使用这个函数检测碰撞,这是不需要加刚体的。一般的刚体之间碰撞使用OnCollisionEnter(),范围触发用OnTriggerEnter(),如果你是让两个CUBE碰撞,请确保其中一个附加了RigidBody,然后这样写(我用C#):
void OnCollisionEnter(Collision collision)
{
Debug.Log("You touch me");
}
collision是个变量,通过它可以获得你所碰撞的目标的属性以及碰撞点信息和相对速度,如:
collision.collider.某个组件或脚本。
void OnCollisionEnter(Collision collision)
{
if(collision.collider.tag=="enemy")//tag是物体的标签,相当于物体的类别名称。在每一个物体的组件栏(也就是加脚本的那个区域)的最上面可以找到,默认的是UnTagged,也就是没有标签,你找找,然后点击会出现一个下拉列表,默认的已有几个Tag,你也可以加自定义的,点击下拉列表最下方的Add Tag就可以加Tag,最后选择一个Tag作为物体的名称就可以了。
{
Destroy(collision.collider.gameObject);//如果检测到对方是敌人,则消灭对方。
}
}