Unity入门计划Collision2D类&Collider2D类

Posted 九九345

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Unity入门计划Collision2D类&Collider2D类相关的知识,希望对你有一定的参考价值。

目录

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这两个类?因为目前在跟教程学习的过程中用到了OnTriggerEnter2DOnCollisionEnter2D,即使格式有点相似但内容有些许不同,因此这篇博客简单地总结总结二者都有哪些变量、用法上的区别等等内容。

1 Collision2D 2D碰撞类

Collision2D是UnityEngine中的一个类,通过三个回调函数返回两个刚体碰撞的详细信息。

1.1 变量

类变量有:

collider 碰撞体 

当前与otherCollider发生碰撞中涉及的传入的Collider2D,附加到Collision2D.rigidbody2D上。

contactCount 接触点数

获取碰撞的接触点数,一个碰撞可能有多个接触点,当用GetContactGetContacts检索碰撞时可以使用它。

contacts 接触点(避免使用)

避免使用(会产生内存垃圾),用上面提到的GetContact或GetContacts替代。

enabled 是否启用碰撞响应

是个bool变量,提示启用或者禁用该碰撞响应或反应。

游戏中希望实现的某些操作可能会禁用碰撞,禁用后:仍可获取碰撞回调,但不会发生响应或反应。例如,相互穿过但没有任何明显反应的两个框形

gameObject 碰撞的游戏对象

碰撞中涉及的传入 GameObject。

在进行碰撞检测时,获取当前碰撞发生的游戏对象的某种组件,需要通过访问变量.gameObject再访问组件,例如当前发生碰撞类为other:

other.gameObject.GetComponent<RubyController>();

otherCollider 其他碰撞体

与collider的碰撞中涉及的传入的otherCollider2D,该碰撞体附加到Collision2D.otherRigidbody2D上。

otherRigidbody 其他刚体

rigidbody 刚体

relativeVelocity 相对线性速度(只读参)

表示两个碰撞对象的相对线性速度,由于是在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<AudioSource>();
    

    void OnCollisionEnter2D(Collision2D collision)
    
        //.magnitude是C#中用以计算vector2类型变量长度的一个方法
        if (collision.relativeVelocity.magnitude > 2)
            audioSource.Play();
    

transform

碰撞涉及到的传入对象的Transform。

1.2 函数

GetContact

Collision2D-GetContact - Unity 脚本 API

GetContacts

2  Collider2D 2D碰撞体类

Collider2D也是UnityEngine中的一个类,其实就是我们给玩家挂碰撞体组件时,选的那几种碰撞体类别,关于2D碰撞体我也写了一篇博客做了简单介绍:

【Unity入门计划】基本概念(3)-2D碰撞体Collider 2D_flashinggg的博客-CSDN博客_unity2d碰撞体

 相比于Collision2D,Collider2D有更多的变量和公共函数,直接查看官方文档。

3 对比碰撞检测&触发检测脚本的使用

我们了解到,Collider2D由OnCollisionEnter2D、OnCollisionStay2D和OnCollisionExit2D三个回调函数组成,可以通过这三个回调函数来实现两个刚体碰撞后的游戏逻辑。

这里就可以对比一下之前出现的OnTriggerEnter2D和上述代码中的OnCollisionEnter2D在用法上有什么不同,下面是在学习教程的吃血包涉及到触发器的代码——触发检测:

private void OnTriggerEnter2D(Collider2D other)
    
        //获取Ruby对象的脚本组件,还是用GetComponent方法
        RubyController rubyController=other.GetComponent<RubyController>();
        if(rubyController != null)
        
            ...

下面这是敌人移动时碰撞减血的代码——碰撞检测——

    //碰撞检测
    //添加敌人伤害的逻辑
    private void OnCollisionEnter2D(Collision2D other)
    
        //获取和当前collision碰撞的对象的脚本组件
        RubyController player = other.gameObject.GetComponent<RubyController>();
        if (player != null)
        
            player.ChangeHealth(Hurt);
        
    

可以发现,在获取对象脚本组件时,OnTriggerEnter2D(Collider2D other)是

other.GetComponent<RubyController>();

 而OnCollisionEnter2D(Collision2D other)是

other.gameObject.GetComponent<RubyController>();

一个不同,是类不同:

Trigger ---- Collider,是指碰撞体

Collision ---- Collision,指碰撞本身

类的不同,那么类的变量也不同,也就决定了获取当前对象组件的方式不同。再结合上面对Collision2D和Collider2D的简单说明,可以发现:

  • Collision2D想要获取碰撞对象的一些组件信息,需要通过访问变量gameObject,再通过GameObject类的GetComponent函数来获取;
  • Collider2D本身就有GetComponent函数,因此可以直接访问。

以上是关于Unity入门计划Collision2D类&Collider2D类的主要内容,如果未能解决你的问题,请参考以下文章

Unity入门计划利用Cinemachine实现简单的相机跟随&设置相机边界

Unity 入门笔记 - 05 - 动画事件&类&音效&对话框

Unity 入门笔记 - 07(完) - 菜单&手机端&静态类&生成游戏

Unity入门计划基本概念-预制件 Prefab

Unity入门计划Unity2D动画-脚本与混合树实现玩家角色动画过渡

Unity入门计划基本概念-瓦片地图 TileMap 01