💥

【Unity】特定のオブジェクトどうしの衝突可否を制御する

2023/11/02に公開

はじめに

こんにちは、まつさこ です。

Unityでは、CollisionMatrixによってレイヤー同士の衝突可否を制御することができますが、ピンポイントで特定のオブジェクトどうしの衝突可否を制御したいこともあると思います。この記事では、特定のオブジェクトどうしの衝突可否をスクリプトで制御する方法について説明します。

開発環境

筆者の開発環境は以下です。

  • Unity 2021.3.5f1
  • Rider 2022.2.3

二つのオブジェクトの衝突可否を制御するクラス

特定のオブジェクトどうしの衝突可否を制御するためのstaticクラス CollisionDisabler を作成します。このクラスでは、指定したオブジェクトどうしのが一時的に衝突できるようにしたり、衝突できないようにしたりできます。

using UnityEngine;

public static class CollisionDisabler
{
    //衝突するかどうか、対象オブジェクト1、対象オブジェクト2を指定
    public static void SetActiveCollision(bool isCollide, GameObject targetObj1, GameObject targetObj2)
    {
        var colliders1 = targetObj1.GetComponentsInChildren<Collider>();
        var colliders2 = targetObj2.GetComponentsInChildren<Collider>();

        foreach (var col1 in colliders1)
        {
            foreach (var col2 in colliders2)
            {
                Physics.IgnoreCollision(col1, col2, !isCollide);
            }
        }
    }
}

例えば、オブジェクト Apple とオブジェクト Orange を<u>衝突できないように</u>するには、以下のように使用します。
Start() 関数でシーン開始と同時に発動することを想定しています。

[SerializeField] GameObject _apple; //Appleオブジェクトをアタッチ
[SerializeField] GameObject _orange; //Orangeオブジェクトをアタッチ

void Start()
{
    SetActiveCollision(false, _apple, _orange);
}

これで、シーン開始と同時に Apple オブジェクトと Orange オブジェクトは互いに衝突できなくなります。
これは、PhysicsSettingsのCollisionMatrix設定よりも優先されます。

ランタイム中に

SetActiveCollision(true, _apple, _orange);

をすれば、再び二つのオブジェクトが衝突するようになります。

まとめ

この記事では、特定のオブジェクトどうしの衝突判定を制御する方法を説明しました。
ゲーム中に衝突判定を複雑に制御したい場合などに活用してみてください。

読んでくださりありがとうございました🤗

Discussion