본문 바로가기
Unity/Manual

Unity 충돌체의 겹친 범위만큼 밀어내는 방법

by Dev_카페인 2024. 6. 15.
반응형

Unity 충돌체의 겹친 범위만큼 밀어내는 방법

 

큐브 A와 B가 충돌했을 때 겹친 부분만큼 서로를 밀어내려면, 두 큐브가 겹친 양을 계산하여 그만큼 각각의 큐브를 이동시켜야 합니다. 이를 위해 Collider2D의 bounds를 활용하여 충돌한 부분을 계산하고, 해당 부분만큼 밀어내는 로직을 작성할 수 있습니다.

충돌 감지 및 겹친 영역 계산

우선, OnCollisionEnter2D 메서드를 사용하여 충돌을 감지하고, 충돌한 두 오브젝트의 겹친 부분을 계산합니다.

충돌 스크립트

using UnityEngine;

public class CollisionResolution : MonoBehaviour
{
    void OnCollisionEnter2D(Collision2D collision)
    {
        // 충돌한 다른 오브젝트의 Collider2D
        Collider2D otherCollider = collision.collider;

        // 현재 오브젝트의 Collider2D
        Collider2D myCollider = GetComponent<Collider2D>();

        // 두 Collider의 겹친 영역 계산
        Bounds otherBounds = otherCollider.bounds;
        Bounds myBounds = myCollider.bounds;

        // 겹친 영역의 크기 계산
        float overlapX = Mathf.Min(myBounds.max.x, otherBounds.max.x) - Mathf.Max(myBounds.min.x, otherBounds.min.x);
        float overlapY = Mathf.Min(myBounds.max.y, otherBounds.max.y) - Mathf.Max(myBounds.min.y, otherBounds.min.y);

        if (overlapX > 0 && overlapY > 0)
        {
            // 겹친 영역이 있을 때 밀어내기
            Vector3 displacement = Vector3.zero;
            if (overlapX < overlapY)
            {
                displacement.x = overlapX / 2 * Mathf.Sign(myBounds.center.x - otherBounds.center.x);
                transform.position += new Vector3(displacement.x, 0, 0);
                otherCollider.transform.position -= new Vector3(displacement.x, 0, 0);
            }
            else
            {
                displacement.y = overlapY / 2 * Mathf.Sign(myBounds.center.y - otherBounds.center.y);
                transform.position += new Vector3(0, displacement.y, 0);
                otherCollider.transform.position -= new Vector3(0, displacement.y, 0);
            }
        }
    }
}

설명

  1. 충돌 감지: OnCollisionEnter2D 메서드를 사용하여 두 오브젝트의 충돌을 감지합니다.
  2. Collider2D 가져오기: collision.collider를 통해 충돌한 다른 오브젝트의 Collider2D를 가져오고, 현재 오브젝트의 Collider2D를 GetComponent<Collider2D>를 통해 가져옵니다.
  3. 겹친 영역 계산:
    • Bounds를 사용하여 두 오브젝트의 충돌 범위를 계산합니다.
    • Mathf.Min과 Mathf.Max를 사용하여 겹친 영역의 크기를 계산합니다.
  4. 밀어내기:
    • 겹친 영역이 존재하면(overlapX > 0 && overlapY > 0), 더 작은 겹침을 기준으로 밀어냅니다.
    • 겹침이 더 작은 축을 기준으로 밀어내기 위해 displacement 벡터를 계산하고, 각 오브젝트를 반대 방향으로 이동시킵니다.

결론

위의 예제는 두 오브젝트가 충돌했을 때 겹친 부분을 계산하고, 그 겹친 양만큼 서로를 밀어내는 방법을 보여줍니다. 이를 통해 물체들이 서로 겹치지 않도록 충돌 후의 위치를 조정할 수 있습니다. 필요에 따라 충돌 감지 및 밀어내는 로직을 추가적으로 커스터마이징할 수 있습니다.

반응형