• 【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();

    otherCollider 其他碰撞体

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

    otherRigidbody 其他刚体

    rigidbody 刚体

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

    表示两个碰撞对象的相对线性速度,由于是在2D上的,因此这个参数是个vector2类型的参数。是个只读参数。拓展一点,可以使用:

    vector2.magnitude——返回一个浮点数,表示当前相对速度大小(保留大小丢失方向信息)

    vector2.Normalize()——将一个向量归一化操作,变成大小为1仅表示方向的单位向量

    例如,官方文档给出了一下实例:

    1. // Play a sound when we hit an object with a big velocity
    2. using UnityEngine;
    3. using System.Collections;
    4. public class ExampleClass : MonoBehaviour
    5. {
    6. AudioSource audioSource;
    7. void Start()
    8. {
    9. audioSource = GetComponent();
    10. }
    11. void OnCollisionEnter2D(Collision2D collision)
    12. {
    13. //.magnitude是C#中用以计算vector2类型变量长度的一个方法
    14. if (collision.relativeVelocity.magnitude > 2)
    15. audioSource.Play();
    16. }
    17. }

    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在用法上有什么不同,下面是在学习教程的吃血包涉及到触发器的代码——触发检测:

    1. private void OnTriggerEnter2D(Collider2D other)
    2. {
    3. //获取Ruby对象的脚本组件,还是用GetComponent方法
    4. RubyController rubyController=other.GetComponent();
    5. if(rubyController != null)
    6. {
    7. ...

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

    1. //碰撞检测
    2. //添加敌人伤害的逻辑
    3. private void OnCollisionEnter2D(Collision2D other)
    4. {
    5. //获取和当前collision碰撞的对象的脚本组件
    6. RubyController player = other.gameObject.GetComponent();
    7. if (player != null)
    8. {
    9. player.ChangeHealth(Hurt);
    10. }
    11. }

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

    other.GetComponent();

     而OnCollisionEnter2D(Collision2D other)是

    other.gameObject.GetComponent();

    一个不同,是类不同:

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

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

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

    • Collision2D想要获取碰撞对象的一些组件信息,需要通过访问变量gameObject,再通过GameObject类的GetComponent函数来获取;
    • Collider2D本身就有GetComponent函数,因此可以直接访问。
  • 相关阅读:
    SPEL表达式注入分析
    Nuxtjs实现服务端渲染和静态化站点
    【Linux】linux的shell脚本
    R语言根据分隔符分割字符串:使用strsplit函数基于指定分隔符将字符串进行分割(返回的结果为列表)
    node的http模块
    好玩的调度技术
    CNN复现系列一:基于zcu102的yolov2(part4:sdk部分)
    分享几个通用个人简历模板|行业通用
    手写java冒泡、插入、选择、快速、归并排序算法
    动态规划解决leetcode上的两道回文问题(针对思路)
  • 原文地址:https://blog.csdn.net/qq_41835314/article/details/126245620