第二十九章 Unity关节Joint

关节组件将刚体连接到另一个刚体或空间中的固定点。关节施加使刚体移动的力,而关节限制功能可以限制该移动。Unity 提供的以下关节可以对刚体组件施加不同的力和限制,从而使这些刚体具有不同的运动:

Hinge Joint铰链关节:使两个刚体像被连接在一个铰链上那样运动。用于模拟门和手指关节。

Fixed Joint固定关节:将两个刚体束缚在一起, 相对位置保持不变。

Spring Joint弹簧关节:将两个刚体连接在一起,使其像连接着弹簧那样运动。

Character Joint角色关节:模拟球窝关节,例如臀部或肩膀。

Configurable Joint可配置关节:模拟任何骨骼关节,例如布娃娃中的关节。

接下来创建一个新的场景“SampleScene4.unity”,然后创建一个球体Sphere

接下来,我们为Sphere添加一个“Hinge Joint”类型的关节。在导航菜单栏中选择“Component”->“Physics”,然后从中选择“Hinge Joint”组件。添加该组件前必须先添加碰撞体和刚体两个组件。我们创建Sphere的时候自动为其添加碰撞体,然后添加“Hinge Joint”组件的时候,Unity自动为我们添加刚体组件。为了不让重力影响Sphere,我们取消了刚体组件的“Use Gravity”属性。然后,我们点击Sphere游戏对象,查看其Inspector检视视图:

在组件“Hinge Joint”中,我们能够看到“Connected Body”(连接刚体),“Anchor”(锚点)和“Axis”(轴向)三个属性。其中锚点和轴向都是游戏物体的局部坐标系,而“连接刚体”则需要我们添加另一个附带刚体的游戏对象。如下所示:

我们在Sphere的正上方添加了一个Cube,该Cube添加了刚体组件。为了不让重力影响Cube,我们取消了刚体组件的“Use Gravity”属性。如下所示:

接下来,我们点击选中Sphere游戏对象,然后从Hierarchy层次面板中拖动Cube到Sphere游戏对象的“Hinge Joint”组件下的“Connected Body”后面的输入框中,如下所示:

接下来我们在给Sphere施加一个X轴方向的力,如下所示:

然后,我们来Play运行整个工程,

运行的效果可以看到了,当黄球Sphere向右移动的时候,红色Cube被牵引着一起移动。仿佛两者之间有一条“连接线”似的。

使用“Hinge Joint”铰链关节比较经典的一个案例就是门的打开和关闭的效果。

首先,我们创建一个新的场景“SampleScene5.unity”,然后我们添加一个平面Plane作为地面,然后添加一个Cube,让其变成一个“门轴”,然后再添加一个Cube(1),让其变成一个“门扇”。门轴和门扇都添加刚体,最后给门扇添加一个“Hinge Joint”铰链关节。

首先添加一个门轴Cube,并且添加刚体组件,如下所示:

然后添加门扇Cube(1),也添加刚体组件,如下所示:

 

接下来,我们给门扇Cube(1) 添加“Hinge Joint”组件。我们现在要做的就是让黄色的“门扇”能够围绕紫色的“门轴”转动,从而产生开门的效果。也就是说,我们给门扇一个力的时候,门扇需要围绕门轴转动,门轴则固定不动。因此,对于门轴而言,它的刚体组件需要勾选“Is Kinematic”属性(不能受刚体控制而移动或旋转)。如下所示:

然后我们还需要给门扇的刚体组件一个阻力,不能让门扇遇到碰撞后,不停的旋转,如下:

接下来就是门扇的“Hinge Joint”铰链关节属性,如下所示:

首先,我们需要将门轴拖动到“Connected Body”位置,然后修改Anchor锚点和Axis轴向两个参数。要控制门的旋转主要改变铰链关节组件的Anchor和Axis两个属性。请注意,游戏物体门扇是围绕锚点沿轴向方向移动或旋转的。因此,我们的锚点应该门扇靠近门轴的边缘位置,而轴向的话应该是Y轴垂直方向。点击“Edit Angular Limits”如下所示:

 

上图显示了我们的锚点就位于门轴位置,且轴向就是Y轴向上。那么,当我们给门一个力的时候,门就会围绕门轴移动旋转了。这里我们添加一个胶囊体Capsule游戏对象,

然后添加刚体组件,并勾选“Is Kinematic”属性,

接下来,我们创建“MoveScript.cs”脚本,使用代码来控制胶囊体Capsule移动,代码如下:

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class MoveScript : MonoBehaviour
{
    // Update is called once per frame
    void Update()
    {
        if (Input.GetKeyDown(KeyCode.W)) transform.Translate(transform.forward);
    }
}

接下来,我们将脚本附加Capsule胶囊体上,然后Play运行整个工程,如下所示:

当我们移动绿色的胶囊体向前移动的时候,它会碰撞到门,门会向前移动,但是由于铰链关节的影响,它只能沿着门轴旋转,也就是开门的效果了。

本课程涉及的内容已经共享到百度网盘:https://pan.baidu.com/s/1e1jClK3MnN66GlxBmqoJWA?pwd=b2id

猜你喜欢

转载自blog.csdn.net/konkon2012/article/details/130479899