【Unity 簡単解説】Collisionとは?Colliderとは?を解決する

collisionとcolliderのアイキャッチ画像 メタバース

どうも、ナッツパパです(^^)
本記事では、Unityで度々登場する【Collision】と【Collider】について、初心者向けに解説していきます。

▼Collisionとは?
衝突した相手ゲームオブジェクトのあらゆる情報が入っている箱(クラス)のこと。
※ゲームオブジェクト同士が衝突して初めて作られる
▼使用方法
衝突イベントが発生した時に呼ばれる関数(OnCollisionEnterなど)をスクリプトファイルに書き込み、その関数の引数に【Collision】が入るようになっている。
そして、【Collision】の中の情報を取得し、if文で条件分岐を行い、ゲームオブジェクトに動きを付けていきます。
▼Colliderとは?
ゲームオブジェクトの衝突範囲の情報が入っている箱(クラス)のこと。
※基本的には、ゲームオブジェクトを生成した段階で、自動的にInspectorウィンドウ内に作られる。コンポネントとも言います。
▼使用用途
衝突範囲の設定
ゲームオブジェクト同士の衝突判定や重なり判定を制御する
※ゲームオブジェクト同士の衝突があった場合、『Collisionクラス』の中に、『Colliderクラス』の情報も組み込まれる

最初にまとめてみました。

両方とも、Unity側が用意してくれている【UnityEngine】というオブジェクトの中で定義されているクラスになります。

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

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

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

上のスクリプトファイル初期コードの3行目で【UnityEngine】オブジェクトを呼び出していますね。

これで、【UnityEngine】オブジェクトの中のクラスや関数が使えるようになっているというわけです。

そして、【UnityEngine】オブジェクト内の数多くあるクラスの中でも、特別待遇のクラスが存在します。
それは、スクリプトファイルに何もコードを書かなくても、最初からInspectorウィンドウ内に自動的に生成されるクラスのことで、『transformクラス』や『mesh rendererクラス』、そして本記事で紹介する『Colliderクラス』もその一つです。

inspectorウィンドウの画像

そして、『Collisionクラス』に関しては、特別待遇ではないので、スクリプトファイルにコードを書き込み、呼び出す必要があるのです。

ナッツパパ
ナッツパパ

よく似た言葉だけど全く意味は違います。
これからもっと詳しく解説していきますね(^^)

気軽に見ていって下さい♪

 

Collisionとは?

改めて【Collision】とは、衝突した相手ゲームオブジェクトのあらゆる情報が入っている箱(クラス)のことでしたね。

ではまず、【Collision】にはどんな情報が入っているのかを見ていきましょう。

Collisionクラスの中身

▼下にCollisionにどんな情報が入っているのかまとめていきます。

transform

transformプロパティの画像

衝突したオブジェクトの【transform(コンポネント)】情報が格納されている。

collision.transform.position.xと書くと、衝突した相手のX座標の位置が取得できます!

 

gameObject

ゲームオブジェクトの名前とタグの設定画像

衝突したオブジェクトの名前やタグ情報が格納されている。

collision.gameObject.nameと書くと、衝突した相手のオブジェクト名を取得できます!
collision.gameObject.CompareTag(“タグ名“)と書くと、衝突した相手のタグ名を確認できます!

 

collider

colliderプロパティの画像

衝突したオブジェクトの【Collider(コンポネント)】情報が格納される。

 

Rigidbody

rigidbodyプロパティの画像

衝突したオブジェクトの【Rigidbody(コンポネント)】情報が格納される。

 

articulationBody

articulationbodyプロパティの画像

衝突したオブジェクトの【articulation Body(コンポネント)】情報が格納される。

 

body

衝突したオブジェクトに、【Rigidbody】か【articulationBody】が紐づけられているかどうかが格納されている。紐づけられていない場合はnullを返す。
ちなみに、【Rigidbody】と【articulationBody】は、どちらか1つしかゲームオブジェクトに紐づけることは出来ません

 

contactCount

オブジェクトの衝突回数が格納される(int型で)

 

relativeVelocity

衝突相手の速度が格納される。
相手の速度が早ければ早いほど、オブジェクト同士の衝突の勢いが激しくなります。

▼使い方参考例
・衝突の勢いに応じて、衝突音を変化させる
・衝突の勢いに応じて、オブジェクトを破壊する など

▼relativeVelocityに関しては、下の記事で詳しく解説しています

 

impulse

衝突によって発生した、衝撃の値が格納される。

▼使い方参考例
・ある一定以上の衝撃が起きた時にイベントを発生させる
・ある一定以上の衝撃が起きた時に効果音をつける など

▼impulseに関しては、下の記事で詳しく解説しています

