17.Rigidbody2D刚体2D

17.2D相关-2D物理系统-刚体


17.1 知识点

学习2D物理系统的前提

  • 学习2D物理系统之前建议先学习Unity入门当中的3D物理系统,因为它们非常的类似。
  • 由于我们之前详细讲解了3D物理系统,所以在讲解2D物理系统时会相对简洁一些,一些讲过的知识点就不过多赘述了。

2D物理系统中的刚体组件

  • 刚体是物理系统中用于帮助我们进行模拟物理碰撞中力的效果的。
  • 2D物理系统中的刚体和3D中的刚体基本是一样的,最大的区别是对象只会在XY平面中移动,并且只在垂直于该平面的轴上旋转。

2D物理系统中碰撞产生的条件

  • 在Unity中,2D物理系统中碰撞产生的条件是:
  • 两个物体都必须有Collider 2D组件,用于定义物体的形状和边界。
  • 至少有一个物体必须有Rigidbody 2D组件,用于让物体受到物理引擎的控制。
  • 两个物体的Layer必须在Physics 2D Settings中设置为可以相互碰撞。
  • 两个物体的Collider 2D组件必须有相交或重叠的部分。
  • 如果以上条件都满足,那么当两个物体接触时,就会产生碰撞,并触发相应的事件和回调函数,例如OnCollisionEnter2D,OnCollisionStay2D和OnCollisionExit2D。
  • 碰撞产生后,物理引擎会根据两个物体的质量,速度,角速度,弹力和摩擦力等属性来计算碰撞的响应,并更新物体的位置和旋转。
  • 如果需要自定义碰撞的响应,可以使用Physics Material 2D组件来调整弹力和摩擦力。

Rigidbody2D刚体2D组件参数

Body Type 刚体类型

Dynamic 动态


  • 动态类型,受重力和力的影响移动和旋转。
Material 材质
  • 物理材质
  • 在刚体上设置了物理材质,如果子物体有碰撞器但是没有设置材质则会通用刚体的物理材质。
  • 如果不设置,将使用在Physics 2D窗口中设置的默认材质。
  • 物理材质的使用优先级:
    1. 2D碰撞器上指定的2D物理材质。
    2. 2D刚体上指定的2D物理材质。
    3. Physics 2D窗口指定的2D默认物理材质。
Simulated 模拟的
  • 如果希望2D刚体以及所有子对象2D碰撞器和2D关节都能模拟物理效果,需要启用该选项。
Use Auto Mass 使用自动质量
  • 是否使用自动质量。
Mass 质量
  • 质量。
Linear Drag 线性阻尼
  • 影响位置移动的阻力系数。
Angular Drag 角阻力
  • 影响旋转移动的阻力系数。
Gravity Scale 重力大小
  • 受重力影响的程度。
Collision Detection 碰撞检测

  • 碰撞检测算法。
    • Discrete 离散的:离散检测算法,只会用新位置进行计算,速度过快时会穿过。
    • Continuous 持续的:连续检测算法,计算量更大,但是不会发生穿过的情况。
Sleeping Mode 休眠模式

  • 对象处于静止状态时进入睡眠模式的选择。
    • Never Sleep 从不休眠:从不休眠,会一直进行检测计算,性能消耗较大。
    • Start Awake 开始唤醒:最初处于唤醒状态。
    • Start Asleep 开始休眠:最初处于睡眠状态,但是可以被碰撞唤醒。
Interpolate 插值

  • 物理更新间隔之间的插值运算。
    • None 无:不应用移动平滑。
    • Interpolate插值:根据前一帧进行平滑处理。
    • Extrapolate 外推:根据后一帧位置进行平滑处理。
Constraints 约束
  • 约束限制,可以让某一个轴不受力影响位移或者旋转。
Info 信息
  • 实时的数据信息。
Kinematic 运动


  • 运动学类型,不受力的影响,只能通过代码让其动起来。
  • 能和Dynamic 2D刚体产生碰撞,但是不会动,只会进入碰撞检测函数
  • 因此它没有了质量莫摩擦系数等属性
  • 性能能消耗较低,主要会通过代码来处理其移动旋转
