【unity入門】unity3Dで衝突した時の当たり判定を行う
unityを使ってゲームを製作していると、何かに当たった時に処理を行いたい場合があると思います。
当たったといっても衝突した時と、すり抜けた時ではやるべきことが異なります。
この記事では衝突した時の処理について扱います。
衝突した時の処理をunity3Dでやるには、
・オブジェクトにColliderを付け加える
・スクリプトにOnCollisionEnter()を書き込む
といった二つの作業をします。
詳しいやり方をみていきましょう!
この記事の目次
準備
オブジェクトを用意する
まずはunity3Dでプロジェクトを作成してください。
作成したら、衝突させるためのオブジェクトを二つ用意します。
今回はオブジェクトを落下させて衝突させるので、ぶつかるように配置してください。
わかりやすくするために下のオブジェクトを大きくしましょう。
下のオブジェクトのscaleをx10, y1 , z10程度にすれば良いと思います。
上のオブジェクトに重力を加える
このままの状態では上のオブジェクトは落下しません。
落下させるためには上のオブジェクトに物理現象を適応させるためのコンポーネントを追加する必要があります。
『Rigidbody』というコンポーネントです。
上にあるオブジェクトを選択し、AddComponent>Physicsを選択してください。
その後Rigidbodyを選択することで追加されます。
これで上のオブジェクトに重力などの物理現象が適応されるようになりました。
再生したら上のオブジェクトだけが落ちるようになります。
スクリプトを用意する
処理を書き込むスクリプトを用意します。
まずはスクリプトを作成してください。
作成したら、上側のオブジェクトにアタッチしてください。
オブジェクトにColliderを付け加える
Colliderについて
準備ができたので衝突時の当たり判定を実装していきましょう!
オブジェクトに『Collider』というコンポーネントを付け加えます。
Colliderはオブジェクトがぶつかるようにするためのコンポーネントです。
Colliderをつけなければオブジェクト同士はぶつかることはなく、すり抜けてしまいます。
付け加える
Colliderを付け加えていくのですが…
実はもうついています!
実は3Dオブジェクトには作成時にColliderが付け加えられるのです。
ですので、Colliderに関しては特にやることはないですね。
2Dオブジェクトの場合はColliderを自分でつける必要があるので注意してください!
スクリプトにOnCollisionEnter()を書き込む
先ほど作成したスクリプトに衝突時の処理を書いていきます。
衝突時の処理はOnCollisionEnter()の中に記述します。
スタート時の処理はStart()の中に書きますよね?
それと同じような感じです。
OnCollisionEnter()はこのように書きます。
void OnCollisionEnter(Collision 変数(当たったオブジェクトが格納される))
{
//当たった時の処理
}
サンプルコード
例として衝突した時に下のオブジェクトを消すコードを書いていきましょう。
コードは下記の通りです。
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class CubeManager : MonoBehaviour {
// Use this for initialization
void Start () {
}
// Update is called once per frame
void Update () {
}
//当たった時の処理
void OnCollisionEnter(Collision collision)
{
//当たったオブジェクトを消す
Destroy(collision.gameObject);
}
}
実行結果は、
簡単にコードの説明をしておきましょう。
OnCollisionEnterの引数には当たったオブジェクトがCollision型で格納されます。
スクリプトは上のオブジェクトにアタッチされているので、格納されるのは下のオブジェクトですね。
Destroy()は引数に入れられたオブジェクトを破壊する関数です。
引数にはオブジェクト型をとりますので、引数には『collision.gameObject』と記述します。
まとめ
衝突した時の処理は、
・オブジェクトにColliderを付け加える
・スクリプトにOnCollisionEnter()を書き込む
といった手順で実装していく!
この記事を読んで、衝突した時の処理がうまく実装できるようになったのなら幸いです。