▼参考にした、Unityの公式リファレンスも載せておきますね。

 

ナッツパパ
ナッツパパ

Collisionの中身をだいたい把握したところで、次は具体的な使い方をみていきましょう♪

 

Collisionの使い方

ここで紹介するのは、【Collision】の使い方の一例です。

ナッツパパ
ナッツパパ

こんな感じで使うのかと、ざっくり認識してもらえたらと思います。

▼実際にコードを見て解説していきます。

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

public class BollScript : MonoBehaviour
{
    void Start()
    {
    }
    void Update()
    {
    }
    void OnCollisionEnter(Collision collision) 
    {
        if(collision.gameObject.CompareTag("sample"))
        {
            Destroy(gameObject);
        }
    }
}

上のコード13行目に、『OnCollisionEnter』という関数があります。
この関数は、ゲームオブジェクトに衝突が発生した時に呼ばれる関数になります。

注目して欲しいのは、引数の『Collision  collision』のところですね。
ここで【Collision】がでてきます。
衝突した相手ゲームオブジェクトの、あらゆる情報がここに入っているというわけです。

上のコードでは、衝突相手のタグ名が『sample』だったら、スクリプトファイルを紐づけている方のゲームオブジェクトを消すという処理です。

この様に、関数の引数として【Collision】を使っていきます。

 

Collisionを引数にとる関数一覧

▼【Collision】を引数にとる関数を紹介します(3Dゲーム開発)

・OnCollisionEnter → 衝突した瞬間に実行
・OnCollisionStay → 衝突中ずっと実行される
・OnCollisionExit → 衝突後に実行

これらの関数は、【UnityEngine】オブジェクトの中の【MonoBehaviour】クラスの中で定義されている、イベント関数と言われるものです。
ゲーム中のあるタイミングになると自動で呼びだされる便利な関数です。

ナッツパパ
ナッツパパ

次は、【Collider】をみていきましょう(^^)

 

Colliderとは?

改めて【Collider】とは、ゲームオブジェクトの衝突範囲の情報が入っている箱(クラス)のことでした。

▼実際に下の画像で見てみましょう。

colliderの画像

青色球体の周りの緑の線が、衝突範囲を表しています。

他のゲームオブジェクトに、この緑の線が当たると、青色球体は衝突判定を受けることになります。
この衝突範囲を制御するのが、【Collider】というわけですね。

【Collider】が設定されていなければ、ゲームオブジェクトは、衝突することすら出来なくなります。

ナッツパパ
ナッツパパ

衝突判定には、【Collider】の紐づけが必須
そして、【Collider】の中の『Is Trigger』にチェックが入っていると衝突判定が出来ないので、チェックは外しておきましょう
他にも、ゲームオブジェクトのどちらかに【Rigidbody】コンポネントが紐づけられていなければ、衝突判定は出来ません

次に、【Collider】の種類をみていきましょう。

 

Colliderの種類

▼代表的な【Collider】を下に4つ挙げてみました。

・BoxCollider
・SpherCollider
・CapsuleCollider
・MeshCollider

ゲームオブジェクトの形状によって呼び名が変わります。
先ほどの、青色球体についていた【Collider】は、SpherColliderに当たります。

 

Colliderのプロパティ解説

colliderプロパティの画像

ここでは、BoxColliderを例に見ていきます。

 

Is Trigger

『Is Trigger』は、ゲームオブジェクトの重なりを制御する項目です。
『Is Trigger』にチェックが入っていると、ゲームオブジェクト同士は衝突することなく重なる(通過する)ようになります。

ナッツパパ
ナッツパパ

重なり判定をしたいなら、この『Is Trigger』にチェックを入れましょう。
衝突判定をしたいなら、『Is Trigger』のチェックを外しましょう(^^)

 

Material

ここには、Projectウィンドウで作成した『Physics Material』を紐づけます。

▼Physics Materialとは?
ゲームオブジェクトの物理性質(摩擦や弾性)を設定できる項目です。
Projectウィンドウ内で、右クリック → Createから作ることができます。
作成した『Physics Material』を、Inspectorウィンドウ内【Collider】のMaterial項目にドラッグアンドドロップすることで、紐づけが可能です。

 

Center

ゲームオブジェクトの位置を基準とした、【Collider】の位置を設定できます。
X:0 Y:0 Z:0 で、ゲームオブジェクトと全く同じ位置に配置されています。

 

Size

これはシンプルで、【Collider】の大きさを指定できます。

 

さいごに

【Collision】と【Collider】は、言葉は似ていますが全く違うものでした。
この記事で全てが網羅されているわけではないですが、最低限【Collision】と【Collider】をどんな風に使うのかが、イメージ出来るようになってもらえたら幸いです(^^)