1인 개발 게임 (Unity)/UNITY

[UNITY] 충돌 판정 하는 법 1 - 원의 반지름 사용하기

Z46 2024. 8. 8. 15:46

안녕하세요, 인친님들! 오늘은 게임 개발에서 매우 중요한 요소인 충돌 판정(Collision Detection)에 대해 알아보겠습니다. 특히, 계산이 간단하고 효율적인 원을 사용한 충돌 판정 방법에 대해 자세히 다루어 보겠습니다.

 

충돌 판정의 종류

  1. 정밀한 충돌 판정: 객체의 정확한 윤곽선을 사용하여 충돌을 감지합니다.
    • 장점: 매우 정확한 충돌 감지
    • 단점: 계산량이 많고 스크립트가 복잡해짐
  2. 간단한 원 충돌 판정: 객체를 둘러싸는 원을 사용하여 충돌을 감지합니다.
    • 장점: 계산이 간단하고 효율적
    • 단점: 정확도가 다소 떨어질 수 있음

 

원 충돌 판정의 원리

원 충돌 판정의 기본 원리는 간단합니다:
두 원의 중심 사이의 거리가 두 원의 반지름의 합보다 작으면 충돌로 판단합니다.

수식으로 표현하면 다음과 같습니다:

distance(중심1, 중심2) < (반지름1 + 반지름2)

 

유니티에서 구현하기

 

유니티에서 이를 구현하는 방법을 살펴보겠습니다.

  1. 먼저, 충돌 체크를 위한 스크립트를 생성합니다. (예: CircleCollider.cs)
  2. 다음 코드를 작성합니다:
using UnityEngine;

public class CircleCollider : MonoBehaviour
{
    public float radius;  // 원의 반지름

    void Start()
    {
        // 스프라이트의 크기를 바탕으로 반지름 설정
        SpriteRenderer spriteRenderer = GetComponent<SpriteRenderer>();
        if (spriteRenderer != null)
        {
            Vector2 spriteSize = spriteRenderer.sprite.bounds.size;
            radius = Mathf.Max(spriteSize.x, spriteSize.y) / 2f;
        }
    }

    public bool IsColliding(CircleCollider other)
    {
        // 두 원의 중심 사이의 거리 계산
        float distance = Vector2.Distance(transform.position, other.transform.position);

        // 충돌 여부 반환
        return distance < (radius + other.radius);
    }
}
  1. 이 스크립트를 충돌을 체크하고 싶은 게임 오브젝트에 추가합니다.
  2. 충돌 체크가 필요한 곳에서 다음과 같이 사용합니다:
CircleCollider colliderA = objectA.GetComponent<CircleCollider>();
CircleCollider colliderB = objectB.GetComponent<CircleCollider>();

if (colliderA.IsColliding(colliderB))
{
    Debug.Log("충돌 발생!");
}

or

Ex) transform.Translate(0, -0.1f, 0);

 

        if (transform.position.y < -5.0f)

        {

            Destroy(gameObject);

        }

 

        Vector2 p1 = transform.position;

        Vector2 p2 = this.player.transform.position;

 

        Vector2 dir = p1 - p2;

 

        float d = dir.magnitude;

        float r1 = 0.5f;

 

        float r2 = 1.0f; 

 

        if ( d < r1 + r2 )

        {

            Destroy(gameObject);

        }

    }



주의사항

  • 원의 반지름은 스프라이트 크기를 바탕으로 자동으로 설정되지만, 필요에 따라 수동으로 조정할 수 있습니다.
  • 이 방법은 대략적인 충돌 감지에 적합하며, 매우 정확한 충돌 감지가 필요한 경우에는 다른 방법을 고려해야 할 수 있습니다.

 

 


검색어 해시태그:

#유니티 #Unity #게임개발 #GameDev #충돌판정 #CollisionDetection #원충돌 #CircleCollision #유니티튜토리얼 #UnityTutorial #게임물리 #GamePhysics #게임프로그래밍 #GameProgramming #인디게임개발 #IndieGameDev #유니티C# #UnityCs #게임최적화 #GameOptimization