【Unity3D】碰撞体组件Collider

1 前言

        Unity3D 中碰撞体(Collider)组件用于检测运动的物体之间是否发生碰撞,也可以作为触发器使用。产生碰撞的条件是:

  • 2 个游戏对象都有 Collider
  • 至少有一个游戏对象有 Rigidbody
  • 2 个游戏对象保持相对运动(一个 Cube 放在 Plane 上,不会产生碰撞,因为没有相对运动)

        碰撞体的边界不一定与游戏对象的边界一致,用户可以点击 Edit Collider 按钮编辑碰撞体的边界,也可以在属性面板里调整碰撞体边界。另外,用户可以勾选 Is Trigger 选项,作为触发器使用(不勾选将作为碰撞器使用),作为触发器使用时,不会产生碰撞,游戏对象之间会相会穿越。

        1)回调方法 

        碰撞器回调方法:

// 碰撞开始
void OnCollisionEnter(Collision other)
// 碰撞过程中,每帧调用一次
void OnCollisionStay(Collision other)
// 碰撞结束
void OnCollisionExit(Collision other)

        触发器回调方法:

// 触发开始
void OnTriggerEnter(Collider other)
// 触发过程中,每帧调用一次
void void OnTriggerStay(Collider other)
// 触发结束
void OnTriggerExit(Collider other)

         说明:碰撞器和触发器对应的回调方法都是 MonoBehaviour 里的方法,用户可以在脚本组件里重写这些方法,碰撞器和触发器对应的回调方方法只能执行其一,当作为触发器使用时,就不能执行碰撞器对应的回调方法。

        2)回调参数

         碰撞器回调方法的 Collision 参数

// 碰撞对象的碰撞体组件
Collider collider = collision.collider;
// 碰撞点信息
ContactPoint[] contactPoint = collision.contacts;
Vector3 point = contactPoint[0].point;
// 碰撞点处当前物体的碰撞体组件(当前物体有多层子对象时, 可以获取具体碰撞的子对象)
Collider thisCollider = contactPoint[0].thisCollider;
// 碰撞点处对方物体的碰撞体组件
Collider otherCollider = contactPoint[0].otherCollider;

        触发器回调方法的 Collider 参数

// 获取碰撞体的MeshRenderer组件
MeshRenderer meshRenderer = collider.GetComponent<MeshRenderer>();

2 应用

2.1 碰撞器应用

        1)创建游戏对象

        游戏对象的 Transform 组件参数如下:  

NameTypePositionRotationScaleColor
PlanePlane(0, 0, 0)(0, 0, 0)(1, 1, 1)#ABA4A4FF
CubeCube(0.1, 3, -4.4)(0, 0, 0)(1, 1, 1)#F41E1EFF
SphereSphere(0, 1, -4.5)(0, 0, 0)(1, 1, 1)#F41E1EFF

         补充:给 Cube 添加 Rigidbody 刚体组件。

         2)脚本组件

        给 Cube 游戏对象添加脚本组件,如下:

        ColliderController.cs

using UnityEngine;

public class ColliderController : MonoBehaviour {

	private void OnCollisionEnter(Collision other) {
		other.collider.GetComponent<MeshRenderer>().material.color = Color.green;
	}

	private void OnCollisionStay(Collision other) {
		GetComponent<MeshRenderer>().material.color = Color.yellow;
	}

	private void OnCollisionExit(Collision other) {
		other.collider.GetComponent<MeshRenderer>().material.color = Color.blue;
	}
}

        3)运行效果

2.2 触发器应用

        1)创建游戏对象

        游戏对象的 Transform 组件参数如下:  

NameTypePositionRotationScaleColor
PlanePlane(0, 0, 0)(0, 0, 0)(2, 2, 2)#ABA4A4FF
CubeCube(0, 3, -4.8)(0, 0, 0)(1.7, 0.5, 1.7)#F41E1EFF
SphereSphere(0, 4.5, -4.8)(0, 0, 0)(1, 1, 1)#F41E1EFF

         补充:给 Sphere 添加 Rigidbody 刚体组件,Collider 组件勾选 Is Trigger 选项。

         2)脚本组件

        给 Sphere 游戏对象添加脚本组件,如下:

        TriggerController.cs

using UnityEngine;

public class TriggerController : MonoBehaviour {

	private void OnTriggerEnter(Collider other) {
		other.GetComponent<MeshRenderer>().material.color = Color.green;
	}

	private void OnTriggerStay(Collider other) {
		GetComponent<MeshRenderer>().material.color = Color.yellow;
	}

	private void OnTriggerExit(Collider other) {
		other.GetComponent<MeshRenderer>().material.color = Color.blue;
	}
}

        3)运行效果

  • 18
    点赞
  • 67
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

little_fat_sheep

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值