早期的游戏并没有强调物理引擎的应用,当时无论是哪一种游戏,都是用极为简单的计算方式做出相应的运算就算完成物理表现,如超级玛丽和音速小子等游戏。
较为常见的物理处理是在跳跃之后再次落到地上,并没有特别注重物理表现效果。
当游戏进入三维时代后,物理表现效果的技术演变开始加速,三维呈现方式拓宽了游戏的种类与可能性,越来越好的物理表现效果需求在短时间内大幅提升。
如何制作出逼真的物理互动效果,而又不需要花费大量时间去撰写物理公式,是物理引擎重点要解决的问题。
在 Unity 3D 内的 Physics Engine
引擎设计中,使用硬件加速的物理处理器 PhysX
专门负责物理方面的运算。
因此,Unity 3D 的物理引擎速度较快,还可以减轻 CPU 的负担,现在很多游戏及开发引擎都选择 Physics Engine
来处理物理部分。
在 Unity 3D 中,物理引擎是游戏设计中最为重要的步骤,主要包含刚体、碰撞、物理材质以及关节运动等。
游戏中物理引擎的作用是模拟当有外力作用到对象上时对象间的相互影响,比如赛车游戏中,驾驶员驾驶赛车和墙体发生碰撞,进而出现被反弹的效果。
Unity 3D 物理材质是指物体表面材质,用于调整碰撞之后的物理效果。
Unity 3D 提供了一些物理材质资源,通过资源添加方法可以添加到当前项目中。
标准资源包提供了 5 种物理材质:
基础操作
Assets
→ Create
→ Physics Material
便可将物理材质应用在需要的地方。参考列表
选项 | 含义 | 描述 |
---|---|---|
Dynamic Friction |
动态摩擦力 | 当物体移动时的摩擦力,通常为 0〜1,值为 0 时效果像冰, 而值为 1 时物体运动将很快停止。 |
Static Friction |
静态摩擦力 | 当物体在表面静止时的摩檫力,通常为 0〜1。值为 0 时效 果像冰,值为 1 时使物体移动十分困难。 |
Bounciness |
弹力 | 值为 0 时不发生反弹,值为 1 时反弹不损耗任何能量。 |
Friction Combine Mode |
摩擦力组合方式 | 定义两个碰撞物体的摩擦力如何相互作用。 |
Bounce Combine |
反弹组合 | 定义两个相互碰撞的物体的相互反弹模式。 |
Friction Direction 2 |
摩擦力方向 2 | 方向分为 x 轴 、y 轴 、z 轴 。 |
Dynamic Friction 2 |
动态摩擦力 2 | 动摩擦系数,它的摩擦方向根据 Friction Direction 2 确定。 |
Static Friction 2 |
静态摩擦力 2 | 静摩擦系数,它的摩擦方向根据 Friction Direction 2 确定。 |
力是在物体之间的相互作用过程中表现出来的,在物理学中力是非常重要的元素。
力的种类有很多,刚体组件因为受到力的作用而进行加速或抛物线运动。
Unity 3D 中通过 rigidbody.AddForce(x,y,z)方法
添加力的作用,该方法的参数:
游戏中物体受力是对现实现象的模拟。
本案例通过对小球施加力的作用产生与发生盒子碰撞的效果:
在 Unity 3D 内创建一个简单的 3D 场景,场景内放有 1 个 Sphere
,1 个 Plane
和 3 个 Cube
。
Plane
用于充当地面,Sphere
和 Cube
用于做力的测试。
在初始场景中 Cube
处于静止状态,通过 Sphere
瞬间施加一个力,使 Cube
运动。
实施步骤
执行 GameObject
→ 3D Object
→ Plane
命令,此时在 Scene 视图中出现了一个平面,在右侧的 Inspector 面板中设置平面位置(0,0,-5)。
执行菜单栏中的 GameObject
→ 3D Object
→ Cube
命令,创建 3 个立方体盒子,在右侧的 Inspector 面板中分别设置 3 个立方体盒子的位置(0,0.5,-5),(0.5,1.5,-5)(0.5,2.5,-5)。
执行菜单栏中的 GameObject
→ 3D Object
→ Sphere
命令,在 Inspector 面板中设置球体位置属性(-1,0.5,-7)。
为球体、立方体及地面贴材质。
Component
→ Physics
→ Rigidbody
命令。为球体和立方体添加刚体属性。
var addForceObj:GameObject;
function Start(){
addForceObj=GameObject.Find("Sphere");
}
function OnGUI(){
if(GUILayout.Button("force", GUILayout.Height(50))) addForceObj.rigidbody.AddForce(500, 0, 1000);
}
小球会受到力的作用向前运动,并与立方体发生碰撞。