您的位置:首页 > 移动开发 > Unity3D

Unity基础知识 - Know These Before 2D Creation(二) - 物理引擎简述

2018-11-27 16:50 387 查看
版权声明: https://blog.csdn.net/Ha1f_Awake/article/details/84568623

主要内容

2D物理引擎概述

2D刚体组件

2D碰撞体组件

2D铰链关节组件

2D距离关节组件

2D弹簧关节组件

2D区域效果器

2D点效果器

 

2D Physics Overview

2D物理引擎概述

1)Unity有两套物理引擎,一套是3D,一套是2D。这两套系统由完全不同的组件来执行,它们有可比性(Comparable),但是并不兼容(Compatible)(有的说可兼容,可能理解不同吧)。3D物理和2D物理能存在于同一场景中,但彼此之间不会交互。2D物理引擎中所有物体的交互都发生在z轴坐标为0的平面上。

 

2)2D物理引擎有一些项目级别的设置,通过Edit/Project Settings/Physics 2D打开。设置中的参数包括重力的方向和大小、默认材质、层间碰撞矩阵等等。*(应该是要另外找了)

 

3)2D物理引擎中一个重要的组件叫作rigidbody 2D,对游戏对象添加这个组件可以使它处在2D物理引擎的控制当中。rigidbody 2D组件与碰撞体组件一起进行碰撞检测能接受力和力矩,处理各种类型的关节及其他特殊类型的2D物理行为。

rigidbody 2D组件显示了其所在游戏对象的物理属性,其中包括质量、线性阻力、角阻力、重力比例及其他属性。

如果给对象添加碰撞体(collider)组件,它就可以参与物理碰撞和触发器事件。

 

4)一个对象添加rigidbody 2D组件,可以使用一些joint 2D(2D关节类型)组件,进而参与更复杂的物理行为,比如(铰链)链接、弹簧、滑动、连接(配对)。2D关节组件允许游戏对象以场景内某个点或某个游戏对象为锚点,并对此锚点做出物理反应。

 

5)碰撞体组件的材质有两个参数可以控制摩擦系数(friction)和弹性系数(bounce)。

 

Rigidbody 2D

2D刚体组件

1)2D刚体组件允许游戏对象在2D物理引擎的影响下发生运动,游戏必须同时拥有一个2D碰撞体组件时才能与场景中的其他对象发生交互

 

2)质量、线性阻力、角阻力、重力比例这个几个属性应该不用解释了吧。质量越大,惯性越大,重力比例越小,受重力影响越小。

 

3)Fixed Angle:选中后物体会受重力影响,但不会因为运动发生旋转或滚动。

 

4)Is Kinematic(运动学):选中后物体会被认为是运动学刚体,不受重力或碰撞的影响,保持由脚本动画控制的运动。如果运动学刚体需要和其他物体发生交互,就要添加碰撞体组件。

 

5)Interpolate(插入)平滑游戏对象的运动。当游戏对象在运动时发生抖动时,可以使用Interpolate属性来帮助平滑它的变换运动。设置为Interpolate会根据上一帧所在位置进行平滑;而设置为Extrapolate则会根据下一帧的预测位置进行平滑。

 

6)Sleeping Mode:控制刚体如何休眠来节约处理时间。

 

7)Collision Detection:控制rigidbody 2D的碰撞检测机制。设置为Discrete(离散类型)时,只有游戏对象的碰撞体,在一个物理更新时与其他碰撞体接触,才会产生效果;Continuous(连续类型)适用于快速移动的物体,当游戏对象在两个物理更新之间可能发生碰撞的时候,就会产生碰撞事件。

 

Collider 2D

2D碰撞体组件

1)要在场景中拥有物理实体,一个游戏对象必须使用碰撞体组件来定义它的外形,同时与相关的物理引擎交互。

对于所有参与2D物理交互的,并且静态的物体,可以只添加2D碰撞体组件而不添加2D刚体组件(其实这个可以勾选Is Kinematic来处理)。而对于动态的物体,两个组件都需要添加。

 

含有Collider和RigidBody的GameObject, Unity视之为Dynamic(动态的)

只含有Collider的GameObject, Unity视之为Static(静态的)

 

如果Static的物体发生位移上的变化,Unity每一帧都会去重新缓存Static物体的Collider状态,这会消耗资源

 

所以只含有Collider的物体,就不要让他发生位置上的移动。或者给它加一个RigidBody的组件,把Gravity去掉,并且把IsKineMatic勾选上(该选项使得该物体不会因为其他物体的影响而发生物理上的改变)。

 

2)2D碰撞体有四种:圆形碰撞体(circle)、方形碰撞体(box)、多边形碰撞体(polygon)和边缘碰撞体(edge)。这些碰撞器都继承于同一个通用基础的2D碰撞体,但每一种碰撞体都为一种特定的形状进行了优化。

 

3)多边形碰撞体和边缘碰撞体很相似,它们都由一组点或顶点,以及点之间的连线组成。不同的是多边形碰撞体是闭合的,而边缘碰撞体是开放的

多边形碰撞体适用于形状复杂的对象。

边缘碰撞体适用于创造单个固定表面

 

4)所用碰撞体都有两个相同的参数暴露在Inspector窗口:Is Trigger(是否为触发器)和Material(材质)。其余独有的参数用来定义特定的碰撞体形状。

 

5)Is Trigger将碰撞体设置为触发器碰撞体。在一般的2D物理碰撞中,物理引擎会阻止碰撞体相互穿透,然而触发器碰撞体并不参与这种碰撞,而且会发出触发器信息,而不是碰撞信息。

 

