Unityにおけるコライダー同士の接触コントロール

Unityでは、物理エンジンを使ってオブジェクト同士の衝突や接触をシミュレートすることが可能です。ゲームにおいてオブジェクト同士の接触をコントロールすることは非常に重要です。本資料では、コライダー同士の接触をコントロールする方法について解説します。

コライダーの基本

コライダーは、物理エンジンでの衝突や接触を検出するためのコンポーネントです。物理的に見えるかどうかに関係なく、オブジェクトにコライダーを設定することで、そのオブジェクトが他のオブジェクトと衝突するかどうかを制御できます。

コライダーの接触を制御する方法

1. レイヤーと衝突マトリックス

レイヤー を使用することで、特定のオブジェクト間で衝突を無効にしたり、衝突を発生させたりすることが可能です。 Layer Collision Matrix を調整して、特定のレイヤー同士の衝突を無効にできます。

設定方法:

  1. 各オブジェクトにレイヤーを割り当てます。
  2. Edit > Project Settings > PhysicsLayer Collision Matrix に進み、特定のレイヤー同士の衝突を無効にします。

この方法を使うと、例えば「プレイヤー」と「敵」のレイヤーの衝突を有効にし、「プレイヤー」と「背景」のレイヤーは衝突しないように設定できます。

2. OnCollision メソッドの使用

OnCollisionEnter, OnCollisionStay, OnCollisionExit などのコライダーメソッドを使用することで、コライダーが接触した瞬間や接触している間、または離れた時に特定の処理を実行することができます。

使用例:

void OnCollisionEnter(Collision collision)
{
    if (collision.gameObject.CompareTag("Enemy"))
    {
        // 敵との衝突時に処理を実行
    }
}

OnCollisionEnter はコライダー同士が最初に接触した瞬間に呼び出され、接触をカスタマイズしたい場合に使用します。

3. OnTrigger メソッドの使用

コライダーを「トリガー」として使用することで、物理的な衝突を無視し、あくまでオブジェクトの接触を検出だけすることができます。Is Trigger オプションを有効にすると、衝突時に物理反応が起こらず、代わりに OnTriggerEnter, OnTriggerStay, OnTriggerExit のイベントが発生します。

使用例:

void OnTriggerEnter(Collider other)
{
    if (other.gameObject.CompareTag("Item"))
    {
        // アイテムと接触時の処理
    }
}

4. Physics.IgnoreCollision を使用する

特定のオブジェクト間の衝突を無効にするには、Physics.IgnoreCollision を使用します。このメソッドを使うと、指定された2つのコライダーが接触しても、物理的な衝突を無視することができます。

使用例:

void Start()
{
    Collider collider1 = GetComponent<Collider>();
    Collider collider2 = someOtherObject.GetComponent<Collider>();
    Physics.IgnoreCollision(collider1, collider2);
}

この方法を使うと、例えば「プレイヤー」と「味方」キャラクターが衝突しないように設定できます。

Physics.IgnoreCollision を使ってコライダー間の衝突を無視した後、その衝突を再度有効にしたい場合には、残念ながら直接的なメソッドはありません。しかし、代替策として、再び衝突を有効にするためには、以下のように制御することができます。

1. 無視する設定を解除する

Physics.IgnoreCollision は、コライダー同士の衝突を無視する状態を設定するものですが、一度無視する設定を行ったコライダーに対して、再度 Physics.IgnoreCollision を呼び出すことで、無視する状態を解除できます。そのため、次のように ignore パラメーターを false にすることで、衝突を復活させることが可能です。

使用例:

void Start()
{
    Collider collider1 = GetComponent<Collider>();
    Collider collider2 = someOtherObject.GetComponent<Collider>();

    // 衝突を無視する
    Physics.IgnoreCollision(collider1, collider2, true);

    // 必要なタイミングで衝突を再び有効にする
    Physics.IgnoreCollision(collider1, collider2, false);
}

ここで、Physics.IgnoreCollision の第三引数はデフォルトで true ですが、 false を渡すことで無視状態を解除し、衝突を復活させることができます。

2. 時間経過や条件付きでの再有効化

例えば、一定時間の経過後や特定の条件が満たされたときに衝突を再び有効にしたい場合には、InvokeCoroutine を使って一定時間後に再び Physics.IgnoreCollisionfalse に設定することが可能です。

使用例(時間経過で復活させる):

void Start()
{
    Collider collider1 = GetComponent<Collider>();
    Collider collider2 = someOtherObject.GetComponent<Collider>();

    // 衝突を無視する
    Physics.IgnoreCollision(collider1, collider2, true);

    // 5秒後に衝突を復活させる
    StartCoroutine(RestoreCollisionAfterDelay(collider1, collider2, 5.0f));
}

IEnumerator RestoreCollisionAfterDelay(Collider col1, Collider col2, float delay)
{
    yield return new WaitForSeconds(delay);

    // 衝突を復活させる
    Physics.IgnoreCollision(col1, col2, false);
}

この方法により、一定の時間や特定のイベントに基づいて、無視していた衝突を再び有効にすることが可能です。

まとめ

Physics.IgnoreCollision 後にコライダー同士の衝突を復活させるためには、再び Physics.IgnoreCollision(collider1, collider2, false) を呼び出すことで無視状態を解除できます。これにより、必要に応じて柔軟に衝突の有効・無効をコントロールすることができます。

5. Physics.Raycast を使用した衝突検知

レイキャストは、指定した方向に「レイ」を飛ばして、経路上にあるオブジェクトを検知します。衝突検知や障害物のチェックなどに使われますが、物理的な衝突の代わりに「見えないライン」を使ってオブジェクトを検知します。

使用例:

void Update()
{
    Ray ray = new Ray(transform.position, transform.forward);
    RaycastHit hit;

    if (Physics.Raycast(ray, out hit))
    {
        Debug.Log("Hit object: " + hit.collider.name);
    }
}

この方法を使うと、例えば「プレイヤー」が前方に向かって敵がいるかどうかを調べることができます。

まとめ

Unityでは、コライダーを使用してオブジェクト間の接触をコントロールすることができます。レイヤーや衝突マトリックス、OnCollisionOnTrigger メソッドを活用することで、接触のカスタマイズが可能です。また、Physics.IgnoreCollisionPhysics.Raycast を使うことで、さらに詳細なコントロールができます。

Unity,当たり判定

Posted by hidepon