Unity 충돌 감지 및 트리거

2024. 11. 28. 14:41Unity

Unity에서의 충돌 감지 및 트리거 

Unity에서 게임 오브젝트 간의 충돌 감지트리거(Trigger)는 물리적 상호작용을 구현하는 데 핵심적인 역할을 합니다.
적의 공격 감지, 아이템 획득, 영역 진입 이벤트 처리 등 게임의 다양한 기능을 구현할 수 있습니다.

이번 포스팅에서는 충돌과 트리거의 개념, 설정 방법, 그리고 사용 예제를 다룹니다.


1. 충돌 감지와 트리거란?

1) 충돌(Collision)

  • 두 게임 오브젝트가 서로 물리적으로 부딪힐 때 발생합니다.
  • Rigidbody와 Collider를 통해 물리적인 충돌과 반응을 처리할 수 있습니다.
  • 예: 벽에 공이 부딪혀 튕겨 나가는 상황.

2) 트리거(Trigger)

  • 물리적으로 부딪히지 않고도 오브젝트 간의 상호작용을 감지합니다.
  • Trigger는 물리 연산을 배제하고, 이벤트만 감지합니다.
  • 예: 캐릭터가 특정 영역에 들어갔을 때 아이템 획득 처리.

2. 충돌과 트리거 설정하기

1) Collider 추가하기

  • 충돌을 감지하려면 오브젝트에 Collider를 추가해야 합니다.
  • Collider 종류:
    • Box Collider: 박스 모양의 충돌 영역.
    • Sphere Collider: 구체 모양의 충돌 영역.
    • Capsule Collider: 캡슐 모양의 충돌 영역.
    • Mesh Collider: 복잡한 형태의 충돌 영역.

2) Trigger 활성화

  • Collider 컴포넌트에서 Is Trigger 옵션을 활성화합니다.
  • Trigger는 물리 연산 없이 이벤트 감지만 처리합니다.

3) Rigidbody 필요성

  • 한쪽 오브젝트에 Rigidbody가 있어야 충돌이 감지됩니다.
  • Trigger의 경우 Rigidbody 없이도 이벤트 감지가 가능합니다.

3. 충돌 감지 메서드

1) OnCollisionEnter

  • 충돌이 발생했을 때 호출됩니다.
void OnCollisionEnter(Collision collision)
{
    Debug.Log("충돌한 오브젝트: " + collision.gameObject.name);
}

2) OnCollisionStay

  • 충돌 상태가 유지되는 동안 매 프레임 호출됩니다.
void OnCollisionStay(Collision collision)
{
    Debug.Log("충돌 상태 유지 중: " + collision.gameObject.name);
}

3) OnCollisionExit

  • 충돌이 끝났을 때 호출됩니다.
void OnCollisionExit(Collision collision)
{
    Debug.Log("충돌 종료: " + collision.gameObject.name);
}

 


4. 트리거 감지 메서드

1) OnTriggerEnter

  • Trigger 영역에 진입했을 때 호출됩니다.
void OnTriggerEnter(Collider other)
{
    Debug.Log("트리거 진입: " + other.gameObject.name);
}

2) OnTriggerStay

  • Trigger 영역 내에 있는 동안 매 프레임 호출됩니다.
void OnTriggerStay(Collider other)
{
    Debug.Log("트리거 내에 머무는 중: " + other.gameObject.name);
}

3) OnTriggerExit

  • Trigger 영역에서 나갈 때 호출됩니다.
void OnTriggerExit(Collider other)
{
    Debug.Log("트리거 종료: " + other.gameObject.name);
}

 


5. 예제: 아이템 획득 구현

1) 트리거 설정

  • 아이템 오브젝트에 Box Collider를 추가합니다.
  • Is Trigger 옵션을 활성화합니다.

2) 스크립트 작성

using UnityEngine;

public class ItemCollector : MonoBehaviour
{
    void OnTriggerEnter(Collider other)
    {
        if (other.CompareTag("Player"))
        {
            Debug.Log("아이템 획득!");
            Destroy(gameObject); // 아이템 제거
        }
    }
}

3) Player 태그 설정

  • 플레이어 오브젝트에 Tag를 "Player"로 설정합니다.

6. 주의사항

  1. Rigidbody 사용 필수
  • 충돌 감지를 위해서는 Rigidbody가 필요합니다.
  • Trigger는 Rigidbody 없이도 작동하지만, 성능 최적화를 위해 적어도 한쪽에 Rigidbody를 추가하는 것이 좋습니다.
  1. 정확한 Collider 크기 설정
  • Collider 크기가 너무 크거나 작으면 예상치 못한 충돌이 발생할 수 있습니다.
  • Scene 뷰에서 Collider 영역을 시각적으로 확인하세요.
  1. Is Trigger와 물리 연산
  • Is Trigger가 활성화되면 물리적 반응(예: 튕김, 밀림 등)은 작동하지 않습니다.

7. 충돌과 트리거 활용 예제

적 공격 충돌 처리

void OnCollisionEnter(Collision collision)
{
    if (collision.gameObject.CompareTag("Enemy"))
    {
        Debug.Log("적과 충돌! 체력 감소!");
    }
}

특정 지역 진입 이벤트

void OnTriggerEnter(Collider other)
{
    if (other.CompareTag("Player"))
    {
        Debug.Log("플레이어가 영역에 진입했습니다!");
    }
}

 


8. 요약

Unity에서 충돌 감지와 트리거는 게임의 상호작용을 구현하는 핵심 메커니즘입니다.

  • 충돌(Collision): 물리적 상호작용을 포함한 충돌 처리.
  • 트리거(Trigger): 비물리적 이벤트 감지.