내일배움캠프 TIL

내일배움캠프 25일차 TIL "레이어를 통한 충돌 처리"

Jooglorystar 2024. 10. 18. 22:05

 

 

기본적으로 유니티에서 Collider 컴포넌트를 추가한다면, 사용 방법에따라 OnTriggerEnter(2D)나 OnCollisionEnter(2D) 같은 메서드들을 통해 충돌 했을 시의 동작을 구현할 수 있다.

그러나 모든 충돌에 반응하는 경우도 있겠지만, 특정 오브젝트 충돌에만 반응하게 만들고 싶은 경우도 분명 존재할 것이다. 

그럴 때 Layer를 통해 충돌한 대상을 판별할 수 있다.

 

private void OnTriggerEnter2D(Collider2D collision)
{
    if (collision.gameObject.layer == LayerMask.NameToLayer("Enemy"))
    {
    	Debug.Log("Enemy Hit");
    }
}

 

위 코드는 충돌한 물체의 레이어가 "Enemy" 일 때만 내부의 Debug 로그를 출력할 수 있다. 

예시에선 편의상 "Enemy"라고 직접 문자열을 입력했지만, 따로 변수로 받아 사용하는 것도 좋다.

 

[SerializeField] private string targetLayerName;

private void OnTriggerEnter2D(Collider2D collision)
{
    if (collision.gameObject.layer == LayerMask.NameToLayer(targetLayerName))
    {
    	Debug.Log($"{targetLayerName} Hit");
    }
}

 

위 코드에서 'collision.gameObject.layer' 는 int값으로 반환이 된다.

좌측에 있는 값

 

따라서 레이어를 비교한다고 'collision.gameObject.layer == targetLayerName' 같은 식으로 사용하면 다음과 같은 컴파일 오류가 발생한다.

 

 

LayerMask.NameToLayer(String string)은 string 값에 맞는 레이어 번호를 반환하기에, 비교를 위해서는 해당 메서드를 이용해야한다.