안녕하세요, 인친님들! 오늘은 게임 개발에서 매우 중요한 요소인 충돌 판정(Collision Detection)에 대해 알아보겠습니다. 특히, 계산이 간단하고 효율적인 원을 사용한 충돌 판정 방법에 대해 자세히 다루어 보겠습니다.
충돌 판정의 종류
- 정밀한 충돌 판정: 객체의 정확한 윤곽선을 사용하여 충돌을 감지합니다.
- 장점: 매우 정확한 충돌 감지
- 단점: 계산량이 많고 스크립트가 복잡해짐
- 간단한 원 충돌 판정: 객체를 둘러싸는 원을 사용하여 충돌을 감지합니다.
- 장점: 계산이 간단하고 효율적
- 단점: 정확도가 다소 떨어질 수 있음
원 충돌 판정의 원리
원 충돌 판정의 기본 원리는 간단합니다:
두 원의 중심 사이의 거리가 두 원의 반지름의 합보다 작으면 충돌로 판단합니다.
수식으로 표현하면 다음과 같습니다:
distance(중심1, 중심2) < (반지름1 + 반지름2)

유니티에서 구현하기
유니티에서 이를 구현하는 방법을 살펴보겠습니다.
- 먼저, 충돌 체크를 위한 스크립트를 생성합니다. (예:
CircleCollider.cs) - 다음 코드를 작성합니다:
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);
}
}
- 이 스크립트를 충돌을 체크하고 싶은 게임 오브젝트에 추가합니다.
- 충돌 체크가 필요한 곳에서 다음과 같이 사용합니다:
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
'1인 개발 게임 (Unity) > UNITY' 카테고리의 다른 글
| [UNITY] 프리팹 - 오브젝트 반복 생성, 활용하기 (2) | 2024.08.08 |
|---|---|
| [UNITY] 벡터의 크기만 가져가오는 법 (magnitude) (2) | 2024.08.08 |
| [UNITY] 키보드 방향키로 캐릭터(오브젝트) 이동시키기 (2) | 2024.08.08 |
| [UNITY] 오브젝트가 게임 뷰에서 안보여요 -> '레이어 번호'를 잘 설정합시다. (0) | 2024.08.08 |
| [UNITY] 컴포넌트란? (오브젝트에 성질/기능 추가하기) (2) | 2024.08.07 |