TIL 0418 최종 프로젝트 - 19 / 구조물에 스폰 포인트 생성되는 문제

강성원·2024년 5월 12일
0

TIL 오늘 배운 것

목록 보기
65/69

수정한 내용

구조물에 스폰 포인트 생성되는 문제

  • 문제
    주황색 경계선이 있는 구조물의 레이어가 Unwalkable인데도 그 위치에 스폰 포인트가 생성되는 문제가 생겼다.
  • 원인
    공중에 셀에서 지상으로 레이캐스트를 쐈을 때 Ground레이어라면 스폰 포인트를 생성하도록 했지만, 무슨 이유에선지 다른 레이어를 가진 오브젝트도 감지를 해버려서 위 사진 같은 결과가 나왔다.
  • 해결
    레이어 체크에서 Ground레이어에 부딪혔을 경우에만 스폰 포인트로 설정
  1. 각 셀에서 지상으로 레이캐스트 발사
  2. 닿은 곳에서 Physics.OverlapSphere로 닿은 모든 오브젝트를 충돌체 배열에 대입
  3. 배열에 있는 게임 오브젝트 중에 Ground레이어 외에 다른 레이어가 존재하면 건너뛰기
  4. Ground만 존재하면 스폰 포인트로 추가
public void DetectSpawnPoint() // 중복 없는 스폰 포인트 탐지
{
    _groundTempPoint.Clear();
    _groundSpawnPoints.Clear();

    int groundLayer = LayerMask.GetMask("Ground");
    int allLayers = LayerMask.GetMask("Ground", "Wall", "Unwalkable");

    RaycastHit hit;
    foreach (Vector3 cell in _groundCell)
    {
        if (Physics.Raycast(cell, Vector3.down, out hit, 41f, groundLayer))
        {
            Collider[] hitColliders = Physics.OverlapSphere(hit.point, cellRadius, allLayers);
            bool onlyGround = true;
            foreach (var hitCollider in hitColliders)
            {
                if (hitCollider.gameObject.layer != LayerMask.NameToLayer("Ground"))
                {
                    onlyGround = false;
                    break;
                }
            }
            if (onlyGround)
            {
                _groundTempPoint.Add(hit.point + Vector3.up * 3);
            }
        }       
    }

    _groundSpawnPoints = new Queue<Vector3>(_groundTempPoint);
}
  • 이제 위쪽 사진과는 다르게 땅 혹은 Ground 레이어를 가진 곳에만 스폰 포인트가 생성된다.
profile
개발은삼순이발

0개의 댓글