【Unity 簡単解説】relativeVelocityとは?magnitudeとは?を解決する

relativeVelocityとは? magnitudeとは? メタバース

どうも、ナッツパパです(^^)/
本記事では、Unity内で使用するCollisionクラスの中のプロパティである【relativeVelocity】について解説していきます。

▼ちなみに、Collisionクラスについては下の記事で詳しく書いています。

ナッツパパ
ナッツパパ

数分で読める内容なので、気軽に見てください(^^)

早速、見ていきましょう♪

 

【relativeVelocity】とは?

速度メーターの画像

【relativeVelocity】は、ゲームオブジェクト同士が衝突した時に作成されるCollisionクラスに含まれるデータです。

ではどんなデータが入っているかというと、衝突した相手ゲームオブジェクトの相対速度が入っています。

相対速度・・・動く物体AとBがあって、どちらか一方の物体から見た、もう一方の物体の速度のこと

 

ナッツパパ
ナッツパパ

相対速度なんて言われてもピンとこない方は、相手ゲームオブジェクトの衝突勢いのことだと思って下さい!

 

void OnCollisionEnter(Collision collision)
 {
     Debug.Log(collision.relativeVelocity);
 }

このコードで、衝突相手ゲームオブジェクトの相対速度(勢い)がConsoleウィンドウで見られます。

▼実際のConsoleウィンドウ
(地面に落下する球体の勢い。【relativeVelocity】は、地面ゲームオブジェクトのスクリプトファイルに書いてあります)

consoleウィンドウでのrelativeVelocityの値

上画像の赤線のところを見て頂ければ、【relativeVelocity】の中身にどのようなデータが入っているかが分かると思います。
ちなみに、この()の中は、X軸・Y軸・Z軸の順番で値が並んでいます。

いわゆる、Vector3型のデータが入るようになっていますね。
球体の落下の勢いが、下(Y軸マイナス)に13.34となっています。

【relativeVelocity】について理解したところで、次は、具体的な使い方を見ていきましょう。

 

【relativeVelocity】の使い方

相手ゲームオブジェクトの衝突勢いを用いて、具体的に何が出来るでしょうか?

▼私が思いつく使い方を2つ挙げます。

・衝突勢いが基準値より大きければ、オブジェクトを削除する
・衝突勢いが基準値より大きければ、効果音をだす

使い方は、こんなところでしょうか。

そして、【relativeVelocity】には、Vector3型のデータが入っているわけですが、このデータのままでは、基準値と比較するのが難しいです。

ナッツパパ
ナッツパパ

例えば、衝突の勢いが『2』より大きければ、オブジェクトを削除する、というコードをif分で書きたい場合、Vector3型データのままでは、単純に比較が出来ません。

そこで、使われるのが【magnitude】です

 

【magnitude】とは

可愛いロケットの画像

【magnitude】とネットで検索すると、よくベクトルの長さを返すと表現されますが、初心者はそれを聞いてもあまりピンとこないんですよね。
ピンとくる方はいいのですが、よく分からないという方の為、具体的に解説していきます。

void OnCollisionEnter(Collision collision)
 {
     Debug.Log(collision.relativeVelocity.magnitude);

先ほどのコードの【relativeVelocity】の後に、【magnitude】を付け加えています。

▼上のコードの結果

consoleウィンドウ内のmagnitudeの値

【relativeVelocity】の中身を見た時と変わりましたね。
先ほどはVector3型データが入っていたのに対して、【magnitude】を付け加えるとシンプルな浮動小数点数(float型)になりました。
この値が、相手ゲームオブジェクトの衝突勢い(相対速度)を表してくれます。
ここでは、球体が地面に落下する勢い(Y軸方向マイナス値)を表しています。

ナッツパパ
ナッツパパ

これで、if文を用いた基準値との比較が出来るようになりました♪

ベクトルの長さを返すとは、こういうことです。

ちなみに【magnitude】は、Unity側が用意している【UnityEngine】オブジェクト内の【Vector3】クラスの中で定義されているプロパティ(変数)です。

 

【relativeVelocity】を用いた実際のコード

ここでは、衝突時の相手ゲームオブジェクトの勢いが基準値より大きければ、ゲームオブジェクトを削除するコードになります。

void OnCollisionEnter(Collision collision)
    {
        if(collision.relativeVelocity.magnitude > 2)
        {
            Destroy(gameObject);
        }
    }

ごくごくシンプルなコードを紹介してみました(^^)

 

参考資料

最後に参考資料を貼っておきます。

▼【relativeVelocity】について

▼【magnitude】について

▼【Vector3】クラス

本記事は、上記資料などを参考に、私なりに分かりやすく要約し、Unity学習中の皆様方に向けて作成した記事となります。
参考になれば幸いです(^^)