특정 레이어 제외
난간을 콜라이더로 했을 때 문제가 발생했는데 총알이 난간의 안보이는 벽에 부딪혀 적이 안맞는 경우가 생기는 것이였습니다. 그래서 레이가 충돌 처리를 하는 부분에 레이어마스크를 설정하여 특정 레이어는 검출하지 않도록 했습니다.
레이어 설정
일단 제외하고 싶은 레이어를 설정하기 위해 인스펙터 창에서 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 레이어만 제외해줍니다.
이렇게 총알이 난간의 투명벽에 부딪히지도 않고 공격도 잘 되도록 만들어보았습니다.