Unity 3D 官方教程—— 2D Physics系列 学习记录

1.2D Physics Overview

1.2D Physics游戏对象和3D Physics游戏对象可共存在一个场景,但是它们不能相互反应(interact with each other)。

2.2D Physics只在x和y轴上有反应,z轴怎样改变都是0.



3. 要设置Physic2D的各项参数见下:





需要注意的是Rigidbody2D的gravity是gravity scale,默认值在上面的图里设好,然后在rigidbody2D的设比例,比如1就是100%,0.1就是10%。



4.2D Physics有6种Collider,分别是Circle,Box,Edge,Polygon,Capsule,Composite。

前四种的作用如下:



2.Rigidbody 2D

1.只有加了rigidbody2d组件的sprite可以动,只有再添加collider2d的才可以与场景互动。

2.Mass为质量。质量小的推质量大的就比较难推(两个都有collider)。

3.Linear Drug就像空气阻力,移动时会慢慢停止。

4.Angular是角阻力,原地旋转会慢慢停止。

5.Gravity Scale已在上面解释,是重力比率。

6.Fixed Angle是该对象可移动,但不可旋转。(掉在一个斜面上就直直滚下去了,本身不会旋转)

7.Is Kinematic勾选时,该对象不受力的影响(包括重力等),可用脚本控制position和rotation的移动。比如有一个platform,我们勾选了kinematic,在脚本里控制移动它的transform,但因为该platform还是需要和其它对象互动,比如小球,那它就要有2d collider。

8.Interpolate移动平滑内插值,一般用于对象运动慢慢生涩/抖动(jerky),比如刹车?选择interpolate移动的顺滑程度取决于上一帧;选择extrapolate顺滑程度取决于下一帧(就像Adventure Game里Player的移动一样)。

9.Sleeping Mode睡眠状态,Start Asleep初始是睡眠的,会被其他碰撞(collisions)唤醒。Start Awake 初始是醒着的。Never Sleep尽量别选这个,对性能有影响。

10.Collision Detection碰撞检测,一般都选Continuous。

Discrete:将碰撞检测设置为离散时,如果物体移动速度足够快,则在物理更新期间,具有刚体2D和碰撞2D的GameObjects可以相互重叠或通过。 碰撞接触只在新的位置产生。

Continuous:当碰撞检测设置为连续时,具有刚体2D和碰撞2D的GameObjects在更新期间不会彼此通过。 相反,Unity计算任何Collider 2D的第一个影响点,并在那里移动GameObject。 请注意,这比离散占用更多的CPU时间。(如果没那么快的话可以选Discrete?)


3.Collider 2D

1.Edge Collider和Polygon Collider有点像,都是多边形检测。但Polygon的是封闭的,Edge用于表面是开口的。



2.是否勾选Is Trigger的区别:来源http://www.cnblogs.com/infly123/p/3920393.html


trigger被勾选时就是一个检测器,可以被穿过但会记下状态(比如Zoombunny的外圈spheir collider就是勾选了is trigger用来检测敌人进入攻击范围。内圈的capsule collider不勾选不让其他物体穿过)。


3.Material。用来调整发生碰撞时2D物体对象之间的碰撞和反弹。2D的Material和3D的很不一样,2D的拼写为Physics Material(有s)。Material都是内搭在系统里的,可以在Assets→Creat→Physics Material 2D选择。制作一个木球和一个冰平面所需要的材质就不一样,可以选择了之后拖入到Material框里。


4.给sprite添加collider后会根据sprite的边缘自动调整大小形状,如果不满意,可以拖动collider边缘线上的小绿点进行调整。(就像Survival Shooter里调整collider一样)


5.Edge和Polygon Collider可以摁住ctrl键点绿点(该段边缘线会变成红色)来取消修改边缘。


6.一个对象可以只有collider没有rigidbody(比如地形上的东西)。但要两者react必须最少一个有rigidbody。


4.Hinge Joint2D

好复杂,暂时用不到,先不学了。用在像弹簧,弹簧门开合,用绳子垂下来的东西的移动等。


5.Area Effector2D

组件Area Effector2D必须添加在同时有Collider2D的对象上。比如梦露经典的白裙子被吹起,那个吹气的地网区域在游戏里就可以用Area Effector2D来作为一个对其他对象施加力的区域。

比如下面这个金币被吹起的游戏,金币的组件为



吹风机的组件为


注意要使用Area Effector它的Collider组件必须勾选Used By Effector,如上图。同时Collider必须勾选is trigger让其他对象进入该区域以受力。同时受力对象也必须有Collider组件,如上图的金币。


组件设置:

Collider Mask:对哪个Mask产生作用。

Force Direction力的方向,比如上面是向右和向上(范围从0~359.99),逆时针方向,0为右,90为向上,and so on。注意这个方向是World Space的,即把挂这个组件的对象旋转成什么样,它的施力方向也是在这里设置好的。(教程里是这样说的,现在Unity好像已经改了,可以设置Local或World了)

Force Magnitude:施加的力量的大小。

Force Variation:施力的范围变化。会在For Magnitude的数值上随机一个力施加。比如Magnitude设置为100,Variation设置为20,则在100到120内随机添加一个力。如果Variation为负,比如-20,则是80到100内随机添加一个力。

Drag & Angular Drag:施加的阻力和角阻力的方向。(比如上面图的向上吹的区域,如果Augular Drag设为10,金币被吹起离开这个区域后会全部向右下落。如果为10则随机方向下落)。

Force Target:如果选rigidbody则是作用于整个物体,物体受力时不旋转。如果选collider则会一边移动一边旋转(见视频效果)。


6.Distance Joint2D

让组件所在的对象围绕着另一个对象(或一个点)做运动。比如一个点(在组件里设置位置)加一个球(拥有Distance Joint2D组件),则这个球就像钟摆一样绕着这个点运动。即使没有铰链和挂点的情况下。


7.Point Effector2D

点效应器施加在一个点上施加力影响一个范围。比如一个点爆炸把范围内的一堆金币炸开,比如一个黑洞把一定范围内的星体全部吸入等。和Area Effector的设置几乎一样,比如被反应对象也要有collider,自身collider要勾选两个选项等。

不同的是,一般Point Effector2D所在的对象都会挂上脚本,用SetActive true or false来控制Point Effector2D,比如摁下空格,就true,然后炸一次。

至于是炸开还是吸入则是For Magnitude的值是正还是负。(教程里的改变设置来实现各种效果很有趣,值得一看)/


8.Sliding & Bouncing in 2D

主要是讲Physics Material 2D比如bouncing(橡皮球的弹跳效果),sliding(冰面的滑动效果)。

Project下Creat选Physics Material 2D,然后在Assets文件夹里会新建一个材质,改名成自己想要的后调整参数。



设置好需要的值之后,就把该Material拖入到对象的Collider里的Material框里就可以了。


完毕。