Unity 2Dで当たり判定をする方法!

Unity 2Dで当たり判定をする方法! Unity

こんにちは、yasuakiです。普段はWebシステム開発系の記事を書いています。
Unityでゲームを作成したということもあり、Unity 2Dについても少しずつ記事を書いていきたいと思います。

今回はUnity 2Dで当たり判定をする方法を解説してみました。
サンプルコードもgithubのこちらにあげています。

検証に使用しているUnityのバージョンは’2021.1.19f’です。

Unity 2Dで当たり判定をする

今回は自転車に乗ったプレイヤーが右から左に動いて、プレイヤーが生肉に当たると、生肉が消失するというゲーム(?)を作成しました。

Unity 2Dで当たり判定

Unityでは配置したオブジェクトに対して、コンポーネントを追加することで、様々な効果を付加することができます。

プレイヤーにはRigidbody 2DとBox Collieder 2Dを付加しました。
生肉にはBox Collieder2Dを付加しています。

Rigidbody 2Dは、物理的な挙動をつけることができるコンポーネントです。(重力など)
Box Collider2Dは、付加しているオブジェクト同士がぶつかると、当たり判定を行うことができるようになるコンポーネントです。

次項からオブジェクトを配置した後に、コンポーネントを追加して、当たり判定のスクリプトを書くところまでを説明します。

オブジェクトにコンポーネントを追加する

まず、それぞれの画像をSceneに配置します。
配置した後に、配置したオブジェクトに対して、inspector => Add Componentからコンポーネントを追加します。

Unity 2Dでオブジェクトにコンポーネントを設定する

このように選択した後に、Physics 2DからRigidbody 2Dと、Collider 2Dを追加します。
下記のようになります。それぞれのプロパティに設定している値はそのままで大丈夫です。

Unity 2Dでオブジェクトにコンポーネント設定後

下の方に草のブロックを設定していますが、これに対してもBox Collider 2Dを設定しておきます。
Box Collider 2Dをオブジェクト同士に設定しておくことで、通り抜けなくなります。

プレイヤーにRigidbodyとBox Colliderを設定しているので、Rigidbodyの重力で上から落ちてきて、Colliderで草ブロックに着地するようになります。
こんな感じです。

Unity 2Dで着地する

生肉に対しても同じように、それぞれ、BoxCollider 2Dを設定します。

Unity 2Dで生肉にColliderを設定する

判定のためのタグを追加する

当たり判定をするときに、どのオブジェクトに当たったか判断できるように、オブジェクトに対してタグを追加します。
今回は生肉だけが判定対象なので、生肉に対して下記のようにタグを追加します。

Unity 2Dでオブジェクトにタグを追加

Meatというタグと追加して設定しました。
これでスクリプトの中で「生肉にオブジェクトにぶつかった場合は〜する」という判断ができます。

生肉のIsTriggerをオンにする

生肉のBox Collider 2Dのis triggerをオンにします。
すり抜けるタイプの判定になります。重なった場合に判定されます。

Unity 2DでオブジェクトのIn Triggerオン

キャラクターにスクリプトを追加する

キャラクターを動かすのと、生肉を消失させるためにスクリプトを追加します。
スクリプトに書いたプログラムで、当たった場合に消す処理とキーボードの入力で動くようにします。

最初にAdd ComponentからNew Scriptを選択します。
名前を入力するようになるので、今回はPlayerControllerという名前でスクリプトを作成しました。
Unity 2Dでスクリプトの追加

下記のようにスクリプトが追加されました。
Unity 2Dでスクリプトの追加後

キャラクターに当たり判定と移動するスクリプトを編集する

追加したスクリプトを編集して、キャラクターに当たり判定とキーボード移動できるようにします。
ProjectのAssetsの中にスクリプトが入っているので、エディタで編集します。

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

public class PlayerController : MonoBehaviour
{
    private Rigidbody2D rigidBody;

    private void Start()
    {
        rigidBody = GetComponent<Rigidbody2D>();
    }

    private void Update()
    {
        float x = Input.GetAxis("Horizontal");

        if (x > 0)
        {
            rigidBody.AddForce(transform.right * 8.0f);
        }
        else if (x < 0)
        {
            rigidBody.AddForce(-transform.right * 8.0f);
        }
    }

    private void OnTriggerEnter2D(Collider2D other)
    {
        if (other.gameObject.CompareTag("Meat"))
        {
            other.gameObject.SetActive(false);
        }
    }
}

Startメソッド

Startメソッドはゲームが開始された時に呼ばれます。
GetComponent<Rigidbody2D>();でスクリプトを紐付けたオブジェクトのRigidbody 2Dコンポーネントを読み込み、’rigidBody’に設定しています。

Updateメソッド

Updateメソッドはゲーム実行時に毎回呼ばれます。
Input.GetAxis("Horizontal");で、入力した内容を取得します。
キーボードの矢印の左を入力すると、xには-0.1から-1に近づいて入力されます。
キーボードの矢印の右を入力すると、xには0.1から1に近づいて入力されます。

左を押すとrigidBody.AddForce(-transform.right * 8.0f)が働いて、左に力が加わって動きます。
右を押すと逆にrigidBody.AddForce(transform.right * 8.0f);が働いて、右に力が加わって動きます。
Rigidbody2Dを使うことで、加速度を使って動くような表現になります。

OnTriggerEnter2Dメソッド

OnTriggerEnter2Dメソッドは生肉とプレイヤーが衝突した場合に発生します。(Colliderが設定されていて、Is Triggerになっているものに当たった場合です)

other.gameObjectで当たったゲームのオブジェクトが取得できます。
CompareTag("Meat")で当たったオブジェクトのタグが”Meat”だった場合に中の処理をしています。

生肉(“Meat”)だった場合、SetActive(false)にして画面から消しています。

今回はUnity 2Dでオブジェクトの当たり判定をする方法を見ていきましたが、いかがでしたか。
これで、キーボードで移動し、生肉に当たった場合は生肉が消えるというゲーム(?)が完成しました。
Unityの機能を使って簡単に当たり判定をつけることができました。

Colliderオブジェクトが当たったときに判定する

今回はIsTriggerを使用しましたが、単純にBox Colliderが当たった場合でも判定可能です。

OnCollisionEnter2Dを使って、判定するオブジェクトとCompareTagで設定されたタグをくらべます。
Trueの場合に当たったということになるので、その中でやりたい処理を書きます。

private void OnCollisionEnter2D(Collision2D other)
{
    if (other.gameObject.CompareTag("タグ名"))
    {
      // 行いたい処理
    }
}

コメント

タイトルとURLをコピーしました