[UNITY] 충돌 체크. 오브젝트 별로 충돌 옵션

     


유니티 인강을 보면서 슈팅게임을 만들고 있었는데, 플레이어 비행기가 미사일을 발사하고, 적 기체가 맞으면 죽는 로직을 구현하고 있었다. 근데 Collider 2D를 플레이어, 플레이어 미사일, 적, 적 미사일 이렇게 4개 걸어놨더니, 플레이어 미사일에 플레이어가 충돌하거나, 적이 적 미사일에 충돌하는 엽기적인 상황이 발생했다 ㅋㅋ 아니 분명 적이 미사일을 쐈는데 자기가 죽음....


아무튼 인강을 잠깐 중지하고 내 나름대로 어떻게 할지 고민하다가 유니티에서 사용하는 Tag를 이용해 구현했다.


    private void OnTriggerEnter2D(Collider2D collision)
    {
        if (collision.gameObject.CompareTag("PlayerWeapon"))
        {
            Debug.Log("적 닿음 : " + collision.gameObject.ToString());
            collision.gameObject.GetComponent<DamageDealer>().Hit();
            health -= collision.gameObject.GetComponent<DamageDealer>().GetDamage();
            if (health <= 0)
            {
                Die();
            }
        }

    } 


요렇게 충돌할때 충돌한 오브젝트의 Tag를 비교해서 적일경우 플레이어 미사일일 때만 충돌하게 해서 적과 적, 적과 적 미사일의 충돌을 피하게 만들었다.


훗.. 유니티 별거 아니군.


이라고 생각하고 있었는데, 인강에서 아주 간단하게 충돌을 제어하는 방법을 알려줬다. 유알못 지성;;


유니티 설정에서 프로젝트 설정에 가면 레이어별로 충돌을 할지 안할지 정하는 매트릭스가 있다.



스샷찍었더니 크게 나왔네.. project setting -> phisics 2d에 가보면 오른쪽 아래 조그맣게 나온다. 여기서 충돌하는 레이어들은 체크를 하고 충돌 안하게 하고싶은건 체크 해제하면 된다. Default부터 UI까지는 프로젝트 생성시 기본적으로 있는거고, Player부터 EnemyWeapon까지가 새로 만든 레이어다. 나는 플레이어의 경우 Enemy와 EnemyWeapon, 즉 적과 적 미사일에만 충돌하게 해놨다. 적은 그 반대고. 이렇게 하면 굳이 Tag를 비교하지 않아도 충돌을 제어할 수 있다. 


하지만 내가 이미 Tag로 구현해놔서 과연 이 매트릭스를 사용하는 것이 Tag로 비교하는 것보다 성능이 좋을까?라는 괜한 의심을 하게 되었다. 왠지 내가 만든게 아니면 답이 아닌것 같고 그러니까ㅋㅋㅋ 그래서 구글링을 좀 해봤는데 뭐 별다른 이슈는 없는 걸 봐서 또이또이 한가부다.


The best way to detect collision 이나 layer collision matrix vs comparetag 등등으로 검색해봤는데.. 딱히... 대부분 사람들은 둘의 성능차이보다는 두개를 동시에 사용했을 때 우선순위가 어디인가를 고민하던거 같다. 읽어보니 Layer의 경우 Child도 탐지하고 Tag는 안한다고 했었나? 뭐 그런 얘기들이 오가고 있었다. 


아무튼 내가 CompareTag로 만든 부분을 다 지우고 매트릭스로 바꿨더니.. 소스는 간결해지더라.. 예외처리도 적고.. ^^



반응형

댓글

Designed by JB FACTORY