Unity学习笔记(一)如何实现物体之间碰撞

前言

本文为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)。它使游戏对象能够根据物理规则进行运动和交互。

核心功能
  1. 物理属性
    1. 质量(Mass):定义物体的重量,影响加速度和碰撞反应。
    2. 重力(Gravity Scale):控制物体受到重力影响的程度,0 表示无重力。
    3. 线性阻尼(Linear Drag):模拟空气阻力,减缓物体的线性速度。
    4. 阻尼(Angular Drag):影响物体旋转时的阻力。
  2. 运动控制
    1. 速度(Velocity):通过调整线性和角速度,控制物体移动和旋转。
    2. 力(Force)与冲量(Impulse) :使用 AddForceAddTorque 应用推力或旋转力。
    3. 运动类型
      • 动态(Dynamic):完全受物理引擎控制。
      • 静态(Static):不会受物理影响(常用于地形)。
      • 运动学(Kinematic):由脚本控制,不受物理引擎影响。
  3. 碰撞检测
    1. 配合 Collider 2D 使用(如 BoxCollider2D、CircleCollider2D)。
    2. 配置检测模式(如离散或连续)以减少穿透现象。
使用场景
  • 角色控制器:使用 Rigidbody 2D 模拟角色跳跃、移动或受到物理效果。
  • 物理互动:让物体能够因力而运动或被碰撞推动。
  • 游戏机制:例如投掷物体、摆动绳索或模拟重力。

Collider 2D

Collider 2D 是用于定义物体形状的组件,主要应用于 2D 游戏物理系统中,用于检测碰撞或触发器事件。它与 Rigidbody 2D 配合使用,可以模拟真实的物理交互,如碰撞反应、物体阻挡或触发事件。

作用
  1. 碰撞检测
    1. 定义物体的物理边界,使其能够检测到与其他 Collider 2D 的碰撞。
    2. 常用于地形、角色、障碍物等游戏元素。
  2. 触发检测
    1. 设置为 触发器(Is Trigger) 时,不再物理阻挡其他物体,但可以检测穿过的对象,常用于检测区域、传送门等。
  3. 优化性能
    1. 提供高效的几何形状检测,而不需要完整的网格数据。
常见的 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 的重要属性
  1. Is Trigger
    1. 勾选后,Collider 不会物理阻挡,但可以触发事件(如 OnTriggerEnter2D)。
  2. Material(Physics Material 2D)
    1. 控制碰撞时的摩擦力和弹性。
  3. Offset
    1. 调整 Collider 相对于对象位置的偏移。
  4. Used by Composite
    1. 将当前 Collider 与 Composite Collider 配合使用,优化性能或简化形状。
Collider 2D 与 Rigidbody 2D 的关系
  • 没有 Rigidbody 2D 的 Collider 被视为静态对象,仅用于检测碰撞,不会响应物理。
  • 带有 Rigidbody 2D 的 Collider 会受到物理引擎影响,可以移动、旋转和碰撞。

Sprite Renderer

Sprite Renderer 是 Unity 中用于在 2D 场景中显示精灵(Sprite)的组件,它负责将 2D 图像渲染到屏幕上,是 2D 游戏开发的核心工具之一。

功能
  1. 显示图像
    1. 将一个 Sprite 纹理分配到对象上进行渲染。
    2. 支持多种图片格式(如 PNG、JPG),通常使用透明背景的纹理。
  2. 控制外观
    1. 调整 Sprite 的颜色、透明度、渲染顺序等属性。
    2. 支持简单的动画或视觉效果(如通过脚本改变颜色)。
  3. 与其他组件交互
    1. 可以与 AnimatorRigidbody 2DCollider 2D 一起使用,制作动态和交互式对象。
