目录
一.简介
二.组件详细介绍
2D刚体
类型介绍
三. 刚体的简单使用
一.简介
2D 物理系统为开发者提供了强大的工具来模拟和控制二维游戏中的物理行为。
A、基本概念
-
刚体(Rigidbody 2D)
- 刚体组件用于赋予游戏对象物理属性,使其能够受到重力、力、碰撞等物理效果的影响。
- 可以设置刚体的质量、阻力、重力缩放等参数,以控制对象的运动行为。
- 例如,一个平台跳跃游戏中的主角通常会添加刚体组件,使其能够在重力作用下下落,并在与平台碰撞时产生真实的反弹效果。
-
碰撞体(Collider 2D)
- 碰撞体定义了游戏对象的形状和碰撞范围。不同类型的碰撞体包括矩形碰撞体(Box Collider 2D)、圆形碰撞体(Circle Collider 2D)、多边形碰撞体(Polygon Collider 2D)等。
- 碰撞体与刚体结合使用,当两个带有碰撞体的游戏对象发生接触时,会触发碰撞事件。
- 比如,在一个射击游戏中,子弹和敌人都需要添加碰撞体,以便在碰撞时产生伤害效果。
B、物理特性
-
重力
- Unity 的 2D 物理系统默认会对带有刚体的游戏对象施加重力。可以调整重力的大小和方向,以适应不同的游戏场景。
- 例如,在一个太空题材的游戏中,可以将重力设置为较小的值或者关闭重力,以模拟零重力环境。
-
摩擦力和弹力
- 可以设置碰撞体的摩擦系数和弹力系数,以控制对象之间的摩擦和反弹效果。
- 高摩擦系数会使对象在接触时更容易停止移动,而高弹力系数会使对象在碰撞时产生更强的反弹。
- 比如,在一个冰面场景中,可以降低摩擦系数,使角色在冰面上滑行更加顺畅。
-
物理材质(Physics Material 2D)
- 物理材质可以应用于碰撞体,以进一步控制碰撞的特性。可以设置物理材质的摩擦、弹力、密度等属性。
- 例如,可以创建一个 “橡胶” 物理材质,用于模拟弹性物体的碰撞效果。
C、碰撞检测与响应
-
碰撞事件
- Unity 提供了一系列碰撞事件函数,如 OnCollisionEnter2D、OnCollisionStay2D 和 OnCollisionExit2D,开发者可以在脚本中监听这些事件,并根据碰撞情况执行相应的逻辑。
- 例如,当玩家角色与敌人碰撞时,可以触发战斗逻辑或者减少玩家的生命值。
-
触发碰撞(Trigger)
- 可以将碰撞体设置为触发模式,当两个触发碰撞体发生接触时,会触发 OnTriggerEnter2D、OnTriggerStay2D 和 OnTriggerExit2D 事件。
- 触发碰撞通常用于检测特定区域的进入或离开,比如检测玩家是否进入了一个奖励区域。
D、物理模拟的优化
-
层碰撞矩阵(Layer Collision Matrix)
- 通过设置层碰撞矩阵,可以控制不同层之间的碰撞关系。可以选择哪些层之间应该发生碰撞,哪些层之间应该忽略碰撞。
- 这对于优化游戏性能非常有用,特别是在处理大量游戏对象时。
- 例如,可以将背景层和特效层设置为不发生碰撞,以减少不必要的物理计算。
-
静态碰撞体(Static Collider)
- 如果一个游戏对象在游戏过程中不会移动,可以将其碰撞体设置为静态碰撞体。静态碰撞体会被物理引擎进行优化,提高性能。
- 例如,游戏中的墙壁、地面等固定的物体可以设置为静态碰撞体。
二.组件详细介绍
2D刚体
属性: | 功能: | |
---|---|---|
Body Type | 设置 2D 刚体的组件设置,从而可操纵移动(位置和旋转)行为和 2D 碰撞体交互。 选项为:__Dynamic、Kinematic、Static__ | |
Material | 使用此属性可为连接到特定父 2D 刚体的所有 2D 碰撞体指定公共材质。 注意:2D 碰撞体使用自己的 Material 属性(如果已设置)。如果此处或在 2D 碰撞体中未指定材质,则默认选项为 None (Physics Material 2D)。这种情况下使用可在 Physics 2D 窗口中设置的默认材质。 2D 碰撞体使用以下优先级顺序来确定要使用的 Material 设置: 1. 在 2D 碰撞体上指定的 2D 物理材质。 2.在附加的 2D 刚体上指定的 2D 物理材质。 在 Physics 2D 窗口中指定的 2D 物理材质默认材质。 提示:使用此设置确保附加到同一 Static Body Type 2D 刚体的所有 2D 碰撞体都可使用同一材质。 | |
Simulated | 如果希望 2D 刚体以及所有附加的 2D 碰撞体和 2D 关节在运行时与物理模拟系统交互,请启用 Simulated__(选中复选框)。如果禁用此功能(取消选中复选框),这些组件不会与模拟系统进行交互。请参阅下面的 2D 刚体属性:Simulated 以了解更多详细信息。默认情况下会选中此框。 | | Use Auto Mass__ | 如果希望 2D 刚体从其 2D 碰撞体中自动检测游戏对象的质量,请选中此框。 |
Mass | 定义 2D 刚体的质量。如果已选中 Use Auto Mass,此属性将显示灰色。 | |
Linear Drag | 一种会影响位置移动的阻力系数。 | |
Angular Drag | 一种会影响旋转移动的阻力系数。 | |
Gravity Scale | 定义游戏对象受重力影响的程度。 | |
Collision Detection | 定义如何检测 2D 碰撞体之间的碰撞。 | |
Discrete | 将 Collision Detection 设置为 Discrete 时,具有 2D 刚体和 2D 碰撞体的游戏对象在物理更新期间可以重叠或穿过彼此(如果移动得足够快)。仅会在新位置生成碰撞触点。 | |
Continuous | Collision Detection 设置为 Continuous 时,具有 2D 刚体和 2D 碰撞体的游戏对象在更新期间不会穿过彼此。相反,Unity 会计算 2D 碰撞体的第一个影响点,并将游戏对象移动到该点。请注意,此设置比 Discrete 耗费更多 CPU 时间。 | |
Sleeping Mode | 定义游戏对象如何在处于静止状态时“睡眠”以节省处理器时间。 | |
Never Sleep | 禁用睡眠(应尽可能避免此设置,否则会影响系统资源)。 | |
Start Awake | 游戏对象最初处于唤醒状态。 | |
Start Asleep | 游戏对象最初处于睡眠状态,但可以被碰撞唤醒。 | |
Interpolate | 定义如何在物理更新间隔之间插入游戏对象的移动(运动趋于颠簸状态时很有用)。 | |
None | 不应用移动平滑。 | |
Interpolate | 根据游戏对象在先前帧中的位置来平滑移动。 | |
Extrapolate | 根据游戏对象在下一帧中的估计位置来平滑移动。 | |
Constraints | 定义对 2D 刚体运动的任何限制。 | |
Freeze Position | 选择性停止 2D 刚体沿世界 X 和 Y 轴的移动。 | |
Freeze Rotation | 选择性停止 2D 刚体围绕 Z 轴的旋转。 |
类型介绍
在 Unity 中,2D 刚体分为 Kinematic(运动学)类型和 Dynamic(动态)类型,它们具有不同的特性和用途。
一、Kinematic 类型的 2D 刚体
特点
- 不受物理引擎的力和重力影响。这意味着它不会因为重力而自然下落,也不会被其他物体通过物理力推动。
- 可以通过脚本直接控制其位置、旋转和速度等属性。这种直接控制使得开发者可以精确地控制物体的运动,非常适合用于需要精确控制运动轨迹的场景。
- 可以与其他 Dynamic 类型的刚体或静态碰撞体发生碰撞,并触发相应的碰撞事件。但是,它不会对其他物体产生力的作用。
用途
- 用于控制游戏中的平台、移动的障碍物等。例如,在一个平台跳跃游戏中,可以使用 Kinematic 类型的刚体来创建移动的平台,通过脚本控制平台的运动,让玩家可以在平台上跳跃和移动。
- 制作动画效果。可以将动画与 Kinematic 类型的刚体结合起来,实现复杂的动画效果,同时还能与其他物体进行碰撞检测。
- 实现特定的游戏逻辑。比如在一些解谜游戏中,需要通过精确控制物体的运动来触发特定的机关或完成特定的任务。
二、Dynamic 类型的 2D 刚体
特点
- 受物理引擎的力、重力和摩擦力等影响。它会在重力作用下自然下落,并且可以被其他物体通过物理力推动。
- 可以与其他 Dynamic 类型的刚体和静态碰撞体发生碰撞,并根据碰撞的情况产生相应的物理反应,如反弹、旋转等。
- 具有质量、阻力等物理属性,可以通过调整这些属性来改变物体的运动行为。
用途
- 模拟真实的物理效果。例如,在一个球类游戏中,球可以使用 Dynamic 类型的刚体,它会在重力作用下下落,并且在与地面或其他物体碰撞时产生真实的反弹效果。
- 制作可互动的物体。玩家可以通过施加力或碰撞来影响 Dynamic 类型的刚体,从而实现与游戏世界的互动。
- 增加游戏的随机性和真实感。由于 Dynamic 类型的刚体受到物理引擎的影响,其运动轨迹和行为具有一定的随机性,这可以增加游戏的真实感和趣味性。
三. 刚体的简单使用
代码
using UnityEngine;
public class Rigidbody2DController : MonoBehaviour
{
public float moveSpeed = 5f;
public float jumpForce = 10f;
private Rigidbody2D rb;
private void Start()
{
rb = GetComponent<Rigidbody2D>();
}
private void Update()
{
// 水平移动
float horizontalInput = Input.GetAxis("Horizontal");
rb.velocity = new Vector2(horizontalInput * moveSpeed, rb.velocity.y);
// 跳跃
if (Input.GetButtonDown("Jump"))
{
rb.AddForce(new Vector2(0f, jumpForce), ForceMode2D.Impulse);
}
}
}
效果演示
这个旋转问题可以点击这里
就可以直着移动了。
可以使用射线来判断,主角是否在地面上,来判断是否跳跃.