unity3d-物理引擎是什么?

2015年02月06日 18:21 0 点赞 1 评论 更新于 2025-11-21 13:59

一、Unity3D 物理引擎概述

Unity3D 物理引擎的主要功能是在游戏中模拟真实的物理效果。例如,在游戏场景中有两个圆柱立方体对象,一个位于天空,另一个在地面。当天空中的圆柱立方体开始自由下落,并与地面上的圆柱立方体发生碰撞时,Unity3D 物理引擎就可以模拟出这种真实碰撞的自然效果。

若要让模型感应物理引擎的效果,需要为该对象添加刚体组件或角色控制器组件。

二、刚体(Rigidbody)

2.1 刚体组件的作用

刚体是一个非常重要的组件。在 Unity 中,新创建的物体默认不具有物理效果,而刚体组件可以为物体添加常见的物理属性,如物体质量、摩擦力和碰撞参数等。这些属性能够真实地模拟物体在 3D 游戏世界中的各种行为。

2.2 示例操作

下面我们在 Unity 中进行一个简单的实验:

  1. 创建一个 plane(平面)和两个 cube(立方体)。其中,蓝色 cube 默认没有添加 rigidbody 组件,而我们要给红色 cube 添加刚体组件。
  2. 添加刚体组件的方法有两种:
    • 通过 “Component—>Physics—>Rigidbody”。
    • 在 Inspector 窗口,选择“AddComponent—>Physics—>Rigidbody ”。

运行游戏后,我们可以观察到,添加了刚体的红色 cube 会感应到物理效应,从空中落下,而蓝色 cube 则保持静止。

2.3 查看刚体属性

在 Inspector 窗口中,我们可以看到 Rigidbody 包含的属性。这里简单介绍几个属性的含义,详细内容可查阅手册。

三、力

3.1 力在刚体中的作用

力是物理学中的重要元素,种类繁多。刚体组件可以受力的作用,例如给刚体施加一个 X 轴方向的力,那么该刚体绑定的物体将沿 X 轴方向向前移动。这就如同用力将物体扔出去,物体会以抛物线的形式移动,而非呆板的匀速平移。

3.2 施加力的方式

施加力的方式有两种:

  1. 普通力:通过设定力的方向和大小,相当于把力施加在物体的重心上。
  2. 位置力:需要设定目标点的位置,物体将朝向这个目标位置施加力。

3.3 示例代码演示

下面通过代码演示如何使用 AddForceAddForceAtPosition 方法:

// 定义三个变量
public GameObject whiteSph; // 白色球体,施加普通力的对象
public GameObject redSph;   // 红色球体,施加目标位置力的对象
public GameObject targetPos; // 目标对象

void OnGUI()
{
if (GUILayout.Button("普通力"))
{
redSph.GetComponent<Rigidbody>().AddForce(0, 1000, 0); // Y 轴上力的大小为 1000,即向上
}
if (GUILayout.Button("位置力"))
{
// 算出 whiteSph 到 targetPos 的目标向量
Vector3 c = targetPos.transform.position - whiteSph.transform.position;
// 在 c 位置施加一个位置力,targetPos 将会向这个位置移动
whiteSph.GetComponent<Rigidbody>().AddForceAtPosition(c, targetPos.transform.position, ForceMode.Impulse);
}
}

操作步骤如下:

  1. 创建脚本,定义上述三个变量。
  2. 使用 GUI 绘制两个 Button,分别控制“普通力”和“位置力”的逻辑代码。
  3. 将脚本挂载到 Camera 上,并给变量拖拽赋值,然后运行游戏查看效果。

3.4 运行结果分析

运行游戏后,刚体会受物理效应影响往下落:

  1. 当单击“普通力”按钮时,红色球体会因施加了向上的力而往天空弹起,但最终还是会下落。
  2. 当单击“位置力”按钮时,白色球体会朝着红色方块位置添加力,并最终移动到该位置。
  3. 当改变红色 cube 坐标后,目标位置也会随之移动。

3.5 方法区别及相关解释

手册上对这两个方法的解释如下:

  1. AddForce:添加一个力到刚体,作为结果刚体将开始移动。
  2. AddForceAtPosition:在 position 位置应用 force 力,作为结果将在这个物体上应用一个力矩和力。

关于力矩,手册中提到 AddTorque 函数:添加一个力矩到刚体,作为结果刚体将绕着 torque 轴旋转。手册中还有很多函数,有兴趣的读者可以自行测试。

四、碰撞与休眠

4.1 碰撞状态监听

刚体与物体之间存在碰撞,一旦刚体开始移动,就可以在系统方法中监听刚体的碰撞状态。碰撞分为三种:

  1. 进入碰撞
  2. 碰撞中
  3. 碰撞结束

4.2 碰撞器

游戏对象若要感应碰撞,必须添加碰撞器。默认情况下,创建游戏对象时会自动添加碰撞器。Unity 为对象提供了 6 种碰撞器:

  1. Box Collider(盒子碰撞器)
  2. Sphere Collider(球体碰撞器)
  3. Capsule Collider(胶囊碰撞器)
  4. Mesh Collider(网格碰撞器)
  5. Wheel Collider(车轮碰撞器)
  6. Terrain Collider(地形碰撞器)

4.3 物理材质

在碰撞器之间可以添加物理材质,用于设定物理碰撞后的效果。添加物理材质后,物体碰撞后会相互反弹,反弹力度由物理材质决定。

Unity 标准资源包中提供了一些物理材质的资源,我们可以将其导入到当前工程中。导入成功后,给之前的 Plane 添加弹性材质,运行游戏,会发现刚体在弹性材质的作用下会反弹。

4.4 碰撞检测

进行碰撞检测需要满足以下条件:

  1. 两个游戏对象必须有 Collider。
  2. 对于双方都要检测的物体,至少其中一个必须是刚体。
  3. 如果刚体是运动的,且双方都没有设置碰撞体的 Is Trigger 属性,双方可以通过 OnCollisionEnter 函数检测碰撞。
  4. 如果至少一个碰撞体的 Is Trigger 被设置,双方可以通过 OnTriggerEnter 检测碰撞。

本人刚接触 Unity3D 不久,以上是记录今天学习的知识,如有错误之处,请多多指教!手册可在网上下载获取。