第5章 Unity3D的物理引擎
Unity3D Physics Engine
本章内容概览
物理引擎基础
- 物理引擎简介
- 刚体(Rigidbody)
- 角色控制器
碰撞系统
- 碰撞器(Collider)
- 触发器(Trigger)
- 物理材质
进阶内容
- 恒定力
- 关节(Joint)
- 射线(Raycast)
5.1 物理引擎简介
Unity内置NVIDIA PhysX物理引擎 - 世界上广为使用的物理引擎
物理引擎特点
- 使用硬件加速,运算速度快
- 减轻CPU负担
- 制作逼真物理效果,无需复杂编程
物理属性对象类型
- Rigidbody - 刚体(钢铁、运动鞋等)
- Kinematic Rigidbody - 运动学刚体
- Static Collider - 静态碰撞器
- Character Controller - 角色控制器
- Joint - 关节(弹簧、铰链等)
- Cloth - 布料
5.1.1 刚体(Rigidbody)组件
刚体:用于模拟对象的牛顿物理学效果 - 车辆撞击、炮弹飞行、球类反弹等
添加刚体
菜单命令:Component → Physics → Rigidbody
主要属性
| 属性 |
说明 |
| Mass |
质量,质量越大惯性越大 |
| Drag |
摩擦力(空气阻力) |
| Angular Drag |
旋转阻力 |
| Use Gravity |
重力效果开关 |
| Is Kinematic |
运动学状态(不受物理引擎控制) |
| Interpolate |
插值平滑(None/Interpolate/Extrapolate) |
| Collision Detection |
碰撞检测精度(Discrete/Continuous) |
5.1.2 角色控制器(CharacterController)
角色控制器:用于制作类似人的角色 - 第一人称/第三人称游戏主角
角色控制器特点
- 不遵循物理规则(可快速转身、急停)
- 执行碰撞检测,可沿墙滑动、上下台阶
- 不受力影响(但重力效果存在)
- 可被代码施加的力推动
主要属性
| 属性 |
说明 |
| Slope Limit |
斜坡受限(可行走的坡度极值) |
| Step Offset |
梯阶受限(可上台阶高度极值) |
| Skin Width |
皮肤厚度(建议设为Radius的10%) |
| Min Move Distance |
最小移动距离(减少抖动) |
| Center/Radius/Height |
胶囊碰撞体参数 |
5.1.3 碰撞器(Collider)组件
碰撞器:与Rigidbody一起使用才能触发碰撞计算
碰撞器类型
| 类型 |
用途 |
| Box Collider |
门、墙、平台、汽车外壳 |
| Sphere Collider |
落石、球类 |
| Capsule Collider |
角色控制器 |
| Mesh Collider |
复杂网格(需开启Convex) |
| Wheel Collider |
车轮(内置碰撞检测和摩擦) |
碰撞必要条件
- 两个物体都必须带有碰撞器
- 至少有一个物体带有Rigidbody
- 两个物体要发生相对位移
5.1.7 触发器(Trigger)
触发器:勾选碰撞器的Is Trigger属性,允许物体穿过并触发事件
碰撞函数(Is Trigger = false)
OnCollisionEnter(Collision collision) // 碰撞开始
OnCollisionStay(Collision collision) // 碰撞保持
OnCollisionExit(Collision collision) // 碰撞退出
触发函数(Is Trigger = true)
OnTriggerEnter(Collider other) // 进入触发器
OnTriggerStay(Collider other) // 停留触发器
OnTriggerExit(Collider other) // 离开触发器
应用场景:检测物体是否经过某个区域、拾取道具、进入传送门
5.1.6 物理材质(Physical Material)
内置物理材质
- Bouncy(弹性)
- Ice(冰)
- Metal(金属)
- Rubber(橡胶)
- Wood(木头)
- MaxFriction(最大摩擦)
- ZeroFriction(零摩擦)
导入方式
Assets → Import Package → Characters → Physics Materials
主要参数
- Dynamic Friction - 滑动摩擦力(0-1)
- Static Friction - 静态摩擦力(0-1)
- Bounciness - 反弹系数(0-1,1无能量损耗)
5.1.4 恒定力(ConstantForce)
恒定力:为刚体添加恒力,适用于火箭发射等持续加速对象
添加方式
菜单命令:Component → Physics → Constant Force
主要属性
| 属性 |
说明 |
| Force |
沿世界坐标系某轴施加恒力 |
| Relative Force |
沿对象自身轴向施加力 |
| Torque |
沿世界坐标系某轴施加扭力 |
| Relative Torque |
沿对象自身轴向施加扭力(自旋) |
5.1.5 关节(Joint)组件
关节类型
| 类型 |
用途 |
| Hinge Joint |
铰链关节 - 门、钟摆、链条 |
| Fixed Joint |
固定关节 - 连接两个对象一起运动 |
| Spring Joint |
弹簧关节 - 弹簧连接效果 |
| Character Joint |
角色关节 - 布娃娃效果 |
| Configurable Joint |
可配置关节 - 自定义关节行为 |
通用属性
- Connected Body - 连接刚体
- Break Force - 断开力
- Break Torque - 断开转矩
5.2 射线(Raycast)
射线:从一点向一个方向发射的无终点的线,用于检测物体
射线检测方法
Physics.Raycast(origin, direction, out hitInfo, maxDistance);
// origin - 射线起点
// direction - 射线方向
// hitInfo - 返回检测到的物体信息
// maxDistance - 最大检测距离
常用应用场景
- 物体拾取 - 鼠标点击选中物体
- 射击检测 - 子弹是否击中目标
- 导航点击 - 点击地面移动角色
5.2 射线应用示例
示例1:鼠标点击拾取物体
void Update() {
if (Input.GetMouseButtonDown(0)) {
Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition);
RaycastHit hit;
if (Physics.Raycast(ray, out hit)) {
Debug.Log("点击了: " + hit.transform.name);
}
}
}
示例2:角色点击移动
Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition);
if (Physics.Raycast(ray, out hit)) {
agent.SetDestination(hit.point); //设置寻路目标
}
本章小结
重点掌握
- 刚体(Rigidbody)属性与使用
- 角色控制器特点
- 碰撞器类型与碰撞条件
- 触发器与碰撞器的区别
- 射线检测原理与应用
了解拓展
- 物理材质参数
- 恒定力组件
- 关节类型与应用
- 碰撞检测优化
思考题:物体发生碰撞的必要条件是什么?
答案:①两个物体都必须带有碰撞器 ②至少一个物体带有Rigidbody ③两个物体发生相对位移