본문 바로가기
게임 개발/게임 이론+수학

[게임수학 | 유니티] 게임에서의 충돌처리 로직

by 불타는홍당무 2017. 5. 31.

출처: http://m.blog.naver.com/winterwolfs/10165506488



1. 원 - 원 충돌

[조건1] 중점 사이의 거리가 반지름의 합보다 작거나 같으면 충돌

float dist = sqrt(pow(point1.x - point2.x, 2) + pow(point1.y - point2.y, 2));

if (dist <= rad1 + rad2)
{
   collision = true;
}
else
{
   collision = false;
}


2. 사각형 - 사각형 충돌 (origin은 좌상단)

[조건1] 첫번째 사각형의 왼쪽 모서리가 두번째 사각형의 오른쪽 모서리를 넘지 않는다.

[조건2] 첫번째 사각형의 오른쪽 모서리가 두번째 사각형의 왼쪽 모서리를 넘어야 한다.

[조건3] 첫번째 사각형의 위쪽 모서리가 두번째 사각형의 아래쪽 모서리를 넘지 않는다.

[조건4] 첫번째 사각형의 아래쪽 모서리가 두번째 사각형의 위쪽 모서리를 넘어야 한다.

if (rect1.origin.x <= rect2.origin.x + rect2.size.width &&
    rect1.origin.x + rect1.size.width >= rect2.origin.x &&
    rect1.origin.y >= rect2.origin.y - rect2.size.height &&   
    rect1.origin.y - rect1.size.height <= rect2.origin.y)
{
    collision = true;
}
else
{
    collision = false;
}


3. 원 - 사각형 충돌

[조건1] 원의 반지름 만큼 사각형을 확장한 후, 원의 중심점이 그 사각형 안에 있다면 충돌

[조건2] 예외적으로 대각선 쪽으로 왔을땐 사각형 꼭지점들이 원 안에 있는지 확인(점-원 충돌)

int centerX;
int centerY;
int radius;
bool collision;

if ( (left <= centerX && centerX <= right) ||
     (bottom <= centerY && centerY <= top) )
{
    left = left - radius;
    right = right + radius;
    top = top + radius;
    down = down - radius;

    if (left < centerX && centerX < right && bottom < centerY && centerY < top)
    {
        collision = true;
    }
}
else
{
    사각형의 좌상단 포인트가 원 안에 있다면 collision=true;
    사각형의 좌하단 포인트가 원 안에 있다면 collision=true;
    사각형의 우상단 포인트가 원 안에 있다면 collision=true;
    사각형의 우하단 포인트가 원 안에 있다면 collision=true;
}

collsion = false;