[Unity] Unity2D 中的物理关节

来源:互联网 发布:金庸 知乎 编辑:程序博客网 时间:2024/04/29 23:51

本教程基于Unity5.0.2f1,所以推荐使用该版本的Unity来学习该教程。

接下来下载 2D_Joints_Starter。解压并在Unity中打开这个Demo。

初始的scene应该如下所示:
这里写图片描述

像很多游戏一样,这个场景中有多种带有物理组件的物体。然后这里面的所有物体都没有关节。通过这个教程,你会尝试使用每一个Unity 2D关节并看到他们是如何起作用的。

运行这个场景,你会看到一些物体因为重力的缘故立即掉落了。
这里写图片描述

注意:虽然场景中的标签是在固定位置,但物体的运动是基于Game view的尺寸的。为了最佳的效果,希望你把Game view设置为Free Aspect模式,然后手动调节Unity GUI的尺寸,直到物体和标签的位置和图上的差不多。

Distance Joint 2D

我们先来了解一下Distance Joint 2D,这个关节的目的很基础,也就是保持两个分离的物体一段固定的相对距离。你会使用场景左上方红色的正方形和蓝色的六边形来测试。

选中Hierachy中的Hexagon_Djoint,给他添加一个Distance Joint 2D组件,如下所示:
这里写图片描述

你可以看到,这个组件有一些你可供调节的参数来找到一个比较不错的游戏感觉。
这里写图片描述

看到这些参数不知道你害怕了没有,不用担心,你马上就会知道这些参数都是什么意思并能学会修改他们。

