当前位置:网站首页>【Unity入门计划】Collision2D类&Collider2D类
【Unity入门计划】Collision2D类&Collider2D类
2022-08-10 07:59:00 【flashinggg】
目录
官方文档
Unity - Scripting API: Collision2D (unity3d.com)
Unity - Scripting API: Collider2D (unity3d.com)
为什么会想总结一下Collision2D和Collider2D这两个类?因为目前在跟教程学习的过程中用到了OnTriggerEnter2D和OnCollisionEnter2D,即使格式有点相似但内容有些许不同,因此这篇博客简单地总结总结二者都有哪些变量、用法上的区别等等内容。
1 Collision2D 2D碰撞类
Collision2D是UnityEngine中的一个类,通过三个回调函数返回两个刚体碰撞的详细信息。
1.1 变量
类变量有:
collider 碰撞体
当前与otherCollider发生碰撞中涉及的传入的Collider2D,附加到Collision2D.rigidbody2D上。
contactCount 接触点数
获取碰撞的接触点数,一个碰撞可能有多个接触点,当用GetContact或GetContacts检索碰撞时可以使用它。
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.nromalilzed——返回一个向量大小为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函数,因此可以直接访问。
边栏推荐
- 浅谈C语言实现冒泡排序
- 复杂AB实验
- CV-人脸识别-2018:ArcFace
- 预测股票涨跌看什么指标,如何预测明天股票走势
- Complex AB experiment
- CV+Deep Learning - network architecture Pytorch recurrence series - classification (3: MobileNet, ShuffleNet)
- 时序动作定位 | ACGNet:弱监督时序动作定位的动作补充图网络(AAAI 2022)
- 二叉树 --- 堆
- Big guy, when Oracle single-table incremental synchronization, the source database server takes up nearly 2g of memory. This is not normal, right?
- js函数聚合的三种实现方式
猜你喜欢
随机推荐
概率分布及其应用
添加spark的相关依赖和打包插件(第六弹)
神经网络样本太少怎么办,神经网络训练样本太少
如何远程调试对方的H5页面
2022-08-01 网工进阶(二十四) STP进阶知识
34. Talk about why you want to split the database?What methods are there?
mysql数据库月增长量问题
js函数聚合的三种实现方式
nrm 使用详解
关于数据中心的设计方案,数据中心网络规划设计
ATH10传感器读取温湿度
如何治理资源浪费?百度云原生成本优化最佳实践
Is the write performance of raid5 faster than raid10?
自动化测试框架Pytest(二)——前后置处理
WooCommerce installation and rest api usage
PLSQL学习第四天
delta method 介绍
浏览器适配杂记
941 · 滑动拼图
SCS【2】单细胞转录组 之 cellranger