본문 바로가기
유니티 최고/유니티 기초

유니티(Unity) 액터 충돌 감지함수들 + 태그 이용법

by Lee_story_.. 2022. 10. 19.
728x90

현재 진행하고 있는 프로젝트와 관련해서 충돌함수들을 사용하게 되었는데

 

생각보다 다양한것 같아 정리하게 되었습니다!

 

 

그럼 바로 시작하겠습니다.

 

 

 

 

먼저 유니티에서 사용되는 충돌 함수에 대해서 정리해 보자면

 

collision, trigger 이 2개의 함수가 있습니다.

 

 

collision 함수의 특징은 말 그대로 충돌 입니다. 

두 물체가 있다면 양쪽 모두에게 콜라이더가 존재해야하며, 실제 충돌 물리력을 체킹하는 함수입니다.

 

 

trigger  함수는  하는 역할을 같지만 약간 다른 형태를 보이는데

바로 한 물체의 콜라이더에 다른물체가 들어오면 실행되는 점입니다.

 

 

그렇기에 한쪽에서만 콜라이더를 생성해주고 아래처럼 trigger를 실행해주어 사용할수있습니다.

 

 

좀더 쉽게  게임으로 본다면

collision 함수는  스킬에 무언가 맞고 돌아오게끔 만들어줄때, >>> 벽돌깨기 게임?

trigger  함수는 게임상 어떤 스킬에 관통기능을 만들어줄때 사용가능할꺼 같네요  >> 특정지역 입장에서도 사용가능할듯!

 

비슷하지만 다른 두함수네요.. (쓰고나니 말이 어렵네요)

 

 

 

 

 

이제 실제 함수를 보러 가봅시다.

 

각각의 함수들은

on~~enter , on~~stay , on~~exit  들로 나누어져있습니다.

 

enter 함수는 충돌하는 순간 단 한번을 실행하고

stay는 충돌하는 동안 계속!

exit는 충돌이 끝났을때 호출합니다.

 

 

 

 

이제 모든 함수들의 소개가 끝났습니다...

 

 

 

이제 사용하러 가보죠!


함수의 사용법은 간단합니다.

private void OnCollisionEnter(Collision collision)
    {
        Debug.Log("충돌!");
    }

 

끝?

 

위 처럼 끝내면 어떤것이든 충돌하기만 하면 충돌 로그를 출력할것입니다

 

 

 

여기서 좀더 나아가

무엇에 충돌하였는지에 따라 다른 효과를 주고싶다! 할때는

충돌 오브젝트의 이름을 추적해 가기도 합니다.

 

 

(함수인자중 collision은 충돌한 오브젝트를 나타내어 아래처럼 사용할수있습니다.)

private void OnCollisionEnter(Collision collision)
    {
        if (collision.gameObject.name == "coll")
        {
            Debug.Log("충돌!");
        }
        
    }

만약 이름이 coll 이라면 충돌! 로그를 찍어 내겠죠

 

 

 

위의 상황을 게임으로 치면 >> 파이어볼을 맞으면 8데미지 , 아이스볼은 6데미지  이렇게 나누어줄수있게 됩니다!

 

 

그런데 만약? 파이어볼에도 종류가 있다면? >> 이름은 다른데..... 데미지는 다똑같고..

 

 

아래처럼 사용할수도 있지만.... 너무 길어지네요

private void OnCollisionEnter(Collision collision)
    {
        if (collision.gameObject.name == "fire1")
        {
            Debug.Log("충돌!");
        }
        else if (collision.gameObject.name == "fire2")
        {
            Debug.Log("충돌!");
        }
        else if (collision.gameObject.name == "fire3")
        {
            Debug.Log("충돌!");
        }
        
        ....
        
    }

 

 

 

이럴때 사용하는 방식이 태그를 이용한 방법입니다.

 

 

 

태그란?

 

오브젝트를 클릭해 보시면 태그란이 있는데

 

 

액터들의 종류를 그룹지어주는 기능입니다

 

 

클릭해서 태그를 추가할수도 있고

 

 

위의 예시에서의 액터 fire1, fire2, fire3등을 "fire" 태그로 묶어줄수있습니다!

 

 

 

그렇게 되면 collision,trigger함수는 아래처럼 변경시킬수있습니다.

private void OnCollisionEnter(Collision collision)
    {
        if (collision.gameObject.tag == "fire")
        {
            Debug.Log("충돌!");
        }
        
    }

 

쉽네요... 유니티에서 이미 다 구현을 해주어서  name >> tag로 변경만 해주면 끝!

 

 

 

 

 

사용법은 어렵지 않지만 trigger을 사용할지 collision을 사용할지를 한번 생각해주는게 좋을것 같네요!

 

 

 

 

 

 

 

 

틀린점이 있다면 댓 달아주세요!

 

 

 

 

 

 

댓글