【Unity】RigidbodyのKinematicとは?物理演算の影響を受けない仕組み

RigidbodyのKinematicとは? Unity

こんにちは、ともくんのゲーム作り部屋にようこそ!

このページでは、

「RigidbodyにあるKinematicってどんな設定なの?」

「Kinematicはどういうときに使うの?」

というお悩みの方に向けた内容となっています。

Unityでは、オブジェクトに物理演算の仕組みを使う場合、Rigidbodyコンポーネントを付けます。

このRigidbodyの中にあるKinematic(キネマティック)という設定は、物理演算の影響を与えないようにするための設定となっています。

Kinematicをオンにすることで、力や重力などの影響は受けなくなりますが、スクリプトから直接移動処理を行ったり、相手のオブジェクトに衝突して力を与えるということができるようになります。

そこでこのページでは、UnityのRigidbodyコンポーネントにあるKinematicという設定について、どんな仕組みなのか、使い方や設定方法までをまとめていきます。

この記事を書いた人

ゲーム作りを学び始めた一児のパパです。
このブログは、子供から「ゲームを作ってみたい!」と言われ、非プログラマーでゲーム作りをしたことない僕が、ゲーム作りの本を読んで独学でゲーム開発を学んでいるブログです。
同じように初めてゲーム作りをしている方と一緒に学んでいけるようなブログに出来たらいいなと思っています。
また、「このコードはおかしい」とか「もっと良い書き方があるよ!」などあれば、どんどん指摘して頂けると助かります。

Kinematic(キネマティック)とは?

まずは、Kinematic(キネマティック)がどういう設定なのかを紹介していきます。

物理演算の影響の有無を決める設定

Kinematic(キネマティック)とは、Rigidbodyによる物理演算の影響の有無を決める設定で、Kinematicをオンにすると物理演算の影響を受けなくなります。

もう少し詳しく説明すると、まずオブジェクトに紐づけることができるRigidbodyコンポーネントとは、そのオブジェクトに対して物理挙動を加えることができる役割を担っています。

例えば、Rigidbodyを付けたオブジェクトは、重力により落下したり、オブジェクトを動かすためにAddForceメソッドなどでを加える必要があります。

しかし、RigidbodyにあるKinematicの設定をオンにすると、これらの物理演算の影響を受けなくなるので、重力や力を加えてもオブジェクトが動かなくなります。

実際に、同じ球形のオブジェクトを配置して、赤色のKinematicをオフ、青色のKinematicをオンでそれぞれにオブジェクトを衝突させてみると、

Kinematicをオンにしたオブジェクトは、力を加えても動いていないのが分かります。

これは、Kinematicをオンにすると物理演算の影響を受けない、つまり力を加えても何も起きないオブジェクトになっています。

スクリプトから移動処理を行う

Kinematicをオンにしたオブジェクトは、力の影響を受けないことになるので、オブジェクトを動かす場合は、直接スクリプトから移動処理を記述する必要があります。

例えば、Transformコンポーネントで定義されているTranslateメソッドやposition変数、またはRigidbodyコンポーネントで定義されているMovePositionメソッドを使って、座標に対しての移動処理を書くことで、Kinematicをオンにしたオブジェクトを動かすことができます。

通常、Rigidbodyを付けたオブジェクトの座標を直接移動することは、物理演算の処理が上手く行われなくなるため使いません。

しかし、Kinematicがオンのオブジェクトは、物理演算の処理自体行われないため、移動させる場合は座標を指定することが可能です。

これにより、力を加えて移動処理を行うのが難しいオブジェクトなどで、Kinematicの設定が便利に使えます。

なお、Rigidbodyのオブジェクトの座標による移動では、MovePositionというメソッドもつかわれ

他のオブジェクトに衝突できる

そもそも物理演算をオブジェクトに適用したくてRigidbodyを付けているのに、なぜKinematicをオンにする必要があるのでしょうか?

それはKinematicをオンにすることで、自身は物理演算の影響を受けないけど、衝突した他のオブジェクトに対しては、力を加える(与える)ことができるという特徴があります。

例えば、青の四角いオブジェクトのKinematicをオン、赤の丸いオブジェクトのKinematicをオフにして、スペースキーを押すと四角いオブジェクトがTranslateメソッドによって横に移動して、丸いオブジェクトに衝突するようにしてみます。

