반응형
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);
}
}
}
}
설명
- 충돌 감지: OnCollisionEnter2D 메서드를 사용하여 두 오브젝트의 충돌을 감지합니다.
- Collider2D 가져오기: collision.collider를 통해 충돌한 다른 오브젝트의 Collider2D를 가져오고, 현재 오브젝트의 Collider2D를 GetComponent<Collider2D>를 통해 가져옵니다.
- 겹친 영역 계산:
- Bounds를 사용하여 두 오브젝트의 충돌 범위를 계산합니다.
- Mathf.Min과 Mathf.Max를 사용하여 겹친 영역의 크기를 계산합니다.
- 밀어내기:
- 겹친 영역이 존재하면(overlapX > 0 && overlapY > 0), 더 작은 겹침을 기준으로 밀어냅니다.
- 겹침이 더 작은 축을 기준으로 밀어내기 위해 displacement 벡터를 계산하고, 각 오브젝트를 반대 방향으로 이동시킵니다.
결론
위의 예제는 두 오브젝트가 충돌했을 때 겹친 부분을 계산하고, 그 겹친 양만큼 서로를 밀어내는 방법을 보여줍니다. 이를 통해 물체들이 서로 겹치지 않도록 충돌 후의 위치를 조정할 수 있습니다. 필요에 따라 충돌 감지 및 밀어내는 로직을 추가적으로 커스터마이징할 수 있습니다.
반응형
'Unity > Manual' 카테고리의 다른 글
Unity에서 데이터 테이블 사용하기: 게임 개발의 효율성을 높이기 위한 방법 (0) | 2024.06.18 |
---|---|
Unity의 코루틴(Coroutine)에서 사용되는 yield return 구문 총 정리 (1) | 2024.06.16 |
Unity에서 오브젝트 및 컴포넌트 찾는 방법 총정리: GameObject, Find, Tag, Component (0) | 2024.06.14 |
Unity 반복적인 작업이나 지연을 처리하는 Coroutine : 게임 개발의 강력한 도구 (0) | 2024.06.14 |
Unity 스크립트 실행 순서 Awake OnEnable Start (1) | 2024.06.13 |