目录
1 Collision2D 2D碰撞类
1.1 变量
collider 碰撞体
contactCount 接触点数
contacts 接触点(避免使用)
enabled 是否启用碰撞响应
gameObject 碰撞的游戏对象
otherCollider 其他碰撞体
otherRigidbody 其他刚体
rigidbody 刚体
relativeVelocity 相对线性速度(只读参)
transform
1.2 函数
GetContact
GetContacts
2 Collider2D 2D碰撞体类
3 对比碰撞检测&触发检测脚本的使用
官方文档
Unity - Scripting API: Collision2D (unity3d.com)
Unity - Scripting API: Collider2D (unity3d.com)
为什么会想总结一下Collision2D和Collider2D这两个类?因为目前在跟教程学习的过程中用到了OnTriggerEnter2D和OnCollisionEnter2D,即使格式有点相似但内容有些许不同,因此这篇博客简单地总结总结二者都有哪些变量、用法上的区别等等内容。
Collision2D是UnityEngine中的一个类,通过三个回调函数返回两个刚体碰撞的详细信息。
类变量有:
当前与otherCollider发生碰撞中涉及的传入的Collider2D,附加到Collision2D.rigidbody2D上。
获取碰撞的接触点数,一个碰撞可能有多个接触点,当用GetContact或GetContacts检索碰撞时可以使用它。
避免使用(会产生内存垃圾),用上面提到的GetContact或GetContacts替代。
是个bool变量,提示启用或者禁用该碰撞响应或反应。
游戏中希望实现的某些操作可能会禁用碰撞,禁用后:仍可获取碰撞回调,但不会发生响应或反应。例如,相互穿过但没有任何明显反应的两个框形。
碰撞中涉及的传入 GameObject。
在进行碰撞检测时,获取当前碰撞发生的游戏对象的某种组件,需要通过访问变量.gameObject再访问组件,例如当前发生碰撞类为other:
other.gameObject.GetComponent
();
与collider的碰撞中涉及的传入的otherCollider2D,该碰撞体附加到Collision2D.otherRigidbody2D上。
表示两个碰撞对象的相对线性速度,由于是在2D上的,因此这个参数是个vector2类型的参数。是个只读参数。拓展一点,可以使用:
vector2.magnitude——返回一个浮点数,表示当前相对速度大小(保留大小丢失方向信息)
vector2.Normalize()——将一个向量归一化操作,变成大小为1仅表示方向的单位向量
例如,官方文档给出了一下实例:
// Play a sound when we hit an object with a big velocity
using UnityEngine;
using System.Collections;
public class ExampleClass : MonoBehaviour
{
AudioSource audioSource;
void Start()
{
audioSource = GetComponent();
}
void OnCollisionEnter2D(Collision2D collision)
{
//.magnitude是C#中用以计算vector2类型变量长度的一个方法
if (collision.relativeVelocity.magnitude > 2)
audioSource.Play();
}
}
碰撞涉及到的传入对象的Transform。
Collision2D-GetContact - Unity 脚本 API
Collider2D也是UnityEngine中的一个类,其实就是我们给玩家挂碰撞体组件时,选的那几种碰撞体类别,关于2D碰撞体我也写了一篇博客做了简单介绍:
【Unity入门计划】基本概念(3)-2D碰撞体Collider 2D_flashinggg的博客-CSDN博客_unity2d碰撞体
相比于Collision2D,Collider2D有更多的变量和公共函数,直接查看官方文档。
我们了解到,Collider2D由OnCollisionEnter2D、OnCollisionStay2D和OnCollisionExit2D三个回调函数组成,可以通过这三个回调函数来实现两个刚体碰撞后的游戏逻辑。
这里就可以对比一下之前出现的OnTriggerEnter2D和上述代码中的OnCollisionEnter2D在用法上有什么不同,下面是在学习教程的吃血包涉及到触发器的代码——触发检测:
private void OnTriggerEnter2D(Collider2D other)
{
//获取Ruby对象的脚本组件,还是用GetComponent方法
RubyController rubyController=other.GetComponent();
if(rubyController != null)
{
...
下面这是敌人移动时碰撞减血的代码——碰撞检测——
//碰撞检测
//添加敌人伤害的逻辑
private void OnCollisionEnter2D(Collision2D other)
{
//获取和当前collision碰撞的对象的脚本组件
RubyController player = other.gameObject.GetComponent();
if (player != null)
{
player.ChangeHealth(Hurt);
}
}
可以发现,在获取对象脚本组件时,OnTriggerEnter2D(Collider2D other)是
other.GetComponent
();
而OnCollisionEnter2D(Collision2D other)是
other.gameObject.GetComponent
();
一个不同,是类不同:
Trigger ---- Collider,是指碰撞体
Collision ---- Collision,指碰撞本身
类的不同,那么类的变量也不同,也就决定了获取当前对象组件的方式不同。再结合上面对Collision2D和Collider2D的简单说明,可以发现: