Unity入门计划基本概念-2D刚体Rigidbody 2D

Posted 九九345

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Unity入门计划基本概念-2D刚体Rigidbody 2D相关的知识,希望对你有一定的参考价值。

目录

官方参考文档

我的Unity版本

Rigidbody刚体的作用

Rigidbody 2D的添加

Rigidbody的面板属性

Body Type 刚体类型

Body Type -> Dynamic

1 Dynamic 动态类型

2 Material 材质

3 Simulated 模拟

4 Use Auto Mass 自动质量

5 Mass 质量

6 Linear Drag 位置移动阻力系数

7 Angular Drag 旋转移动阻力系数

8 Gravity Scale 重力影响

9 Collision Detection 如何检测碰撞

10 Sleeping Mode 睡眠模式

11 Interpolate 平滑插值

12 Constraints 限制

13 Info 信息

Body Type -> Kinematic

1 Kinematic 运动学类型

2 Use Full Kinematic Contacts 碰撞

其余属性与Dynamic中的描述一致

Body Type -> Static


官方参考文档

2D 刚体 - Unity 手册

我的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类

目录

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入门计划基本概念-2D刚体Rigidbody 2D的主要内容,如果未能解决你的问题,请参考以下文章

Unity入门计划Collision2D类&Collider2D类

unity2d刚体不能用translate移动吗

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

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

unity3d/2d刚体addforce如何才能立即停下来,我人物移动每次都会滑行一会

Unity Rigidbody2D 手册