【Unity】衝突判定、すり抜け判定の学習

オブジェクト同士が接触する振る舞いを理解することは、動きのあるアプリを作る上で非常に重要になります
Unityでは、イベントを使って接触時にイベントハンドラ(メソッド)を呼び出すことができる仕組みが備わっています

今回は、シンプルなサンプルからどのように動作するのかを理解することから始めてもらおうとおみます

シーン構成

床とプレイヤーを使ってみます
床の上、空中にプレイヤーがいます

実行すると、プレイヤーは重力で落ちてきます
床に接触したり、すり抜けたりする様子からどのような挙動をするのか確認してみます

Player

物理挙動をし、当たり判定用のコライダーを備えたゲームオブジェクトになります

ヒエラルキーを右クリックしてメニューから作成します

Floor

プレイヤーが落下した際、接触する床になります
同じく、最初に作成しますが、これは静止した背景オブジェクトとするので、スタティック扱いとします

コード

衝突判定とすり抜け判定用のイベントハンドラ(メソッド)になります

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

public class CollisionTest : MonoBehaviour
{
    /// <summary>
    /// 入ってくるコライダーがこのオブジェクトのコライダーと接触したときに実行される。2D物理のみ
    /// </summary>
    /// <param name="other">この衝突に関連するCollision2Dデータ</param>
    void OnCollisionEnter2D(Collision2D other)
    {
        Debug.Log("コリジョン");
    }

    /// <summary>
    /// このオブジェクトに接続されたトリガーコライダーに他のオブジェクトが入ったときに実行される。2D物理のみ
    /// </summary>
    /// <param name="other">この衝突に関与するもう1つのCollider2D</param>
    void OnTriggerEnter2D(Collider2D other)
    {
        Debug.Log("トリガー");
    }
}

試してみよう

コライダーのisTriggerチェックボックスをオンにした場合、オフにした場合でどのように変化するか確認してみましょう

解説動画

上記のテストシーンの構成、実行をまとめた動画になりますので、確認しておきましょう

発展

イベントに汎用性を持たせてみよう
再利用できるように接触系のイベントが発生したら、特定のイベントが呼ばれるようにするコードを書いてみよう
インスペクターから、または、コードで記述することができます

サンプル

2つのスクリプトをPlayerゲームオブジェクトにアタッチしてみましょう

ここでは、詳細の解説をしていませんので、ご自分で動作を確認できるかチャレンジしてみましょう

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

public class Test : MonoBehaviour
{
    public UnityEvent MyTriggerEvent = new UnityEvent();

    /// <summary>
    /// Sent when another object enters a trigger collider attached to this
    /// object (2D physics only).
    /// </summary>
    /// <param name="other">The other Collider2D involved in this collision.</param>
    void OnTriggerEnter2D(Collider2D other)
    {
        Debug.Log("トリガー検出");
        MyTriggerEvent.Invoke();
    }

    /// <summary>
    /// Sent when an incoming collider makes contact with this object's
    /// collider (2D physics only).
    /// </summary>
    /// <param name="other">The Collision2D data associated with this collision.</param>
    void OnCollisionEnter2D(Collision2D other)
    {
        Debug.Log("衝突検出");
    }
}
using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class MoveTest : MonoBehaviour
{

    void Start()
    {
        GetComponent<Test>().MyTriggerEvent.AddListener(Show);
    }
    void Update()
    {
        if (Input.GetKeyDown(KeyCode.UpArrow))
        {
            GetComponent<Rigidbody2D>().AddForce(Vector3.up * 1000);
        }
    }

    public void Show()
    {
        Debug.Log("呼ばれた");
    }
}

Collider,Physics,Unity

Posted by hidepon