主要属性
  1. Sprite
    1. 指定 Sprite 图像资源。
    2. 在 Unity 中,Sprite 是一种特殊的 2D 图形资源,可以通过 Sprite Editor 编辑裁剪。
  2. Color
    1. 设置 Sprite 的颜色和透明度。
    2. 默认为白色(RGBA(255,255,255,255)),表示图像显示其原始颜色。
  3. Flip
    1. Flip X:水平翻转。
    2. Flip Y:垂直翻转。
    3. 常用于角色左右移动的视觉效果。
  4. Material
    1. 定义 Sprite 的材质(如标准材质或自定义 Shader)。
    2. 可以实现特殊的渲染效果,如光照或像素化。
  5. Sorting Layer
    1. 指定 Sprite 所在的渲染层,用于控制渲染顺序。
    2. 可通过自定义层级分组(如背景、前景、角色)。
  6. Order in Layer
    1. 定义 Sprite 在同一层内的渲染顺序。
    2. 值越大,越靠前显示。
常见用法
  1. 角色渲染
    1. 用于显示角色的静态或动态动画帧。
    2. 搭配 Animator 或脚本实现动画切换。
  2. 背景和场景元素
    1. 用于绘制游戏的背景图、障碍物、装饰物等。
  3. 效果实现
    1. 使用材质或 Shader 实现闪烁、渐变、发光等视觉效果。

Physics Material 2D

Physics Material 2D(物理材质 2D) 是在 游戏开发物理仿真 中,用于定义 2D 物理引擎中对象的物理交互属性的工具。以下是其核心概念和应用:

核心属性
  1. 摩擦系数(Friction)
    1. 决定物体之间滑动的阻力。
    2. 高摩擦值:表面更"粘",滑动阻力大(如橡胶)。
    3. 低摩擦值:表面更光滑,物体易滑动(如冰)。
  2. 弹性(Bounciness/Restitution)
    1. 定义物体碰撞后的弹跳程度。
    2. 值为 1.0:完全弹性(没有能量损失)。
    3. 值为 0.0:无弹性(碰撞后停止)。
应用场景
  • 游戏开发
    • 制作滑动平台(如冰面)或"黏性"地面效果。
    • 模拟运动游戏中的物体弹跳行为(如篮球、弹簧)。
  • 物理仿真
    • 用于模拟滑动摩擦、碰撞等现实物理现象。
  • 特效设计
    • 用于粒子系统或可破坏场景的真实交互模拟。
如何在 Unity 中应用 Physics Material 2D

Unity 中,Physics Material 2D 是一个用于调整 2D 物理行为 的组件,可以控制物体的 摩擦力弹性

将材质附加到 2D Collider 上

  • 在场景中选择需要使用的物体。
  • 确保物体有一个 2D 碰撞器组件 (如 BoxCollider2DCircleCollider2D 等)。
  • 在 Collider 的 Material 属性中,拖入创建的 Physics Material 2D 文件。

验证效果

  • 为 Rigidbody2D 添加物理行为(如重力或移动)。
  • 运行场景,观察物体在碰撞时的滑动或弹跳效果。
  • 根据需要调整摩擦和弹性值。
Physics Material 2D 的典型用例
  1. 模拟冰面或光滑地板
    1. 摩擦系数:0.1 或更低。
    2. 弹性系数:0.0(无弹性)。
  2. 弹性物体(如篮球)
    1. 摩擦系数:0.5(适中)。
    2. 弹性系数:0.8 或更高。
  3. 粗糙表面(如沙地或草地)
    1. 摩擦系数:1.0 或更高。
    2. 弹性系数:0.0(无反弹)。
材质(Physics Material)放在 Rigidbody 2D 和 Collider有什么区别

