Unity備忘録7 当たり判定を設定をする方法part2(OnTrigger編)【Unity2D】

アイキャッチ ゲーム制作
スポンサーリンク

こんにちは、slashです。
前回に引き続き、当たり判定関連のネタです。

今回は「OnTrigger」属性を持つ当たり判定の設定についてです。

ポイント

OnTriggerEnter2D
「OnTrigger」属性を持つ当たり判定に
接触した時の動作を作成できる

下準備

今回は前回の記事の続きなので
設置したオブジェクトなどは前回の当たり判定についての記事で
作成したものをそのまま使います。

設置のしかたがわからない場合は
前回の記事を参照してください。

前回の記事では
playergroundenemyオブジェクトを配置し、
以下のようにコンポーネントをアタッチしてあります。
(enemyオブジェクトは今回は使いませんが一応書いておきます)

playerオブジェクト
Rigidbody2D、BoxCollider2D、PlayerController(C#Script)

groundオブジェクト
BoxCollider2D

enemyオブジェクト(※enemyは今回は使いません)
Rigidbody2D、CircleCollider2D

図1 前回記事で設置したオブジェクト

それに加えて、今回は以下の画像も追加します。

OnTriggerとは?

前回の記事では
当たり判定にOnTrigger属性を持たせずに設定を行いました。
OnTriggerでないオブジェクト同士は
ぶつかった時に跳ね返る等の物理的な挙動をします。

OnTrigger属性を持つ当たり判定の場合は
接触しても跳ね返ったりする事なく
そのまま通り抜けます。

しかし、当たり判定に接触した時に
「接触した!」という情報は取得できるため、
接触したときに何らかの命令を実行させる事ができます。

OnTriggerを試す

OnTiggerの当たり判定を設定すると
どのような動作になるか試してみます。

groundの当たり判定をOnTriggerにする

groundオブジェクトにはBoxCollier2Dをアタッチされていますが、
ここでインスペクターのBoxCollier2Dの設定で
isTriggerにチェックを入れます。

図2 Is Triggerにチェックを入れる

これで、地面の当たり判定にOnTrigger属性が付与されました。

実行する

実行すると、プレイヤーが重力に引っ張られて落下します。
そしてプレイヤーは地面に接触しても止まる事はなく
そのまま地面をすり抜けて下へ落ちていきます。

オブジェクトが接触する時、
どちらか片方(もしくは両方)がOnTrigger属性を持っている場合、
このようにオブジェクトはすり抜けていきます。

図3 実行して動作確認
スポンサーリンク

OnTriggerで接触した時の動作を設定してみる

OnTriggerがどういったものか試す事はできたので
groundの当たり判定から「isTrigger」のチェックを外しておきましょう。

ゴールのオブジェクトを設置

goal画像をドラッグアンドドロップでセットします。

そしてBoxCollider2Dをアタッチし、
「isTrigger」にチェックを入れます。

図4 goalオブジェクトの設置

そして、Tag>Add Tag…で
「Goal」というタグを作成し、
このタグをgoalオブジェクトに設定します。

図5 タグを作成1
図6 タグを作成2

ゴールに接触した時の動作を作成

ゴールに接触した時の動作を
前回の記事で作成した
「PlayerController」のスクリプトに追加していきます。
(PlayerControllerはplayerオブジェクトにアタッチされているC#Scriptです。)

PlayerControllerを以下のように更新します。

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

public class PlayerController : MonoBehaviour
{
    float PlayerSpeed = 0.0f;//プレイヤー速度

    // Start is called before the first frame update
    void Start()
    {
        
    }

    void Update()
    {
        if (Input.GetKey(KeyCode.LeftArrow))
        {
            //左キーが押されている
            PlayerSpeed = -0.1f;
        }
        else if (Input.GetKey(KeyCode.RightArrow))
        {
            //右キーが押されている
            PlayerSpeed = 0.1f;
        }
        else
        {
            //左キーも右キーも押されていない
            PlayerSpeed = 0.0f;
        }
    }

    void FixedUpdate()
    {
        transform.Translate(PlayerSpeed, 0.0f, 0.0f);
    }

    void OnCollisionEnter2D(Collision2D collision)
    {
        if (collision.gameObject.tag == "Ground")
        {
            Debug.Log("Ground");
        }
        else if (collision.gameObject.tag == "Enemy")
        {
            Debug.Log("Enemy");
        }            
    }

    void OnTriggerEnter2D(Collider2D collision)
    {
        //OnTriggerの当たり判定に接触した時に実行される
        if (collision.gameObject.tag == "Goal")
        {
            Debug.Log("Goal");
        }
        
    }
}

今回、新しく追加したのは
OnTriggerEnter2D(Collider2D collision)ですね。
これは「isTrigger」にチェックを入れた
当たり判定にオブジェクトが接触した時に
実行される内容となります。

実行してみる

ゲームを実行して動作を確認してみます。
左右キーでプレイヤーを動かしてゴールに接触させてみましょう。
ゴールの当たり判定は「isTrigger」にチェックが入っているため
プレイヤーがぶつかっても
動きが止まったり跳ね返されたりする事はありませんが、
コンソールに「Goal」のメッセージが出力されており、
接触の判定はちゃんとされている事がわかります。

図7 実行して動作確認
タイトルとURLをコピーしました