前言
本文为Udemy课程The Ultimate Guide to Creating an RPG Game in Unity学习笔记
如何实现物体之间碰撞
实现物体之间的碰撞关键组件:Rigidbody 2D(刚体)、Collider 2D(碰撞体)、Sprite Renderer(Sprite渲染器)
实现物体之间的碰撞
第一步:让物体拥有物理规则
先创建一个物体的渲染器,命名为 Circle
在Circle对象中创建 Rigidbody 2D(刚体),并设置重力
效果如下,可以看到圆下落了,我们也可以通过调整重力的大小来让它更快的下降
这里没有能掉落在平台,原因是 unity 的物体接触是通过碰撞体(Collider)来实现的,而圆没有设置碰撞体(Collider)
第二步:给物品设置碰撞体(Collider)
unity 的物体接触是通过碰撞体(Collider)来实现的
现在我们来给圆设置 Collider
效果如下
扩展案例
球碰到地面后弹出起来并在斜的平台上滑动
实现的关键:
- 物理机制组件:Rigidbody 2D 设置添加材质(Physics Material 2D)
- 碰撞检查组件:Collider
实现效果如下
这里放 Rigidbody 2D 和 Collider 的材质有什么不同,看下面解析
我们这里需要球自身的弹跳和摩擦,所以放在 Rigidbody 里面了
Rigidbody 2D
Rigidbody 2D 是用于在 2D 空间中处理物理行为的核心组件,广泛用于 2D 游戏引擎(如 Unity)。它使游戏对象能够根据物理规则进行运动和交互。
核心功能
- 物理属性:
- 质量(Mass):定义物体的重量,影响加速度和碰撞反应。
- 重力(Gravity Scale):控制物体受到重力影响的程度,0 表示无重力。
- 线性阻尼(Linear Drag):模拟空气阻力,减缓物体的线性速度。
- 角阻尼(Angular Drag):影响物体旋转时的阻力。
- 运动控制:
- 速度(Velocity):通过调整线性和角速度,控制物体移动和旋转。
- 力(Force)与冲量(Impulse):使用
AddForce
或AddTorque
应用推力或旋转力。 - 运动类型:
- 动态(Dynamic):完全受物理引擎控制。
- 静态(Static):不会受物理影响(常用于地形)。
- 运动学(Kinematic):由脚本控制,不受物理引擎影响。
- 碰撞检测:
- 配合 Collider 2D 使用(如 BoxCollider2D、CircleCollider2D)。
- 配置检测模式(如离散或连续)以减少穿透现象。
使用场景
- 角色控制器:使用 Rigidbody 2D 模拟角色跳跃、移动或受到物理效果。
- 物理互动:让物体能够因力而运动或被碰撞推动。
- 游戏机制:例如投掷物体、摆动绳索或模拟重力。
Collider 2D
Collider 2D 是用于定义物体形状的组件,主要应用于 2D 游戏物理系统中,用于检测碰撞或触发器事件。它与 Rigidbody 2D 配合使用,可以模拟真实的物理交互,如碰撞反应、物体阻挡或触发事件。
作用
- 碰撞检测:
- 定义物体的物理边界,使其能够检测到与其他 Collider 2D 的碰撞。
- 常用于地形、角色、障碍物等游戏元素。
- 触发检测:
- 设置为 触发器(Is Trigger) 时,不再物理阻挡其他物体,但可以检测穿过的对象,常用于检测区域、传送门等。
- 优化性能:
- 提供高效的几何形状检测,而不需要完整的网格数据。
常见的 Collider 2D 类型
Collider 类型 | 描述 |
---|---|
Box Collider 2D | 用于矩形物体,如平台、墙壁等。 |
Circle Collider 2D | 用于圆形物体,如球体或圆形区域检测。 |
Polygon Collider 2D | 用于复杂的多边形形状,自动生成顶点。 |
Edge Collider 2D | 用于创建一条开放的线段,适合地形边缘等。 |
Capsule Collider 2D | 用于胶囊形状,适合角色头顶和底部圆滑的碰撞检测。 |
Composite Collider 2D | 将多个简单 Collider 组合成更复杂的形状(通常与 Tilemap 一起使用)。 |
Collider 2D 的重要属性
- Is Trigger:
- 勾选后,Collider 不会物理阻挡,但可以触发事件(如
OnTriggerEnter2D
)。
- 勾选后,Collider 不会物理阻挡,但可以触发事件(如
- Material(Physics Material 2D):
- 控制碰撞时的摩擦力和弹性。
- Offset:
- 调整 Collider 相对于对象位置的偏移。
- Used by Composite:
- 将当前 Collider 与 Composite Collider 配合使用,优化性能或简化形状。
Collider 2D 与 Rigidbody 2D 的关系
- 没有 Rigidbody 2D 的 Collider 被视为静态对象,仅用于检测碰撞,不会响应物理。
- 带有 Rigidbody 2D 的 Collider 会受到物理引擎影响,可以移动、旋转和碰撞。
Sprite Renderer
Sprite Renderer 是 Unity 中用于在 2D 场景中显示精灵(Sprite)的组件,它负责将 2D 图像渲染到屏幕上,是 2D 游戏开发的核心工具之一。
功能
- 显示图像:
- 将一个 Sprite 纹理分配到对象上进行渲染。
- 支持多种图片格式(如 PNG、JPG),通常使用透明背景的纹理。
- 控制外观:
- 调整 Sprite 的颜色、透明度、渲染顺序等属性。
- 支持简单的动画或视觉效果(如通过脚本改变颜色)。
- 与其他组件交互:
- 可以与 Animator、Rigidbody 2D、Collider 2D 一起使用,制作动态和交互式对象。
主要属性
- Sprite:
- 指定 Sprite 图像资源。
- 在 Unity 中,Sprite 是一种特殊的 2D 图形资源,可以通过 Sprite Editor 编辑裁剪。
- Color:
- 设置 Sprite 的颜色和透明度。
- 默认为白色(
RGBA(255,255,255,255)
),表示图像显示其原始颜色。
- Flip:
- Flip X:水平翻转。
- Flip Y:垂直翻转。
- 常用于角色左右移动的视觉效果。
- Material:
- 定义 Sprite 的材质(如标准材质或自定义 Shader)。
- 可以实现特殊的渲染效果,如光照或像素化。
- Sorting Layer:
- 指定 Sprite 所在的渲染层,用于控制渲染顺序。
- 可通过自定义层级分组(如背景、前景、角色)。
- Order in Layer:
- 定义 Sprite 在同一层内的渲染顺序。
- 值越大,越靠前显示。
常见用法
- 角色渲染:
- 用于显示角色的静态或动态动画帧。
- 搭配 Animator 或脚本实现动画切换。
- 背景和场景元素:
- 用于绘制游戏的背景图、障碍物、装饰物等。
- 效果实现:
- 使用材质或 Shader 实现闪烁、渐变、发光等视觉效果。
Physics Material 2D
Physics Material 2D(物理材质 2D) 是在 游戏开发 或 物理仿真 中,用于定义 2D 物理引擎中对象的物理交互属性的工具。以下是其核心概念和应用:
核心属性
- 摩擦系数(Friction):
- 决定物体之间滑动的阻力。
- 高摩擦值:表面更“粘”,滑动阻力大(如橡胶)。
- 低摩擦值:表面更光滑,物体易滑动(如冰)。
- 弹性(Bounciness/Restitution):
- 定义物体碰撞后的弹跳程度。
- 值为
1.0
:完全弹性(没有能量损失)。 - 值为
0.0
:无弹性(碰撞后停止)。
应用场景
- 游戏开发:
- 制作滑动平台(如冰面)或“黏性”地面效果。
- 模拟运动游戏中的物体弹跳行为(如篮球、弹簧)。
- 物理仿真:
- 用于模拟滑动摩擦、碰撞等现实物理现象。
- 特效设计:
- 用于粒子系统或可破坏场景的真实交互模拟。
如何在 Unity 中应用 Physics Material 2D
在 Unity 中,Physics Material 2D 是一个用于调整 2D 物理行为的组件,可以控制物体的 摩擦力 和 弹性。
将材质附加到 2D Collider 上:
- 在场景中选择需要使用的物体。
- 确保物体有一个 2D 碰撞器组件(如
BoxCollider2D
、CircleCollider2D
等)。 - 在 Collider 的 Material 属性中,拖入创建的 Physics Material 2D 文件。
验证效果:
- 为 Rigidbody2D 添加物理行为(如重力或移动)。
- 运行场景,观察物体在碰撞时的滑动或弹跳效果。
- 根据需要调整摩擦和弹性值。
Physics Material 2D 的典型用例
- 模拟冰面或光滑地板:
- 摩擦系数:
0.1
或更低。 - 弹性系数:
0.0
(无弹性)。
- 摩擦系数:
- 弹性物体(如篮球):
- 摩擦系数:
0.5
(适中)。 - 弹性系数:
0.8
或更高。
- 摩擦系数:
- 粗糙表面(如沙地或草地):
- 摩擦系数:
1.0
或更高。 - 弹性系数:
0.0
(无反弹)。
- 摩擦系数:
材质(Physics Material)放在 Rigidbody 2D 和 Collider有什么区别
在 Unity 中,将 Physics Material 2D(物理材质)应用于 Rigidbody 2D 或 Collider 2D 都会影响物体的物理交互行为,但其应用方式和效果有明显的区别。以下是详细的比较与说明:
- 将物理材质放在 Collider 2D
- 效果:
- 直接影响该 Collider 的碰撞行为,例如摩擦力和弹性。
- 如果一个物体有多个 Collider,它们可以有不同的物理材质,从而产生不同的物理效果。
- 用途:
- 用于定义物体的表面特性。
- 场景示例:
- 一个篮球的碰撞弹性和地板的摩擦分别由它们的 Collider 上的物理材质控制。
- 关键点:
- 每个 Collider 的物理材质是独立的,互不影响。
- 适合有复杂物体(多个 Collider)的情况,允许细粒度控制。
- 将物理材质放在 Rigidbody 2D
- 效果:
- Rigidbody 2D 本身并不直接接受物理材质的应用。
- 物理材质始终需要绑定在 Collider 2D 上,Rigidbody 2D 是用来控制整体物体的动力学行为(如质量、重力和力的应用)。
- 关键点:
- 如果物体包含多个 Collider,物理行为由每个 Collider 上的物理材质决定,而不是 Rigidbody。
- Rigidbody 是物体的运动主体,不负责单独的摩擦或弹性计算。
- 主要区别与实践
功能Collider 2D 上的物理材质Rigidbody 2D 上(无直接效果)是否能直接设置是,物理材质直接绑定到 Collider 的 Material 属性。否,Rigidbody 不接收物理材质。摩擦力和弹性影响决定该 Collider 的摩擦系数和弹性系数。需要通过附加在物体上的 Collider 实现效果。多 Collider 行为每个 Collider 可有独立的物理材质,行为独立。由多个 Collider 的物理材质共同决定物体整体行为。适用场景需要为物体的不同部分设定不同的物理特性。用于控制整体物体的质量、重力或力学行为。
- 示例场景
场景 1:简单物体
- 描述:一个篮球需要高弹性,地板需要高摩擦。
- 实现:
- 在篮球的
CircleCollider2D
上设置高弹性材质(Bounciness=0.9)。 - 在地板的
BoxCollider2D
上设置高摩擦材质(Friction=0.8)。
- 在篮球的
场景 2:复杂物体
- 描述:一个物体有多个部分(例如,汽车),需要不同的物理特性。
- 实现:
- 每个部件的 Collider 设置独立的物理材质,例如轮胎的 Collider 设置高摩擦,车身的 Collider 设置低摩擦。
场景 3:统一物体
- 描述:一个角色只有一个 Rigidbody 和一个 Collider。
- 实现:
- 将物理材质直接放在唯一的 Collider 上,整体受一个物理材质影响。
- 注意事项
- 物理材质必须绑定在 Collider 上:
- Rigidbody 本身不能直接绑定物理材质。
- 如果想改变物体的摩擦或弹性,需要在 Collider 的
Material
属性中设置。
- 多个 Collider 时的材质组合:
- 如果一个 Rigidbody 下有多个 Collider,各 Collider 的物理材质会独立起作用,Unity 引擎会综合计算其交互效果。
- 性能优化:
- 为复杂的动态物体使用尽量少的 Collider,以降低性能消耗。
总结
- Collider 2D 上的物理材质控制物体的表面物理属性(摩擦和弹性)。
- Rigidbody 2D 控制物体的运动和动力学行为,但不直接接受物理材质设置。 如果你的场景中有多个部分需要不同的物理特性,材质应该绑定在相应的 Collider 上。