在 Unity 中,将 Physics Material 2D (物理材质)应用于 Rigidbody 2DCollider 2D 都会影响物体的物理交互行为,但其应用方式和效果有明显的区别。以下是详细的比较与说明:

  1. 将物理材质放在 Collider 2D
  • 效果
    • 直接影响该 Collider 的碰撞行为,例如摩擦力和弹性。
    • 如果一个物体有多个 Collider,它们可以有不同的物理材质,从而产生不同的物理效果。
  • 用途
    • 用于定义物体的表面特性。
    • 场景示例
      • 一个篮球的碰撞弹性和地板的摩擦分别由它们的 Collider 上的物理材质控制。
  • 关键点
    • 每个 Collider 的物理材质是独立的,互不影响。
    • 适合有复杂物体(多个 Collider)的情况,允许细粒度控制。
  1. 将物理材质放在 Rigidbody 2D
  • 效果
    • Rigidbody 2D 本身并不直接接受物理材质的应用。
    • 物理材质始终需要绑定在 Collider 2D 上,Rigidbody 2D 是用来控制整体物体的动力学行为(如质量、重力和力的应用)。
  • 关键点
    • 如果物体包含多个 Collider,物理行为由每个 Collider 上的物理材质决定,而不是 Rigidbody。
    • Rigidbody 是物体的运动主体,不负责单独的摩擦或弹性计算。
  1. 主要区别与实践

功能Collider 2D 上的物理材质Rigidbody 2D 上(无直接效果)是否能直接设置是,物理材质直接绑定到 Collider 的 Material 属性。否,Rigidbody 不接收物理材质。摩擦力和弹性影响决定该 Collider 的摩擦系数和弹性系数。需要通过附加在物体上的 Collider 实现效果。多 Collider 行为每个 Collider 可有独立的物理材质,行为独立。由多个 Collider 的物理材质共同决定物体整体行为。适用场景需要为物体的不同部分设定不同的物理特性。用于控制整体物体的质量、重力或力学行为。

  1. 示例场景
场景 1:简单物体
  • 描述:一个篮球需要高弹性,地板需要高摩擦。
  • 实现
    • 在篮球的 CircleCollider2D 上设置高弹性材质(Bounciness=0.9)。
    • 在地板的 BoxCollider2D 上设置高摩擦材质(Friction=0.8)。
场景 2:复杂物体
  • 描述:一个物体有多个部分(例如,汽车),需要不同的物理特性。
  • 实现
    • 每个部件的 Collider 设置独立的物理材质,例如轮胎的 Collider 设置高摩擦,车身的 Collider 设置低摩擦。
场景 3:统一物体
  • 描述:一个角色只有一个 Rigidbody 和一个 Collider。
  • 实现
    • 将物理材质直接放在唯一的 Collider 上,整体受一个物理材质影响。
  1. 注意事项
  2. 物理材质必须绑定在 Collider 上
    1. Rigidbody 本身不能直接绑定物理材质。
    2. 如果想改变物体的摩擦或弹性,需要在 Collider 的 Material 属性中设置。
  3. 多个 Collider 时的材质组合
    1. 如果一个 Rigidbody 下有多个 Collider,各 Collider 的物理材质会独立起作用,Unity 引擎会综合计算其交互效果。
  4. 性能优化
    1. 为复杂的动态物体使用尽量少的 Collider,以降低性能消耗。
总结
  • Collider 2D 上的物理材质控制物体的表面物理属性(摩擦和弹性)
  • Rigidbody 2D 控制物体的运动和动力学行为,但不直接接受物理材质设置。 如果你的场景中有多个部分需要不同的物理特性,材质应该绑定在相应的 Collider 上。
相关推荐
YSRM17 分钟前
leetcode--hash表2
算法·leetcode·哈希算法
Y编程小白20 分钟前
Leetcode经典题8--H指数
算法·leetcode·职场和发展
南宫生32 分钟前
力扣-图论-12【算法学习day.62】
java·学习·算法·leetcode·图论
小希与阿树37 分钟前
【算法】图论中DFS和BFS模板讲解
算法·深度优先·图论
会蹦的鱼1 小时前
算法2(蓝桥杯19)-合并两个有序链表
数据结构·算法·链表
zsyzClb1 小时前
SP687 Repeats
数据结构·算法
zfj3211 小时前
图解算法:跳表(Skip List)
数据结构·算法·链表·skiplist
CHENWENFEIc1 小时前
线性时间排序算法:计数排序、桶排序与基数排序详解
数据结构·学习·算法·排序算法
Microsoft Word1 小时前
数据结构——图论基础
数据结构·算法·图论
SONG_YIH2 小时前
88.合并两个有序数组
java·c语言·数据结构·算法·leetcode