6)Material是对2D碰撞体所用2D物理材质的引用。在Assets窗口中右击,Creat Physics Material 2D即可新建2D物理材质。物理材质中有两个参数——摩擦系数(friction)弹性系数(bounciness)

 

7)在场景内编辑碰撞体的形状:

  1. 按住Shift键,碰撞体Gizmo会显示出一些操作点,可以拖动操作点来改变碰撞体的形状。
  2. 对于多边形碰撞体和边缘碰撞体,将鼠标放到边上可以生成新的操作点。按住Ctrl键时可以删除碰撞体上不需要的点或顶点。

 

Hinge Joint 2D

2D铰链关节组件

1)hinge joint 2D使物体能够围绕场景中的某个点发生特殊的物理行为。这个点可以是空白场景中的一个点,也可以是添加了刚体组件的游戏对象。这个点由Connected Rigid Body和另外两个锚点参数决定。

 

2)当链接到世界范围或场景中的某个点时,Connected Rigid Body的位置留空,效果如(av3246302相应集数 00:57)。

当链接到某个游戏对象时,Anchor设置携带运动对象运动的点(力的作用点),Connected Anchor设置运动对象运动的参照点(轴心)。

 

3)Collide Connected决定了游戏对象是否忽略与被链接对象之间的碰撞。从现实角度来讲,这个属性一般需要勾选。

 

4)Use MotorUse Limitshinge joint 2D的独有参数。

hinge joint 2D可以由一个马达驱动,马达的作用由Use Motor决定。Motor Speed是马达要达到的目标速度,单位是rad/s。Maximum Motor Force是马达为达到目标速度可以施加的最大力矩。

hinge joint 2D的作用效果受Use Limits的影响。Lower Angle代表旋转的最小角度,Upper Angle代表旋转的最大角度。

巧妙搭配Use Motor和Use Limits可以实现有趣的物理效果,例如暗门。(av3246302相应集数 03:59)

链条的设计可以参照这集的最后部分。

 

Distance Joint 2D

2D距离关节组件

1)distance joint 2D可以对两个游戏对象间的距离添加一个强制的限制,而不是利用一个平缓的力来维持指定的距离。

 

2)Distance代表两个对象之间需要利用关节保持的距离,Max Distance Only表示只保持最大距离。但是“只保持”的概念与“固定”不一样,如果不勾选Max Distance Only,两个对象间将以固定的距离作相对圆周运动。如果勾选Max Distance Only,当对象间的距离发生变化时,Unity会有一个作用力使它们一直运动直到达到Distance指定的距离。

 

Spring Joint 2D

2D弹簧关节组件

1)在受弹簧影响的物体上添加Spring Joint 2D。

 

2)Distance代表弹簧的长度,Frequency代表弹簧的强度值,强度值越高,弹簧恢复的速度越快。

 

3)Damping Ratio代表抑制弹簧反应的数值,取值范围是0到1。数值越高,弹簧对游戏对象的作用越小。

 

Area Effector 2D

2D区域效果器

1)在Unity里,可以利用Area Effector 2D对某个区域内的2D对象添加物理作用力

 

2)在给对象添加Area Effector 2D前,对象必须要有2D碰撞体组件,而且碰撞体组件的属性里,Is Trigger(是否为触发器)Used by Effector(受效果器使用)必须勾选

如果Is Trigger不勾选,作用力只在目标碰撞体与作用源(区域效果器)接触时生效,即对象无法进入区域效果器范围。

 

3)Collider Mask允许用户包括或排除受效果器作用力影响的层(layer)。

 

4)Force Direction代表作用力的方向,角度范围是0度到359.99度,角度符合直角坐标系的标准。当设置的数值为负数时,角度以顺时针旋转。

 

5)Force Magnitude代表作用力的大小。

 

6)Force Variation允许用户增加或减少一个随机的量,范围是0到指定数值。(这个概念还不是很清晰,下次做项目的时候再测试一下)

 

7)Drag和Angular Drag分别控制区域效果器内的线性阻力和角阻力。这些阻力会叠加在已经在对象刚体上设置过的阻力上。

 

8)Force Target表示作用力的作用对象。如果作用对象设置为Rigidbody,作用力会施加在刚体质量的中心上,因此不会引起物体的旋转。只有当作用对象设置为Collider,本应在力的作用下旋转的物体才会旋转起来,这时候调节Angular Drag才有意义

 

Point Effector 2D

2D点效果器

1)point effector 2D也可以对区域内的2D对象添加物理作用力。它与area effector 2D不同的是,area effector 2D适用于推进气流或传送带之类的场景,而point effector 2D适用于炸弹或黑洞之类的场景。

 

2)当Force Magnitude设置为正数时,效果与炸弹爆炸类似。而设置为负数时,效果与黑洞吸引类似。

 

3)Force Source设置为Collider时允许用户通过改变碰撞体组件中offset的值来改变物体被吸引的中心点位置。设置为Rigidbody时,吸引中心点固定在刚体中心。

 

4)Force Mode有三种设置:

  1. Constant:作用力为恒力。
  2. Inverse Linear:作用力大小基于作用源与作用对象的距离,距离越近,作用力越大。
  3. Inverse Squared:作用效果与Inverse Linear相似,只不过是基于距离的开平方。

 

5)Distance Scale可以改变距离的显示比例,数值越高,实际的作用距离越远。

 

路过的圈毛君:“这篇讲的都是最基本的Unity物理引擎的知识,以后还会有更丰富的内容补充哦~(又挖一个坑???)”

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: