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)。它使游戏对象能够根据物理规则进行运动和交互。
核心功能
- 物理属性:
- 质量(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 上。
相关文章:

Unity学习笔记(一)如何实现物体之间碰撞
前言 本文为Udemy课程The Ultimate Guide to Creating an RPG Game in Unity学习笔记 如何实现物体之间碰撞 实现物体之间的碰撞关键组件:Rigidbody 2D(刚体)、Collider 2D(碰撞体)、Sprite Renderer(Sprite渲染器) 实现物体之间的碰撞 …...

LinkedList与链表 和 链表面试题
目录 一. ArrayList 与 LinkedList 的优缺点: 二. LinkedList 的分类 三.链表的十道面试题: 1. 删除链表中等于给定值 val 的所有节点。题目链接 2. 反转⼀个单链表。题目链接 3. 输⼊⼀个链表,输出该链表中倒数第k个结点。题目链接 4.给定…...

ansible自动化运维(一)简介及清单,模块
相关文章ansible自动化运维(二)playbook模式详解-CSDN博客ansible自动化运维(三)jinja2模板&&roles角色管理-CSDN博客ansible自动化运维(四)运维实战-CSDN博客 ansible自动化运维工具 1.什么是自…...

利用代理IP爬取Zillow房产数据用于数据分析
引言 最近数据分析的热度在编程社区不断攀升,有很多小伙伴都开始学习或从事数据采集相关的工作。然而,网站数据已经成为网站的核心资产,许多网站都会设置一系列很复杂的防范措施,阻止外部人员随意采集其数据。为了解决这个问题&a…...

大屏开源项目go-view二次开发1----环境搭建(C#)
最近公司要求做一个大屏的程序用于展示公司的产品,我以前也没有相关的经验,最糟糕的是公司没有UI设计的人员,领导就一句话要展示公司的产品,具体展示的内容细节也不知道,全凭借自己发挥。刚开始做时是用wpf做的&#x…...

【含开题报告+文档+PPT+源码】基于微信小程序的点餐系统的设计与实现
开题报告 随着互联网技术的日益成熟和消费者生活水平与需求层次的显著提升,外卖点餐平台在中国市场上迅速兴起并深深植根于民众日常生活的各个角落。这类平台的核心在于构建了一个基于互联网的强大订餐服务系统,它无缝整合了餐饮商户资源与广大消费者的…...

k8s中用filebeat文件如何收集不同service的日志
以下是一个详细的从在 Kubernetes 集群中部署 Filebeat,到实现按web-oper、web-api微服务分离日志并存储到不同索引的完整方案: 理解需求:按服务分离日志索引 在 Kubernetes 集群中,有web-oper和web-api两种微服务,希…...
Mysql数据库中,什么情况下设置了索引但无法使用?
在MySQL数据库中,即使已经正确设置了索引,但在某些情况下索引可能无法被使用。 以下是一些常见的情况: 1. 数据分布不均匀 当某个列的数据分布非常不均匀时,索引可能无法有效地过滤掉大部分的数据,导致索引失效。 …...

QT6学习第十一天 Qt Quick控件 Control
QT6学习第十一天 Qt Quick控件控件基类 Control按钮类控件指示器类控件输入类控件日期类控件 Qt Quick控件 Qt Quick本身是为了移动触摸界面而生的,但Qt的跨平台性也决定了它需要支持多种系统。为了支持桌面平台开发,从Qt 5.1开始,增加了新的…...
【唐叔学算法】第16天:枚举-探索所有可能性的艺术
大家好,我是唐叔。今天我们要探讨的是一个看似简单却非常实用的概念——枚举(Enumeration)。它不仅仅是一种数据类型,在算法设计中也是一种解决问题的策略。通过系统地遍历所有可能的情况,我们可以找到满足特定条件的答…...

【OpenCV】基于GrabCut算法的交互式前景提取
介绍 GrabCut 算法是一种用于图像分割的交互式前景提取技术,它结合了图割(Graph Cut)方法和迭代优化过程。该算法最初由 Rother, Kolmogorov 和 Blake 在 2004 年提出,并因其高效性和准确性而被广泛应用于计算机视觉领域。OpenCV…...

【Flask+OpenAI】利用Flask+OpenAI Key实现GPT4-智能AI对话接口demo - 从0到1手把手全教程(附源码)
文章目录 前言环境准备安装必要的库 生成OpenAI API代码实现详解导入必要的模块创建Flask应用实例配置OpenAI API完整代码如下(demo源码)代码解析 利用Postman调用接口 了解更多AI内容结尾 前言 Flask作为一个轻量级的Python Web框架,凭借其…...

最短路----Dijkstra算法详解
简介 迪杰斯特拉(Dijkstra)算法是一种用于在加权图中找到单个源点到所有其他顶点的最短路径的算法。它是由荷兰计算机科学家艾兹格迪科斯彻(Edsger Dijkstra)在1956年提出的。Dijkstra算法适用于处理带有非负权重的图。迪杰斯特拉…...

ORB-SLAM3源码学习:G2oTypes.cc: void EdgeInertial::computeError 计算预积分残差
前言 这部分函数涉及了g2o的内容以及IMU相关的推导内容,需要你先去进行这部分的学习。 1.函数声明 void EdgeInertial::computeError() 2.函数定义 涉及到的IMU的公式: {// TODO Maybe Reintegrate inertial measurments when difference between …...
Unity协程机制详解
Unity的协程(Coroutine)是一种异步编程的机制,允许在多个帧之间分割代码的执行,而不阻塞主线程。与传统的多线程不同,Unity的协程在主线程中运行,并不会开启新的线程。 什么是协程? 协程是一种…...
2024年【高压电工】最新解析及高压电工考试总结
高压电工考试是电力行业从业人员必须通过的资格考试之一,它不仅检验了考生对高压电技术的掌握程度,还考验了考生在实际操作中的安全意识和应急处理能力。为了帮助广大考生更好地备考,本文整理了10道2024年高压电工考试的最新解析及总结试题&a…...
OELOVE 6.0城市列表模板
研究了好久OELOVE6.0源码,一直想将城市列表给单独整出来,做地区排名,但是PHP程序都是加密的,非常难搞,做二开都是要命的处理不了,在这里有一个简单方法可以处理城市列表,并且可以自定义TDK&…...

如何将你的 Ruby 应用程序从 OpenSearch 迁移到 Elasticsearch
作者:来自 Elastic Fernando Briano 将 Ruby 代码库从 OpenSearch 客户端迁移到 Elasticsearch 客户端的指南。 OpenSearch Ruby 客户端是从 7.x 版 Elasticsearch Ruby 客户端分叉而来的,因此代码库相对相似。这意味着当将 Ruby 代码库从 OpenSearch 迁…...

day1数据结构,关键字,内存空间存储与动态分区,释放
小练习 在堆区空间连续申请5个int类型大小空间,用来存放从终端输入的5个学生成绩,然后显示5个学生成绩,再将学生成绩升序排序,排序后,再次显示学生成绩。显示和排序分别用函数完成(两种排序方法࿰…...

1_linux系统网络性能如何优化——几种开源网络协议栈比较
之前合集《计算机网络从入门到放弃》第一阶段算是已经完成了。都是理论,没有实操,让“程序猿”很难受,操作性不如 Modbus发送的报文何时等到应答和 tcp通信测试报告单1——connect和send。开始是想看linux内核网络协议栈的源码,然…...

深入剖析AI大模型:大模型时代的 Prompt 工程全解析
今天聊的内容,我认为是AI开发里面非常重要的内容。它在AI开发里无处不在,当你对 AI 助手说 "用李白的风格写一首关于人工智能的诗",或者让翻译模型 "将这段合同翻译成商务日语" 时,输入的这句话就是 Prompt。…...

(二)TensorRT-LLM | 模型导出(v0.20.0rc3)
0. 概述 上一节 对安装和使用有个基本介绍。根据这个 issue 的描述,后续 TensorRT-LLM 团队可能更专注于更新和维护 pytorch backend。但 tensorrt backend 作为先前一直开发的工作,其中包含了大量可以学习的地方。本文主要看看它导出模型的部分&#x…...

关于nvm与node.js
1 安装nvm 安装过程中手动修改 nvm的安装路径, 以及修改 通过nvm安装node后正在使用的node的存放目录【这句话可能难以理解,但接着往下看你就了然了】 2 修改nvm中settings.txt文件配置 nvm安装成功后,通常在该文件中会出现以下配置&…...

学校招生小程序源码介绍
基于ThinkPHPFastAdminUniApp开发的学校招生小程序源码,专为学校招生场景量身打造,功能实用且操作便捷。 从技术架构来看,ThinkPHP提供稳定可靠的后台服务,FastAdmin加速开发流程,UniApp则保障小程序在多端有良好的兼…...
Java - Mysql数据类型对应
Mysql数据类型java数据类型备注整型INT/INTEGERint / java.lang.Integer–BIGINTlong/java.lang.Long–––浮点型FLOATfloat/java.lang.FloatDOUBLEdouble/java.lang.Double–DECIMAL/NUMERICjava.math.BigDecimal字符串型CHARjava.lang.String固定长度字符串VARCHARjava.lang…...

剑指offer20_链表中环的入口节点
链表中环的入口节点 给定一个链表,若其中包含环,则输出环的入口节点。 若其中不包含环,则输出null。 数据范围 节点 val 值取值范围 [ 1 , 1000 ] [1,1000] [1,1000]。 节点 val 值各不相同。 链表长度 [ 0 , 500 ] [0,500] [0,500]。 …...

ESP32 I2S音频总线学习笔记(四): INMP441采集音频并实时播放
简介 前面两期文章我们介绍了I2S的读取和写入,一个是通过INMP441麦克风模块采集音频,一个是通过PCM5102A模块播放音频,那如果我们将两者结合起来,将麦克风采集到的音频通过PCM5102A播放,是不是就可以做一个扩音器了呢…...

HBuilderX安装(uni-app和小程序开发)
下载HBuilderX 访问官方网站:https://www.dcloud.io/hbuilderx.html 根据您的操作系统选择合适版本: Windows版(推荐下载标准版) Windows系统安装步骤 运行安装程序: 双击下载的.exe安装文件 如果出现安全提示&…...

WordPress插件:AI多语言写作与智能配图、免费AI模型、SEO文章生成
厌倦手动写WordPress文章?AI自动生成,效率提升10倍! 支持多语言、自动配图、定时发布,让内容创作更轻松! AI内容生成 → 不想每天写文章?AI一键生成高质量内容!多语言支持 → 跨境电商必备&am…...
JS手写代码篇----使用Promise封装AJAX请求
15、使用Promise封装AJAX请求 promise就有reject和resolve了,就不必写成功和失败的回调函数了 const BASEURL ./手写ajax/test.jsonfunction promiseAjax() {return new Promise((resolve, reject) > {const xhr new XMLHttpRequest();xhr.open("get&quo…...