Unity FixedJoint

Unity

UnityにはJointという2つのRigidbodyを連結するコンポーネントがある。
これにはヒンジのような動きをするものやスプリングの動きを実現できるものなどいくつかあるのでが、今回はもっとも基本となる2つのオブジェクトを結合するFixedJointを学んでいこう。

プロジェクトの作成

いつものように一緒に手を動かしていこう。まずは新規3Dプロジェクトを作成してFixedJointExというプロジェクトを作成しよう。

○新規にCubeを作成し、PositionのYに5を入力してRigidbodyを付与する。
その際、Use Gravityはオフにし、isKinematicをオンにする。isKinematicをオンにすることでこのオブジェクトは外部の物理的影響を受けなくなる。

○同じようにもう一つCubeを作成する。Rigidbodyを付与し、今回の主役であるFixedJointコンポーネントを付与する。ConnectedBodyに最初に作成したCubeを登録しよう。

確認

これで2つのRigidbodyが連結された。実行して1つ目のCubeを左右に動かしてみよう。(実行し、TransformのPositionXの部分をマウスで左右にドラックする)

○FixedJointの働きによって2つのCubeが連動して動くことがわかる。

Why FixedJoint?

2つのオブジェクトを連動して動かしたい場合、まず最初に考えるべきは2つに親子関係を持たせることだ。それとこのFixedJointを用いた場合の何が違うのだろうか?

BreakForce

FixedJointを用いた結合はあくまでも力学的に結合されている、磁石を想像してもらえばいいだろう。なので設定によって結合力を設定できる。

実験

実験してみよう。まずはBreak Forceを10に設定しよう。

実行してみよう。現在この質量1の物体に働いている力は下向きの重力9.81なのでブレイクすることはない。実行しながらこのBreakForceを少しずつ下げていってみよう。

9.81を下回った習慣に結合がブレイクされFixedJointコンポーネントが消滅することがわかる。このように結合する力を設定できることがFixedJointを使う最大の利点だ。

Connected Body

これで基本はOKだが1点知っておかないといけないポイントがある。何と結合するかを決めるConnectedBodyという項目があるがこれをNoneにした場合にどうなるだろうか?やってみよう。Connected Bodyの一番右にあるマルポチを選択してNoneに設定し実行してみよう。

○実行してみると、Connected Bodyが設定されていないにも関わらず落下しないことがわかる。このようにJointはConnectBodyを設定しなかった場合、その場所に固定される。
下向きに9.81の力が働いているのは同様なので、実行しながらBreakForceを下げていくと先程と同様に落下する。
このConnected Bodyを設定しなかったときの挙動は盲点となるので気をつけてほしい。

応用

では少しゲームづくりに役立ちそうな動きを入れて知見を深めよう。

地面の追加

○新規Planeを作成する

○一旦Fixed Jointをリムーブする。実行してみよう、そのまま重力に従って落下するようになった。

○足場の作成
新規にCubeを作成し、以下のようにトランスフォームを設定する。

足場ができて落下しなくなった。

○上にあるCubeをPlayerにリネームしてトランスフォームを調整する

Playerスクリプトの作成

以下のようにPlayerスクリプトを作成し、Playerにアタッチする。

using UnityEngine;

public class Player : MonoBehaviour
{
    public GameObject block;
    bool isConnect;
    
    void Update()
    {
        //右に移動し続ける
        transform.Translate(Vector3.right * Time.deltaTime);
        //もしコネクトしていなくて、x座標が0まできたら
        if(!isConnect && transform.position.x >= 0f) {
            //blockにFixedJointを追加
            FixedJoint fj=block.AddComponent<FixedJoint>();
            //connectedBodyにPlayerのRigidbodyを設定
            fj.connectedBody = GetComponent<Rigidbody>();
            //breakForce設定
            fj.breakForce = 10f;
            //フラグ反転(処理を一回こっきりにしている)
            isConnect = true;
        }
    }
}

○くっつけたいCubeを登録する

○実行してみよう。原点まで来たらブロックが連結されることがわかる。

障害物の追加

○新規にCubeを作成して以下のようにトランスフォームを調整しよう。

○実行してみよう。衝突時に力が発生して結合が解除されることがわかる。

終わりに

いくつかあるJointの中で今回はもっとも基本となるFixedJointを学習した。物と物を固着させたいときの一つの手段として覚えておくとよいだろう。

Unity
スポンサーリンク
シェアする
mjpurinをフォローする
ジョイタスネット

コメント

タイトルとURLをコピーしました