Unity 物理引擎

Unity 物理引擎_第1张图片
Paste_Image.png

一、引言

物理引擎是一个很大的标题,在这里,我只记录一些我们较为常用的一些东西,其他的一些深入的东西,随着我们的开发,会慢慢接触到,也会学习到,并且其中一些根本的东西也都是一样的。

二、什么是物理引擎

物理引擎通过为刚性物体赋予真实的物理属性的方式来计算运动、旋转和碰撞反映。
简单地说,就像是什么是Unity引擎一样,Unity是制作游戏的一款引擎,而物理引擎则是用于制作物理效果的引擎,也可以说是一种通用的方法。

三、碰撞器(Collider)

1.什么是碰撞器

碰撞器,根据名字我们就可以猜到,有了碰撞器,游戏物体就可以产生碰撞。没错,碰撞器就是一个让游戏物体可以产生碰撞效果的组件,它描述了物体可被碰撞的边界,以及碰撞过程中相互影响效果。我们可以在需要产生碰撞效果的游戏物体中添加碰撞器,使其能够产生碰撞。


Unity 物理引擎_第2张图片
Paste_Image.png

2.分类

根据形状和效果分类:

  • 盒碰撞器(Box Collider)�:
  • 球碰撞器(Sphere Collider)�:
  • 胶囊碰撞器(Capsule Collider)�:
  • 车轮碰撞器(Wheel Collider):专用于车轮
  • 网格碰撞器(Mesh Collider)
  • 地形碰撞器(Terrain Collider)
  • 复合碰撞器(Compound Colliders)

根据性能消耗分类(从低到高):

  • Sphere Collider
  • Capsure Collider
  • Box Collider
  • Mesh Collider

3.碰撞器主要参数

Unity 物理引擎_第3张图片
Paste_Image.png

IsTrigger 是否作为触发器使用(勾选后则没有碰撞效果)
Material 使用的物理材质
Center 碰撞器的坐标
Size 碰撞器的大小
Edit Collider 手动调整碰撞器的大小

这里主要要说明的是IsTrigger,这个表示碰撞器碰撞是否为触发,,简单解释就是,碰撞了之后是否产生物理效果,如果勾选,则表现为触发,也就是不产生物理效果,关于物理效果的产生,我们在记录刚体的时候会进行记录。

4.物体发生碰撞的必要条件

  1. 碰撞双方必须具有碰撞器,且(IsTrigger 为false)
  2. 运动一方必须具有刚体或者角色控制器

5.处理碰撞和触发

学习了碰撞器,我们知道物理引擎中我们可以使用它来让游戏物体之间产生碰撞,那么我们要怎么才能自己处理碰撞呢,这里Unity给了我们几个回调函数;

  • 当碰撞发生时的回调函数
当进入碰撞
void OnCollisionEnter(Collision collision)
当逗留碰撞
void OnCollisionStay(Collision collision)
当退出碰撞
void OnCollisionExit(Collision collision)

Collision就是碰撞信息类,它可以获取到是谁撞了我
回调函数:就是你写的一个函数,放在那,不是由你写的程序去调用而是系统自动调用你
的函数,这就是回调函数,回调函数即然是让系统调用的,所以你就必须按系统给定的原
形来实现程序(简单了解下就好了)

  • 触发器触发时产生的回调函数
进入触发器
void OnTriggerEnter(Collider other)
当逗留触发器
void OnTriggerStay(Collider other);
退出触发器
void OnTriggerExit(Collider other);

Other就是碰撞到当前对象的游戏物体的碰撞器

四、刚体(Rigidbody)

1.什么是刚体

物理引擎通过为刚性物体赋予真实的物理属性的方式来计算运动、旋转和碰撞反映。这是百度给出的物理引擎解释,那么其中的刚性物体,在Unity中的体现就是刚体组件啦。

2.分类

  1. 普通刚体(影响自己也影响其他物体)
  2. 运动学刚体(Is Kinematic为 true, 自己不受物理引擎的驱动,但是会影响其他刚体)

3.主要参数

Unity 物理引擎_第4张图片
Paste_Image.png

Mass 质量
Drag 位移阻力
Angular Drag 角阻力
Use Gravity 是否受重力影响
Is Kinematic 是否为运动学刚体
Interpolate 平滑物理运行的插值类型(枚举)
Collision Detection 碰撞检测方式(枚举)
Constraits 冻结位置和旋转

4.如何使刚体运动

判断游戏物体是否产生位移,只要看他的Transform组件的position是否变化即可(注意:但游戏物体为子类时,要看其最上层父类对象的Transform组件的position),所以都可以强制改变其Transform.position来改变,但我们这里讲的是物理引擎,所以不记录该方法,只记录使用刚体组件的方法。

对于运动学刚体(Is Kinematic为True):
此类刚体不受物理引擎的印象,所以只能用刚体中的MovePosition(Vector3 v)来使其移动。

对于非运动学刚体:
我们可以给刚体添加力,使用AddForce方法,或者给其一个速度来使其位移,赋值给velocity属性。

这里记录的是改变物体position的方法,还有一些改变物体rotation的方法,在这里就不进行讲解了。

五、结束语

写了几篇博客,发现有些东西,写出来,理解更加深刻了,也让自己的学习和记忆更加深刻,以后要继续坚持, 为了成为一个大牛。文章写得比较粗糙,如有错误,欢迎指正,也欢迎各路英雄互相研究学习。

你可能感兴趣的:(Unity 物理引擎)