TIL (81) | 2023.11.20 | 특정 레이어 제외

kjg5370·2023년 11월 20일
0

TIL

목록 보기
79/91
post-thumbnail

들어가기 앞서

오늘은 계단의 난간에 적이 올라타서 가끔씩 플레이어의 머리위로 올라타 안 움직이는 문제가 발생해서 난간을 아예 적이 올라타지 못하도록 하기위해 콜라이더로 난간을 벽처럼 해놓았습니다.

오늘 배운 것

  • 특정 레이어 제외
    난간을 콜라이더로 했을 때 문제가 발생했는데 총알이 난간의 안보이는 벽에 부딪혀 적이 안맞는 경우가 생기는 것이였습니다. 그래서 레이가 충돌 처리를 하는 부분에 레이어마스크를 설정하여 특정 레이어는 검출하지 않도록 했습니다.

  • 레이어 설정
    일단 제외하고 싶은 레이어를 설정하기 위해 인스펙터 창에서 Add Layer를 클릭해 레이어를 추가해줍니다.

    레이어 이름을 지정해 줍니다.

    레이어를 설정하면 메인 카메라의 컬링 마스크가 설정이 안되어있어서 안보이는 경우가 있어 MainCamera - CullingMask 를 설정해줍니다.

    총알에 관련된 레이가 두 군데 있는데 하나는 총알을 쏠 방향을 정하는 레이와 두 번째는 총알에서 발사되어 적이나 벽과 충돌하는 레이가 있어서 이 두 곳에 다 레이어 마스크를 설정해서 위에서 만든 Block 레이어를 충돌하지 않도록 설정해주었습니다.

  • 총알 방향설정

    int layerMask = ~(1 << LayerMask.NameToLayer("Block"));
    
    Ray ray = Camera.main.ScreenPointToRay(new Vector3(Screen.width / 2f, Screen.height / 2f, 0f));
    RaycastHit hit;
    Vector3 targetDirection = Vector3.forward;
    if (Physics.Raycast(ray, out hit, 999f, layerMask))
     {
            // 조준선이 가리키는 방향을 계산
     		targetDirection = (hit.point - _weaponBase.bulletSpawn.position).normalized;
     }

    첫번째 줄은 LayerMask를 비트로 구성할 때 사용되는 1 << LayerMask.NameToLayer("Block")는 해당 레이어를 사용하겠다는 의미이고layerMask = ~layerMask로 비트를 반전시켜 해당 레이어를 제외한 모든 레이어를 사용하겠다는 의미입니다.
    그리고 if문으로 Block레이어를 충돌에서 제외시켜서 방향을 설정합니다.

  • 총알 레이

     int layerMask = ~(1 << LayerMask.NameToLayer("Block"));
    
     RaycastHit[] hits = Physics.RaycastAll(new Ray(_prevPos, (transform.position - _prevPos).normalized),
     (transform.position - _prevPos).magnitude, layerMask);

    총알도 똑같이 레이 충돌을 감지하는 부분에 레이어마스크를 설정하여 Block 레이어만 제외해줍니다.
    이렇게 총알이 난간의 투명벽에 부딪히지도 않고 공격도 잘 되도록 만들어보았습니다.

진행 사항

  • 맵에 적 배치하기
  • 적들이 서로 겹쳐 계속해서 달려가는 문제
    • 레이로 앞에 1f만큼의 거리를 측정해 Enemy라면 Idle상태로 전환
    • 네비 메쉬를 멈춘 후 타깃 재 설정
  • 계단의 난간을 올라타는 문제
    • 난간에 박스 콜라이더를 씌운 뒤 총알은 통과하도록 레이어 설정

내일 할 일

  • UI만져보기
profile
학생입니다

0개의 댓글