using UnityEngine;

public class Test : MonoBehaviour
{
    void Update()
    {
        if (Input.GetKey(KeyCode.Space))
        {
            transform.Translate(0.01f, 0, 0);
        }
    }
}

衝突すると、丸いオブジェクトは物理演算の影響で力が加わり移動しますが、四角いオブジェクトは衝突しても力を受けることがありません。

そのため、Kinematicをオンにすることで、スクリプトから移動処理を加えて、それに衝突した他のオブジェクトのKinematicがオフなら、力を与えるという役割のオブジェクトを作れます。

Kinematic(キネマティック)の設定方法

Kinematicのオンオフで物理演算の影響の有無を決めることが分かりましたが、ここからはKinematicの設定方法についてまとめていきます。

3D:Rigidbodyの場合

まずは、3Dゲームで使う「Rigidbody」コンポーネントでの設定を紹介します。

インスペクターウィンドウから設定

インスペクターウィンドウのRigidbodyコンポーネントの項目にある「Is Kinematic」から行うことができます。

この「Is Kinematic」にチェックを入れると、物理演算の影響を受けなくなり、チェックが入っていないと物理演算の影響を受けるようになります。

デフォルトでは、「Is Kinematic」にチェックが入っているので、Rigidbodyを付けるだけで物理演算の影響を受けるようになります。

スクリプトから設定

スクリプトから設定する場合は、Rigidbodyコンポーネントを取得した後に、isKinematicの変数を使って変更することができます。

isKinematicはbool型の変数になるので、truefalseで値を指定して変更することができます。

例えば、マウスをクリックしたらKinematicをオンにするとした場合、

using UnityEngine;

public class Test : MonoBehaviour
{
    Rigidbody rb;

    void Start()
    {
        rb = GetComponent<Rigidbody>();
    }
    void Update()
    {
        if (Input.GetMouseButtonDown(0))
        {
            rb.isKinematic = true;  // IsKinematicをオンにする
        }
    }
}

15行目でisKinematicの変数を「true」に変えてあげることで、途中でKinematicの設定を変更することができます。

2D:Rigidbody2Dの場合

次に、2Dゲームで使う「Rigidbody2D」コンポーネントでの設定を紹介します。

インスペクターウィンドウから設定

インスペクターウィンドウのRigidbody2Dコンポーネントの項目にある「Body Type」から行うことができます。

このBody Typeの項目を「Kinematic」にすることで、物理演算の影響を受けなくなります。

なお、Body Typeには以下の3つの種類があり、

デフォルトは物理演算の影響を受ける「Dynamic」で、「Static」は移動しない固定化するオブジェクト(床や壁)などで使います。

スクリプトから設定

スクリプトから設定する場合は、Rigidbody2Dコンポーネントを取得した後に、bodyTypeの変数を使って変更することができます。

例えば、マウスをクリックすると、Body Typeを「Kinematic」に変更する場合は、

using UnityEngine;

public class Test : MonoBehaviour
{
    Rigidbody2D rb;

    void Start()
    {
        rb = GetComponent<Rigidbody2D>();
    }

    void Update()
    {
        if (Input.GetMouseButtonDown(0))
        {
            rb.bodyType = RigidbodyType2D.Kinematic;    // BodyTypeをKinematicに変更する
        }
    }
}

16行目で「RigidbodyType2D.Kinematic」と設定してあげることで、Body Typeを「Kinematic」に変更することができます。

まとめ

このページでは、Unityで物理演算を付けるためのRigidbodyコンポーネントにあるKinematicの設定について、どういうものなのか、使い方や設定方法までをまとめていきましたが、いかがでしたでしょうか?

Kinematicは、Rigidbodyによる物理演算の影響を受けなくする設定で、重力や力を加えても動かなくなる設定です。

Kinematicにすることで、オブジェクトの移動はTransformコンポーネントを使って制御することができ、また衝突したオブジェクトに対しては力を与えることができます。

そのため、ゲーム内において力を加えると表現するのが難しい仕組みなどにおいて、Kinematicが非常に便利に使えます。

最後までお読みいただきまして、ありがとうございました!

コメント