Simulated 模拟的
  • 如果希望2D刚体以及所有子对象2D碰撞器和2D关节都能模拟物理效果,需要启用该选项。
  • 当启用时,会充当一个无限质量的不可移动对象,可以和所有2D刚体产生碰撞。
  • 如果Use Full Kinematic Contacts禁用,它只会和Dynamic 2D刚体碰撞。
Use Full Kinematic Contacts 使用完全运动学联系
  • 如果希望能和所有2D刚体碰撞,启用它。
  • 如果不启用,它不会和Kinematic 2D和Static 2D刚体碰撞。
Static 静态


  • 静态类型,完全不动的需要检测碰撞的对象,相当于是无限质量不可移动的对象。
  • 它的性能消耗最小,它只能和Dynamic 2D刚体碰撞,和它类似的有只加碰撞器而不加刚体的物体,它们会和刚体物体产生碰撞,但是自己不会动。

如何选择不同类型的刚体

  • Dynamic动态刚体:受力的作用,要动要碰撞的对象。
  • Kinematic运动学刚体:通过刚体API移动的对象,不受力的作用,但是想要进行碰撞检测。
  • Static静态刚体:不动不受力作用的静态物体,但是想要进行碰撞检测。

Rigidbody2D刚体2D代码控制

GetComponent<Rigidbody2D>() 得到2D刚体

//得到2D刚体
Rigidbody2D rigid = this.GetComponent<Rigidbody2D>();

Rigidbody2D.AddForce方法 加力

//加力
rigid.AddForce(new Vector2(0, 100));

Rigidbody2D.velocity属性 刚体速度

//速度
rigid.velocity = new Vector2(1, 0);

17.2 知识点代码

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class Lesson17_2D相关_2D物理系统_刚体 : MonoBehaviour
{
    void Start()
    {
        #region 知识点一 学习2D物理系统的前提
        //学习2D物理系统之前建议先学习Unity入门当中的3D物理系统
        //因为他们非常的类似
        //由于我们之前详细讲解了3D物理系统
        //所以在讲解2D物理系统时会相对简洁一些
        //一些讲过的知识点就不过多赘述了
        #endregion

        #region 知识点二 2D物理系统中的刚体组件
        //刚体是物理系统中用于帮助我们进行模拟物理碰撞中力的效果的

        //2D物理系统中的刚体和3D中的刚体基本是一样的
        //最大的区别是对象只会在XY平面中移动,并且只在垂直于该平面的轴上旋转
        #endregion

        #region 知识点三 2D物理系统中碰撞产生的条件
        //在Unity中,2D物理系统中碰撞产生的条件是:
        //两个物体都必须有Collider 2D组件,用于定义物体的形状和边界。
        //至少有一个物体必须有Rigidbody 2D组件,用于让物体受到物理引擎的控制。
        //两个物体的Layer必须在Physics 2D Settings中设置为可以相互碰撞。
        //两个物体的Collider 2D组件必须有相交或重叠的部分。
        //如果以上条件都满足,那么当两个物体接触时,就会产生碰撞,并触发相应的事件和回调函数,例如OnCollisionEnter2D,OnCollisionStay2D和OnCollisionExit2D。
        //碰撞产生后,物理引擎会根据两个物体的质量,速度,角速度,弹力和摩擦力等属性来计算碰撞的响应,并更新物体的位置和旋转。
        //如果需要自定义碰撞的响应,可以使用Physics Material 2D组件来调整弹力和摩擦力。
        #endregion

        #region 知识点四 2D刚体参数相关

        #endregion

        #region 知识点五 如何选择不同类型的刚体
        //Dynamic动态刚体:受力的作用,要动要碰撞的对象

        //Kinematic运动学刚体:通过刚体API移动的对象,不受力的作用,但是想要进行碰撞检测 

        //Static静态刚体:不动不受力作用的静态物体,但是想要进行碰撞检测 
        #endregion

        #region 知识点六 2D刚体API

        //得到2D刚体
        Rigidbody2D rigid = this.GetComponent<Rigidbody2D>();
        //加力
        rigid.AddForce(new Vector2(0, 100));
        //速度
        rigid.velocity = new Vector2(1, 0);

        #endregion
    }
}


转载请注明来源,欢迎对文章中的引用来源进行考证,欢迎指出任何有错误或不够清晰的表达。可以在下面评论区评论,也可以邮件至 785293209@qq.com

×

喜欢就点赞,疼爱就打赏