第5章 Unity3D的物理引擎

Unity3D Physics Engine

虚拟现实技术与开发

模拟真实世界的物理效果

本章内容概览

物理引擎基础

  • 物理引擎简介
  • 刚体(Rigidbody)
  • 角色控制器

碰撞系统

  • 碰撞器(Collider)
  • 触发器(Trigger)
  • 物理材质

进阶内容

  • 恒定力
  • 关节(Joint)
  • 射线(Raycast)

5.1 物理引擎简介

Unity内置NVIDIA PhysX物理引擎 - 世界上广为使用的物理引擎

物理引擎特点

物理属性对象类型

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 车轮(内置碰撞检测和摩擦)

碰撞必要条件

  1. 两个物体都必须带有碰撞器
  2. 至少有一个物体带有Rigidbody
  3. 两个物体要发生相对位移

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)

物理材质:配置物体表面的摩擦系数和弹性系数

内置物理材质

导入方式

Assets → Import Package → Characters → Physics Materials

主要参数

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 可配置关节 - 自定义关节行为

通用属性

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 ③两个物体发生相对位移