【Unity入門】OnCollisionEnterを使ったオブジェクトとぶつかった時の処理

2021年11月8日

オブジェクトとぶつかった時に処理を呼び出すことができます。

やり方は

void OnCollisionEnter()
{    ぶつかった時の処理
}

と記述するだけです。

ぶつかったオブジェクトの情報を取得したい場合は、

void OnCollisionEnter(Collision 変数)
{    ぶつかった時の処理
}

と記述します。

実際にやってみる

準備

それでは、実際にオブジェクトとぶつかった時の処理を記述してみましょう。

まずは、以前作成した、『Unity Basics』というプロジェクトを開いてください。

『Unity Basics』を開いたら、オブジェクトとぶつかった時の処理をするシーンを作りましょう。

Scenesフォルダの中に作成します。

ProjectウィンドウでScenesフォルダを選択しましょう。

選択した状態で『+』ボタンを押しましょう。

色々と出てくるので、『Scene』をクリックしましょう。

すると、Scenesフォルダの中に新しくSceneが作成されます。

Sceneの名前を『Collision』に変更しておきましょう。

今回は『Collision』の中でやっていきたいので、Sceneを移動します。

『Collision』をダブルクリックしましょう。

すると、Sceceを移動することができます。

Hierarchyウィンドウを見ると、現在のSceneが『Collision』に変わっていますね。

次に他のオブジェクトとぶつかった時の処理を記述するスクリプトを作りましょう。

Scriptsフォルダを選択してください。

選択した状態で『+』ボタンを押しましょう。

色々と出てくるので『C# Scripts』を選択します。

すると、新しくスクリプトが作成されます。

名前が確定してしまう前に『CollisionScript』と変更しましょう。

名前を変更したら、スクリプトを編集していきましょう。

CollisionScriptをダブルクリックしてください。

すると、VIsual Studioが起動して、CollisionScriptを編集できるようになります。

オブジェクトとぶつかった時の処理を記述

それでは、実際にオブジェクトとぶつかった時の処理を記述していきましょう。

今回は、地面と落下する球を作って、球が地面にぶつかったら、コンソールに『ぶつかった』と表示されるようにしてみましょう。

まずは、地面を作ります。

Hierarchyウィンドウで『+』ボタンを押してください。

色々と出てくるので、3D Object > Planeと押していきます。

すると、地面を作成することができます。

次に落下させる球を作りましょう。

Hierarchyウィンドウで『+』ボタンを押してください。

色々と出てくるので3DObject > Sphereと押していってください。

すると、球が作られます。

作った球は落下させ、地面に当てる必要があるので、位置を変更して地面よりも高い場所に配置しておきましょう。

次に、球に重力を適用して、落下するようにしましょう。

球にRigidbodyコンポーネントを追加します。

Sphereを選択してください。

選択したら、Inspectorウィンドウで、『Add Component』を押しましょう。

色々と出てくるので、Physics

Rigidbodyと押していきます。

すると、SphereにRIgidbodyコンポーネントが追加されます。

これで、Sphereが落下するようになりました。

実際に落下するのか、再生して確かめてみましょう。

再生ボタンを押してください。

すると、確かにSphereが落下することがわかりますね。

次に、Sphereが地面とぶつかったら、コンソールに『ぶつかった』と表示されるようにしましょう。

スクリプトを編集していくのですが、その前にSphereにスクリプトを追加しておきましょう。

CollisionScriptをSphereにドラッグ&ドロップします。

すると、CollisionScriptがSphereに追加されます。

それでは、スクリプトを編集していきましょう。

CollisionScriptをダブルクリックしましょう。

すると、編集できるようになります。

Update関数の下に、

void OnCollisionEnter(){
    Debug.Log();}

と記述しましょう。

コードについて説明していきます。

OnCollisionEnterというのは

Start関数や

Update関数と同じ

イベント関数です。

イベント関数というのは、呼び出すタイミングを自分で決めるのではなく、Unity側が決める関数のことです。

イベント関数ごとに呼ばれるタイミングは異なります。

今回のOnCollisionEnterの場合は、スクリプトを追加したオブジェクトが他のオブジェクトとぶつかった時に呼ばれます。

他のオブジェクトとぶつかった時に『ぶつかった』とコンソールに表示したいので、OnCollisionEnterの中には

Debug.Log(“ぶつかった”);

と記述しています。

この状態で再生すると、地面とぶつかった時に、コンソールに『ぶつかった』と表示されるはずです。

実際にそうなるのか、再生して確かめてみましょう。

スクリプトを保存してUnityエディタに戻りましょう。

Unityエディタに戻ったら再生ボタンを押してください。

すると、Sphereが地面とぶつかった瞬間に、コンソールに『ぶつかった』と表示されます。

うまくいっていますね。

ぶつかったオブジェクトを取得

次に、ぶつかったオブジェクトの情報を取得してみましょう。

今回は、ぶつかったオブジェクトの名前をコンソールに表示してみようと思います。

今回ぶつかるオブジェクトはPlaneです。

なので、Planeと表示されるようにします。

コードを書いていくのですが、まずは前回書いたコードを

コメントアウトしておきましょう。

コメントアウトしたコードはコンピュータが読み込まなくなります。

コメントアウトのやり方は、コメントアウトしたい箇所を選択した状態でコマンドキーを押しながら、『/』を押すだけです。

コメントアウトすると、このような表示になります。

それでは、コードを書いていきましょう。

コメントアウトしたコードの下に

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

と記述しましょう。

コードについて説明していきます。

まず、このコードはOnCollisionEnterを使っているので

他のオブジェクトとぶつかった時に呼ばれます。

引数にはCollision型の

collisionという名前の変数をとります。

小文字で始まるcollisonの方は勝手に名前をつけたものなので、わかりやすければ、どのようなものであっても構いません。

Collision型の変数はぶつかったオブジェクトの情報を扱います。

なので、collision.gameObject

と記述すると、ぶつかったオブジェクトを取得することができます。

今回であれば地面のオブジェクトであるPlaneとぶつかるので、Planeが取得されます。

取得されたPlaneに対して.nameと記述することで、

名前を取得します。

今回の場合だとPlaneですね。

なので、Debug.Logにより

地面とぶつかると、『Plane』とコンソールに表示されるはずです。

実際にそうなるのか再生して確かめてみましょう。

スクリプトを保存して、Unityエディタに戻りましょう。

Unityエディタに戻ったら、再生ボタンを押してください。

すると、球が地面にぶつかった時、コンソールには『Plane』と表示されますね。

このようにして、オブジェクトとぶつかった時の処理を記述することができます。