과제

[Unity,C#,3D] 게임 개발 숙련 개인 과제 2일 차

leejiyoung0511 2025. 3. 5. 20:50

👩🏻‍💻오늘 할 일

  • 체력바 UI
  • 아이템 설명문 표시
  • 새로운 노트북 환경설정

😵‍💫오늘의 트러블 슈팅

#1 작은 오브젝트 인식 문제

화면 중앙에서 ray를 쏴서 물체를 감지하고 그 물체의 데이터를 가져와

설명문을 표시하는 로직을 구현했다.

하지만 아무것도 뜨지 않았다. 

 

▼문제영상 

전체 화면에서 화면 복원은 무시해주세요...

ray를 화면에 표시해서 확인해 보니 시야각이 작은 영향이 있고

(작게 안 하면 플레이어 높이가 낮기 때문에 땅을 뚫는다)

 

컵케이크도 높이가 낮기 때문에 ray에 감지가 안되고 있었다.

 

해결방법을 찾아보니

1.ray를 머리 배 다리 세 방향으로 쏘기
2.SphereCast를 이용해 ray의 폭 늘리기
3.OverlapSphere를 사용하기

 

이 세 가지가 있었다.

 

첫 번째는 3개의 ray를 쏘고 감지하기 때문에 최적화 면에서는 안 좋을 것 같아서 패스

세 번째는 모든 방향에서 감지를 하기 때문에

(앞에 있는 물체만 감지하고 싶었다) 

두 번째 방법을 선택해서 코드를 수정하기로 하였다.

 

여기서 잠깐

🔍 SphereCast란?
SphereCast는 일반 Raycast의 확장 버전으로, 레이를 발사할 때 한 점에서 발사하는 것이 아니라 구(Sphere) 형태로 발사하여 더 넓은 영역을 감지할 수 있는 기능

 

아래와 같은 코드로 수정을 하니 문제 없이 감지를 하였다!

        //레이를 쏠 위치 설정
        Vector3 rayPos = transform.position + Vector3.up * 0.35f;
        //레이의 감지 범위 설정
        float sphereRadius = 0.3f;
        Ray ray = new Ray(rayPos, transform.forward);
        //레이 표시
        Debug.DrawLine(ray.origin, ray.origin + ray.direction * m_MaxCheckDistance, Color.red);
        //레이 충돌
        //SphereCast를 이용해 레이 폭을 늘리기
        if (Physics.SphereCast(ray, sphereRadius, out RaycastHit hit, m_MaxCheckDistance, m_InteractionLayer))
        {
            if (hit.collider.gameObject != m_CheckObject)
            {
                if (hit.collider.TryGetComponent(out IInteractable item))
                {
                    m_CheckObject = hit.collider.gameObject;
                    m_CheckItem = item;
                }
                else
                {
                    NotCheckedItem();
                }
            }
        }
        else
        {
            NotCheckedItem();
        }
        OnCheckItemEvent?.Invoke(m_CheckItem);

 

▼해결 영상