Unity入门计划基本概念-2D刚体Rigidbody 2D
Posted 九九345
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Unity入门计划基本概念-2D刚体Rigidbody 2D相关的知识,希望对你有一定的参考价值。
目录
2 Use Full Kinematic Contacts 碰撞
官方参考文档
我的Unity版本
我用的版本是2021.3
Rigidbody刚体的作用
- Rigidbody其实有2D和3D的区分,但作为一个组件在Unity中都是为了模拟物理效果,组件会提供一些参数的赋值。当一个游戏对象被赋予Rigidbody组件后,引擎就会自动对这个游戏对象进行物理效果的计算和模拟;
- 给一个游戏对象施加作用力让它动起来,需要用到刚体组件;
- 当一个对象需要有重力效果,需要用到刚体组件。
Rigidbody 2D的添加
在Inspector界面 -> Add Component -> Physics 2D -> Rigidbody 2D就可以添加2D刚体组件。
Rigidbody的面板属性
当给一个游戏对象添加2D刚体组件时,默认添加面板长这样,刚体类型默认是动态Dynamic.
Body Type 刚体类型
第一个Body Type就是刚体类型,包括默认的一共可设置成三种:Dynamic动态、Kinematic运动学、Static静态。刚体类型将决定游戏对象的
- 移动(位置和旋转)行为
- 碰撞体相互作用(2D刚体的相互碰撞是发生在每个刚体所连接的2D碰撞体上的;如果没有赋予2D碰撞体,那么刚体也不能相互碰撞)
下面会分别按照三种类型的面板属性一一介绍。
Body Type -> Dynamic
1 Dynamic 动态类型
这是默认的类型,具有全套的属性,受重力和作用力的影响。
- 移动行为——可以用作物理模拟下会移动的物体;
- 碰撞体相互作用——会跟其他所有类型的Rigidbody2D进行碰撞,是最具有互动性的刚体类型,也因此消耗的性能最高;
- 值得注意的是,不要使用变换组件Transform组件来设置刚体的位置或旋转。
2 Material 材质
关联物理材质,Dynamic类型默认的话是给了一个None,是一个2D物理材质Physics Material 2D,用来调整2D物理对象碰撞时这些对象之间的摩擦和弹性。
Assets -> create -> 2D -> Physics Material 2D就可以新建一个Physics Material 2D,默认的摩擦系数Friction -> 0.4,弹性Bounciness -> 0.
3 Simulated 模拟
选中Simulated,2D刚体以及其所有附加的2D碰撞体(Collider 2D)和2D关节(Joint 2D)在运行时会与物理模拟系统进行交互,这些交互包括:运动、2D碰撞体的碰撞、2D节点的约束等。
运用2D刚体的这个Simulated属性,比直接操作单个2D碰撞体/2D关节更高效。
4 Use Auto Mass 自动质量
勾选它可将 2D 刚体的质量自动设置为与 2D 碰撞体质量相同的值,这个打开时Mass属性将变成灰色,不能输入值。
5 Mass 质量
定义2D刚体的质量。
6 Linear Drag 位置移动阻力系数
它是一个会影响位置移动的阻力系数。
7 Angular Drag 旋转移动阻力系数
它是一个会影响旋转移动的阻力系数。
8 Gravity Scale 重力影响
定义游戏对象受重力影响的程度,0 -> 不受重力影响。
9 Collision Detection 如何检测碰撞
- Discrete —— 碰撞时在物理更新期间可以重叠/穿过彼此(移动速度够快时);
- Continuous —— 不会穿过彼此,引擎会自动计算第一个碰撞点,并将游戏对象移动到该点。
10 Sleeping Mode 睡眠模式
定义游戏对象如何处于睡眠状态,以节省处理器时间,有三种可选状态
- Start Asleep——最初处于睡眠状态,可被唤醒;
- Start awake——最初就处于唤醒状态;
- Never sleep——禁止睡眠(一般不用这个)。
11 Interpolate 平滑插值
定义如何在物理更新间隔之间插入游戏对象的移动,运动趋于颠簸时有用,它有三种可选状态
- None——不应用平滑;
- Interpolate——根据游戏对象在上一帧的位置来平滑移动;
- extrapolate——根据在下一帧的位置来平滑移动。
12 Constraints 限制
定义刚体运动的限制,对运动轴和旋转轴进行冻结
- Freeze Position——禁止刚体在世界坐标中的X/Y轴进行运动;
- Freeze Rotation——禁止刚体围绕Z轴旋转(2D画面中Z轴应该就是朝向屏幕内的轴)
13 Info 信息
显示游戏对象当前的一些信息状态。
Body Type -> Kinematic
当刚体类型设置成运动学类型时,面板长这样
1 Kinematic 运动学类型
这一类型的 2D 刚体也是设计为在物理模拟下移动,但是仅在非常明确的用户控制下进行:
- 移动行为——可以用作物理模拟下会移动的物体,但不受重力和作用力的影响;
- 碰撞体相互作用——仅跟Dynamic类型的Rigidbody2D进行碰撞;
- 与Static类型的刚体类似,Kinematic刚体在碰撞期间的行为类似于具有无穷大质量而不可移动的对象。
2 Use Full Kinematic Contacts 碰撞
选中这个选项,游戏对象将与所有类型的2D刚体发生碰撞,此时类似于Dynamic类型的刚体,但它还是一个不能移动的对象。
其余属性与Dynamic中的描述一致
Body Type -> Static
当刚体类型设置成静止类型时,面板长这样
- 移动行为——不能移动,可以看成质量无穷大的物体;
- 碰撞体相互作用——仅跟Dynamic类型的Rigidbody2D发生碰撞。
以上就是我对2D刚体的学习记录,具体的运用将在之后的学习中继续学习~
Unity入门计划Collision2D类&Collider2D类
目录
官方文档
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.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入门计划基本概念-2D刚体Rigidbody 2D的主要内容,如果未能解决你的问题,请参考以下文章
Unity入门计划Collision2D类&Collider2D类