[Unity]初心者向け当たり判定の作り方(スクリプト付き)

下の動画のように四角形の物体同士がぶつかるとぶつかった四角形の色が赤色になるようにしていきます。

目次

ColliiderとRigidbody

プログラムを使い、衝突した時にコードが実行されるようにする

衝突判定の種類

ColliderとRigidbody

解説には二つのCubeを使います。
左側のCubeは私がキーを押すと右側に移動するようにしています。

何もしていない状態だと動画のようにCubeが接触してもそのまま通り抜けてしまいます。

この解説ではCube同士が触れた時にぶつかるようにしたいので「Collider」「Rigidbody」の二つを使っていきます。

Colliderというのは当たり判定の範囲で、これはCubeには元々ついています。
画像の赤丸の部分に「Box Collider」というものがありますね?
これは四角形の判定を作ってくれるもので、ここのサイズなどをいじることでCubeについている緑の線上の四角形のサイズが変わっているのが確認できると思います。
これがこのCubeの当たり判定になります。

今はここをいじっても変化はありませんが、後から重要になってきます。

ColliderがないオブジェクトにColliderを追加したい場合は追加したいオブジェクトをクリックして、右の欄を下スクロールすると「コンポーネントを追加」というボタンがあるのでそれをクリックします。

すると画像のような画面が表示され、上に検索欄があるので「Collider」と検索すると色々なColliderを追加することができます。

それぞれ当たり判定の形が違うので時間がある時でも色々見てみてくさだい。

Rigidbodyは最初は追加されていないので追加しましょう。検索欄にRigidbodyと入力するとRigidbodyが表示されるのでそれを追加します。

画像赤丸のようにRigidbodyが追加されていればOKです。

Rigidbodyはオブジェクトに重量を付けたりRigidbodyがついているオブジェクト同士が接触したさいにしっかり衝突してくれるようにしてくれます。

画像赤丸内でRigidbodyの設定を変更することもできて、例えば「重力を使用」のチェックを外すと重力がなくなり衝突のみをつけることもできます。

Rigidbodyは衝突させるオブジェクト両方に付けないといけないので解説だとCube二つに付けます。

これで動画のようにオブジェクト同士が衝突するとしっかり押されるようになります。

ここでの当たり判定はさっき説明したColliderのサイズで決めることができるので必要に応じてColliderのサイズを変更してみてください。


プログラムを使い、衝突した時にコードが実行されるようにする

ゲームを作る際にオブジェクトが接触すると何か起こるようにしたくなると思います。
例えばホラーゲームだと敵に触れるとゲームオーバーになるようにしたり、FPSだと弾丸が触れると相手にダメージを与えたりですね。

それをするにはプログラミングがほぼ必須になるのでプログラムを書くためのスクリプトを作っていきます。
プロジェクトという項目の下にある画像赤丸の「+」マークをクリックします。

そして表示される項目から「C#スクリプト」をクリックします。

これでプログラムを書くためのスクリプトが作られます。

コードは下のようになっています。必要なのは18行目から下のコードのみで、ここには「cube」というタグのオブジェクトに触れると色を赤にするというコードが書かれています。

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

public class NewBehaviourScript1 : MonoBehaviour
{
    // Start is called before the first frame update
    void Start()
    {

    }

    // Update is called once per frame
    void Update()
    {

    }
    void OnCollisionEnter(Collision collision)//触れた時に{}内のコードを実行
    {
    if (collision.gameObject.CompareTag("cube"))//「cube」というタグに触れた時に{}内のコードを実行
     {
     GetComponent<Renderer>().material.color = Color.red;//色を赤に変える
    }   
     }
}

cubeというタグはタグをつけたいオブジェクトを選んで(画像1番目の赤丸)、右上の「タグ」の隣の欄をクリックします(画像2番目の赤丸)

そして表示される項目から一番下の「タグを追加」をクリックします(画像3番目の赤丸)

画像に alt 属性が指定されていません。ファイル名: -2024-03-06-14.40.52-1024x541.png

すると新しいタグを作ることができるので名前を「cube」にします。
変えたら下の「save」をクリックします。

これで再びタグを開くと先ほど作ったcubeがあるのでこれをクリックします。
これでタグをcubeにすることができました。

スクリプトができたら左クリック長押しでスクリプトをオブジェクトに読み込ませることができます。

これでゲームを実行し、左のオブジェクトが右のオブジェクトに衝突すると左のオブジェクトの色が赤色に変化しました。

改めて解説すると左のオブジェクトには「cube」というタグのオブジェクトに触れると赤色にあるプログラムを入れており、右のオブジェクトには「cube」というタグをつけているためこうなりました。

接触判定のコードは下のものだと説明しましたが、ここの3行目の”cube”とかかれている部分の””の中身を変えることでなんのタグに触れるとプログラムが実行されるようになるか好きに変更できます。

また、5行目のコードが色を赤に変えるコードなので、自分でゲームを作る際はここに衝突した時に実行してほしいコードを書いてください。

 void OnCollisionEnter(Collision collision)//触れた時に{}内のコードを実行
    {
    if (collision.gameObject.CompareTag("cube"))//「cube」というタグに触れた時に{}内のコードを実行
     {
     GetComponent<Renderer>().material.color = Color.red;//色を赤に変える
    }   
     }

衝突判定の種類

衝突判定には他にも色々な種類があり、コードによっては触れた時ではなく、離れた時などにプログラムを実行するようにするコードもあります。

下に一覧を載せており、各コードの最後の「//」の後にどういう条件でコードを実行するのか書いてあるので良ければ参考にしてください。

void OnCollisionEnter(Collision collision)//触れた時に{}内のコードを実行
    {
    if (collision.gameObject.CompareTag("cube"))//「cube」というタグに触れた時に{}内のコードを実行
     {
     GetComponent<Renderer>().material.color = Color.red;//色を赤に変える
    }   
     }
    void OnCollisionStay(Collision collision)
    {
     if (collision.gameObject.CompareTag("cube"))//「cube」というタグに触れている時に{}内のコードを実行
    {
      GetComponent<Renderer>().material.color = Color.red;//色を赤に変える
     }
    }
    void OnCollisionExit(Collision collision)
    {
     if (collision.gameObject.CompareTag("cube"))//「cube」というタグから離れた時に{}内のコードを実行
     {
     GetComponent<Renderer>().material.color = Color.red;//色を赤に変える
    }
    }
    void OnTriggerEnter(Collider collision)
     {
    if (collision.tag == "cube")//「cube」というタグに触れた時に{}内のコードを実行
     { 
    GetComponent<Renderer>().material.color = Color.red;//色を赤に変える
     }   
    }
    void OnTriggerStay(Collider collision)
    {
        if (collision.tag == "cube")//「cube」というタグに触れている時に{}内のコードを実行
        {
           GetComponent<Renderer>().material.color = Color.red;//色を赤に変える
        }
    }
     void OnTriggerExit(Collider collision)
     {
    if (collision.tag == "cube")//「cube」というタグから離れた時に{}内のコードを実行
    {
     GetComponent<Renderer>().material.color = Color.red;//色を赤に変える
    }
     }

22行目からのコードは「//」の後に書いていることが上と同じですが、ここはRigidbodyにある「トリガーにする」という項目にチェックを入れている場合はここのコードにする必要があります。

TOPに戻る

コメントを残す

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