しんともブログに名前を戻しました!

【Unity】車がリング(オブジェクト)を通ったか判定する

今回は、カーレースゲームを題材にして、「車がリングを通ったか判定」するシステムを作成します。

当たり判定」と聞くと、何かと何かが衝突するイメージが湧くかと思いますが、すり抜けるものを検知するということも「当たり判定」で実現できます。

カーレースだけでなく、オブジェクトの当たり判定を使うという意味では、ある場所に行ったら発生するイベントの制御や、コインやアイテムの取得判定にも応用できるシステムですね。

今回使用させていただいているAsset

参考 POLYGON-Starter Packunity Asset Store

それでは、やっていきます!

車とリングの当たり判定を実現する

実は、車とリングの当たり判定自体はそんなに難しくありません。(といっても僕自身調べながら実装しましたが、、)

車とリングの設置

まず、車とリングを設置します。

当たり判定が実装できればいいので、1つずつ適当に置きます。

Colliderの設定

車とリングの両方にcolliderというコンポーネントを設定します。

俗にいう「当たり判定」に必要なコンポーネントです。

(Colliderについてより詳しく知りたい方はこちら

今回使用しているアセットには嬉しいことにMesh Colliderが含まれているようなので、車にはMesh Colliderを、リングにはBox Colliderを適用して当たり判定を実現します。

(追記:後でわかったのですが、車にMesh Colliderをつけると、ガタガタする場合があるので、Box Colliderと両方もしくはBox Colliderのみを設定することをお勧めします。)

新しくcolliderをつけるには、Inspector > Add Component から、colliderと検索して、Box ColliderまたはMesh Colliderを選びます。

リングにBox Colliderを適用するのは、リングの間を通ったか判定できるようにするためです。

リングにBox Colliderが適用されると、こんな感じに緑色の立体に囲まれている様子が確認できると思います。

リングのBox ColliderのIs Triggerをオンに

リングが持つBox Colliderとの当たり判定のために、リングのBox Colliderにある、Is Triggerにチェックマークを入れます。

さらに、車のMesh ColliderのConvexにもチェックマークをつけることで、当たり判定を実現します。→リングそのものとの当たり判定ができます!

これで、当たり判定に必要な準備はおしまいです。

Rigid Bodyの設定も忘れない

これについては、下記の記事を参照するまで気づくことができなかったのですが、当たり判定をOnTriggerを用いて実現したい場合、どちらかのオブジェクトにRigit Bodyが適用されていないといけないようです。

参考 OnTriggerを利用した当たり判定を理解しよう!XR-HUB
注意
OnTriggerで当たり判定を実現したい場合、どちらかのオブジェクトにRigid Bodyを設定する。

しん

僕の場合、Rigid Bodyがなかったために何分も無駄にしてしまいました、、

スクリプトの記述

リングのスクリプト

リングの間を車が通った時に検知できるよう、スクリプトを記述します。

public void OnTriggerEnter(Collider other) //領域外に入った場合の処理
{
    if (other.CompareTag("Car")) //車が領域外に出た時
    {
        this.tag = "PassedRing"; //タグをPassedRingに変える
        //オブジェクトの色を黄色にする
        GetComponent<Renderer>().material.color = Color.yellow;
    }
}

public void OnTriggerExit(Collider other) //領域外を出た場合の処理
{
    if (other.CompareTag("Car")) //車が領域外を出た時
    { 
        this.tag = "Ring"; //タグをRingに変える
    }
}

こちらのスクリプトは下記の記事を参考にさせていただきました。

参考 OnTriggerを利用した当たり判定を理解しよう!XR-HUB

リングの中をCarというタグのオブジェクトが通過したら、リングオブジェクトが黄色になり、当たり判定が動作したことが色の変化でわかります。

さらに、リングの間に入った場合にはタグをRingからPassedRingに変更しています。これは、リングがもっと増えた場合に、「今通過したリングがどのリングなのかを判定する」ために使用したいので、このようにしています。なので、ただ当たり判定を確かめたいだけであれば、今は必要ありません。

近日中に、リングを増やした場合の記事をあげるのでそちらもぜひ読んでみてください!

実装結果

実際に動かしてみるとこんな感じになります。

ちゃんとリングの間を通った時に、リングの色が黄色に変わっていますね!

これを応用して、連なるリングに当たり判定を適用すれば、逆走やショートカットを防げるカーレースのコースが作成できます。

それについても後日記事にする予定なので、気になる方はぜひチェックしてみてください。

まとめ

今回のまとめです。

STEP.1
オブジェクトを設置(車とリング)
当たり判定を使用したいオブジェクト を設置します。
STEP.2
Colliderの設定
それぞれのオブジェクトにColliderを設定して、当たり判定ができるようにします。この時、当たられる方にIs Triggerのチェックをしておくことを忘れないようにしましょう。
STEP.3
Rigid Bodyの設定
OnTriggerを用いるため、少なくともどちらか一方にRigid Bodyを設定します。
STEP.4
スクリプトの記述
当たり判定のスクリプトを記述します。
STEP.5
実装完了

エラーなく動けば、実装完了です。

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

CAPTCHA