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

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

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

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

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

PR

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("タグ名"))
    {
      // 行いたい処理
    }
}
Unityのオススメな本です
  
Unityプログラミング
独学に限界を感じたら、オンラインのプログラミングスクールへ...
  • Code ViIlage
      挫折させない本気のプログラミングスクール。学習継続率93.3%・卒業生800名以上。
  • DMM WEBCAMP
      働きながら自分のペース学んでエンジニア転職。無料カウンセリング満足度99%!
  • TECH CAMP
      無料カウンセリング満足度95%!本業に活かせる。キャリアアップにつながる。
  • TechAcademy
      現役エンジニアから学べるオンラインに特化したプログラミングスクール。
  • テックパートナーズカレッジ
      WEBシステム開発会社のノウハウが学べるオンラインスクール。14日無料体験有り!
  • \ PHP・Laravelに特化したオンラインスクール /
    yasuakiをフォローする
    codelikeなブログ

    コメント

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