你会注意到一旦你给六边形添加了这个组件,就会有一条绿色的线连接这个六边形和屏幕的中心(原点(0,,0)。

这里写图片描述

运行这个场景并留意这个六边形。
这里写图片描述

你会看到这个六边形穿越了小半个屏幕到了屏幕中心的位置并开始左右晃动。这个左右晃动的动作就是这个关节引起的,这是怎么回事呢?你马上就会知道了。

重新看一下Inspector,Distance Joint2D的第一个参数是”Collide Connected”,这个参数定义了被关节连接的两个物体是否能彼此碰撞。在这个例子中,你不希望这个发生,所以就让他保持非勾选状态就行了(这里另外一个物体其实是空的)。
第二个参数是”Connected Rigidbody”,Distance Joint的一端始终保持与包含这个组件的对象的连接,你可以使用此字段为连接的另一端传递对象的引用(也就是说这个六边形会和这个字段对应引用的物体连在一起)。如果没有设置这个参数,Unity就会把另一端设为场景中的固定值(似乎是原点)。

如果你希望在这个例子中连接 Hexagon_Djoint 和 Square_Djoint,那么拖动 Square_Djoint 到 Connected Rigid Body 这个位置。
这里写图片描述

你现在应该能两个物体被关节连接起来了
这里写图片描述

下一个参数是 Anchor,中文叫锚点,表示了关节的终点附着在GameObject本地坐标系中的什么位置。在场景视图中,选中 Hexagon_Djoint, 你可以在上面的途中看到Hexagon_Djoint身上有一个没有被填满的蓝色圆圈, 这个就是锚点,它的值为默认的(0, 0)。

Connected Anchor参数阐明了关节的另一端的锚点的位置。如果Connected RigidBody为空,那么Connected Anchor的坐标系就是场景的根坐标系。当Connected RigidBody被设置后,Connected Anchor坐标系就变为connected rigidbody的本地坐标系。这个锚点可见上图中Square_joint中心的蓝色圆圈。你可以再一次地将这个值保留为初始的(0, 0)。

Distance Joint2D的第五个参数Distance也就是距离啦,表示两个物体之间的距离(其实是两个锚点之间的距离)。回到Scene视图,你可以看到两个物体之间的绿色线条,如下所示:

这里写图片描述

这个线段表示了关节强制要求的距离,当你运行这个场景的时候,这个关节会移动Hexagon_Djoint到这个小线段上。当你增加或者减少距离的时候,这个小线段会上下上下移动以匹配你配置的Distance参数。
这里写图片描述

实践出真理,把Distance设为2:
这里写图片描述

原文: https://www.raywenderlich.com/87370/physics-joints-in-unity-2d

最后一个参数是Max Distance Only,如果设置了这个参数,那么两个物体可以靠近,但是不能超出设定的距离。运行场景可以看到六边形往下掉了,但是掉了一下就不动了,因为已经达到最大距离了。
这里写图片描述

虽然关节很有用,但是如果不运动起来,就不能显现它们真正的威力。工程中提供了一些脚本能让你方便地拖动物体。在Hierarchy 中选中Square_Djoint,把Scripts目录下的Movement 脚本拖动到Inspector:
这里写图片描述

运行起来,拖动Square_Djoint,你会看到:
这里写图片描述

好像不错欸,不过在Game视图中是看不到关节信息的,所以不要对看不到那根绿色的线而感到惊慌。

当然,为了更好地看到这个效果,工程中提供了Line这个脚本,能让你在Game视图中也能看到关节连线。

这里写图片描述

这里写图片描述

运行起来你会看到:
这里写图片描述

不论你如何拖动,两个物体之间的距离都不会超过我们设定的距离(没勾选Max Distance Only的话距离是固定的,勾选了距离小于等于我们设定的值)。
这里写图片描述

Spring Joint 2D

Spring Joint2D,顾名思义,就是弹簧关节,模拟弹簧的效果。组件如下图:
这里写图片描述
一些参数已经在前面讲过了,就不再赘述,这里讲解一些其特有的 Damping Ratio和 Frequencty参数。

Damping Ratio 翻译成中文也就是阻尼系数的意思,学过物理的应该都知道这个是什么意思,可以认为阻尼系数越大,阻力就越大,弹簧的效果就越不明显,在这里这个值的范围是[0, 1]。

Frequencty 也就是震动的频率,这个应该不难理解。

让我们来看一下Spring Joint 2D 的效果:
这里写图片描述

Hinge Joint 2D

铰链关节,和之前两个不太一样,主要是为了让一个刚体围绕一个固定点旋转。当有力作用于刚体的时候,这个关节可以单独计算正确的旋转,而不需借助其他脚本。Hinge Joint 2D提供了一系列的参数, 通过调节这些参数,我们可以创建多种移动物体,例如门 、重力触发门,水车等。

在这个例子中, 当你在Square_Hjoint(其实是个长方形)上面放上一些重量的时候你会使其旋转。
选中 Square_Hjoint并给它添加Hinge Joint 2D组件:
这里写图片描述

这个组件相较而言比较复杂:
这里写图片描述

重复的参数就不讲了。
Connected Ridigbody 这个参数先置为空,让关节和空间中的点连接,要注意的是这次默认的连接点不再是场景中的(0, 0),而是当前这个物体所在位置。接下来设置 Connected Anchor的 X 和 Y 为 -3.5 和 -3.2。
这里写图片描述

Use Motor 是否使用马达,如果勾选了,那么这个关节就会有一个持续的力来转动这个关节来使其保持一个稳定的转速(仅当没有外力的时候是稳定的),当有外力作用时,速度会有增减。
Motor Speed 表示每秒转动的角度,马达会通过施加一个扭矩来尽量稳定这个速度。
Maximum Motor Force 也就是这个扭矩的最大值。这个值越大,铰链随马达转动就越稳定。
Use Limits 开启限制,将铰链的旋转角度限制在一个区间。

在这个例子中,你不希望这个平台旋转一周,所以开启Use Limits 并把Lower Angle 设为-245 ,把 Upper Angle 设为 0.5:

这里写图片描述

在Scene View中可以看到:
这里写图片描述

场景中的球会收到重力影响掉落,并且会在重生点重新生成:
这里写图片描述

运行这个场景,拖动一个球并将其在 Square_Hjoint 上方让其掉落,可以看到这个平台是怎么旋转的:
这里写图片描述

场景中的球被赋予了不同的重量,用场景中的其他球做试验,可以观察大一点的球是怎么提高转动速度的。选中Square_Hjoint , 在Inspector
中勾上Use Motor,接下来设置Motor Speed为500 ,并不使用Use Limits

运行这个游戏:
这里写图片描述

Slider Joint 2D

Slider joints 把物体的运动限制的一条直线上。在这个例子中,你会使用到上一部分创建的Hinge Joint来使另一个物体沿着一条线运动。
选中Hexagon_Sljoint 并拖一个 Slider Joint 2D 组件给它。
这里写图片描述
和Angle Limits 对应的是 Translation Limits, 只不过从角度变成了位移距离。
这里写图片描述

Connected Rigidbody继续为空, 设置 Connected Anchor 的 X 为 4.3, Y 为 -4.7:
这里写图片描述

你可以在Scene视图中看到这个关节描述的路径。
这里写图片描述

这里有个新的属性: Angle, 这个表示两个关节之间的角度。设置 Angle 为 -45. 你会注意到一个绿色的小线条, 这个就表示了这个Angle。
这里写图片描述
运行游戏之后两个关节之间的路径就会和小线段重合了。
这里写图片描述

如果你想让Hexagon_Sljoint在游戏启动的时候像右移动,那么把Angle设置回0。为了在运行时看到关节的路径,可以用之前提到的Line脚本。

运行游戏,把一些球扔在铰链平台,这个平台会旋转并击中Hexagon_Sljoint,Hexagon_Sljoint会沿着关节的路径滑动。这个六边形滑动的速度是由这个平台转动的速度决定的。

Wheel Joint 2D

看名字就知道,这个关节是为了模拟车轮而设计的,这也是我们这个教程中的最后一个关节。
给Square_WJoint增加一个Wheel Joint2D关节
这里写图片描述

这个组件的很多参数大家也都已经了解了,其中有一个不同的地方:这里我们不能不设置Connected Rigidbody,否则这个组件什么都不会做。
这里写图片描述

将RigidBody 连接到 Hexagon_WJoint:
这里写图片描述

Suspection 是wheel joints特有的,它包含了三个属性:Damping Ratio,Frequency 和Angle。前两个和Spring Joint相同,而Angle和Slider Joint2D中的Angle一样。

这三个参数一起描述了一个在车轮和锚定的车辆之间的弹簧并指向一个特定的方向。

运行游戏,把一个球放在靠近平台中心的Square_Wjoint上,你会看到这个平台往下运动了一下(有种脱离了的感觉)然后在旋转的同时弹回来了:
这里写图片描述

为了真实地感受一下Wheel Joint,创建一个新的场景,从Sprites文件夹拖一个正方形到场景中。设置Transform的位置为(-3.6, -7.72, 0),设置scale为 (14.43, 6.50, 1),给它添加一个Box Collider2D组件,设置size为X: 2.29, Y: 2.31,如下:
这里写图片描述

给它赋一个名字:Ground
这里写图片描述
创建一个空的GameObject,命名为Car, 设置位置为(6.4,1.13,0)
这里写图片描述.

从Sprite文件夹,拖Car这个sprite到Car GameObject。给它赋名字:Body,设置位置为 (0, 0, 0)。
这里写图片描述

从Sprite文件夹拖Wheel到Car GameObject,将他们定位到空到wheel,对两个轮子做同样的操作,并命名为 FrontWheel 和 BackWheel.

这里写图片描述

接下来,添加Rigidbody2D到Body, Front Wheel和BackWheel。然后添加Circle Collider2D 到 FrontWheel 和 BackWheel,添加Polygon Collider2D到Body。当你选择Car GameObject的时候,碰撞体看起来是这样的:
这里写图片描述

接下来在Inspector中选择Body,点Edit Collider:
这里写图片描述

编辑轮子周围的多边形碰撞体,让轮子和这个多边形碰撞体不会碰到。
这里写图片描述

选择Body,给它添加Wheel Joint2D。把Connected Rigidbody设为FrontWheel。Anchor设为(0.98,-0.78)。勾上Use Motor, 设置Motor Speed 为500。
这里写图片描述

让Body保持被选中状态,给它添加另一个Wheel Joint2D。把Connected Rigidbody设为BackWheel。Anchor设为(1.15,-0.84)。勾上Use Motor, 设置Motor Speed 为500。
这里写图片描述

哈哈,运行游戏,你会看到:
这里写图片描述

完整的工程在这里:https://koenig-media.raywenderlich.com/uploads/2015/05/2D_Joints_Complete.zip

翻译自:https://www.raywenderlich.com/87370/physics-joints-in-unity-2d

原创粉丝点击