Unity_개발일지_24

홍신영·2024년 11월 21일
0

Unity

목록 보기
26/62

LayerMask 활용

보통 적이 플레이어 닿았을 때, 플레이어를 파괴한다. 라는 식으로 피하는 게임을 간단히 만들 때는 CompareTag("적"); 이런식으로 구현을 했었다.

하지만 이의 단점은 문자열 비교여서 성능적으로 아쉽고(사실 크게 못느낄순 있다), 또 여러 적 종류가 있다면 하나씩 비교를 해주어야 한다.

이때 LayerMask를 활용해보자.

    [SerializeField] private LayerMask dieLayer; //파괴가능한 오브젝트, 적군, 보스
    private void OnCollisionEnter(Collision collision)
    {
        if(((1 << collision.gameObject.layer) & dieLayer) != 0)
        {
            Destroy(gameObject); //나중에는 파괴말고, 플레이어 풀에 넣었다 뺏다로 변경예정
        }

    }

먼저 어디에 닿으면 파괴될지 생각해보자.
일반적군, 보스, 말고도 파괴해야할 물체를 파괴못하면 죽게 해주고 싶어 이 layer까지 인스펙터에서 설정해준다.

그리고 이제 충돌이 일어나면, 이 레이어와 비교하고 파괴작업을 해준다.

먼저 설정 해준 dieLayer는 비트마스크로 동작되어 이에 맞게 비교를 해주어야한다.

Collision.gameObject.layer를 한다면 안된다는 것이다.
이는 이 레이어의 int값만 반환한다.
유니티 인스펙터에 layer설정에 있는 인덱스대로 0-31까지 있다.

Enemy의 경우 8에 있으니 Collision.gameObject.layer는 8을 반환할 것이다.

그래서 이 레이어를 비트 연산을 통해 1을 8번 왼쪽으로 옮긴다.
그러면 비트마스크가 100000000이렇게 될 것이다.

이 비트마스크가 & dielayer로 겹치는 것이 있다면, 참참이면 참인것으로 즉 1,1이면 1이 나온 것이다. contain같은 느낌으로 검사해주고, 0은 디폴트니 아닌것에 있으면으로 조건 달아주었다.

profile
게임 클라이언트 개발자

0개의 댓글