Unity/기능

[Unity] 2D 게임에서 카메라 영역 제한하기

turbulence93 2025. 5. 19. 20:30

목표

- 카메라가 맵 바깥으로 벗어나지 않도록 이동 범위를 제한하여 자연스러운 뷰 구현하기

핵심 개념

- Orthographic : 2D 게임에서 사용하는 카메라 설정
- TilemapRenderer: 크기 정보를 확인하기 위한 타일맵이 그려진 랜더러

구현 방법

1.카메라 영역 계산

cameraHalfHeight = Camera.main.orthographicSize;
cameraHalfWidth = Mathf.Round(Camera.main.orthographicSize * Camera.main.aspect);
  • 카메라의 영역을 계산하기 위해 오소 그래픽 옵션을 활용
  • 카메라의 orthographicSize를 5로 설정했다면 카메라의 height는 10
  • 중앙을 기준으로 제한점을 찾아야 하기 때문에 절반 사이즈인 orthographicSize을 haltHeight로 설정
  • Camera.main.orthographicSize * Camera.main.aspect 를 통해 오소그래픽 5에 해당하는 width 계산
  • Camera.main.aspect를 통한 width 계산을 비율을 통해 이뤄지기 때문에 정확한 수치를 받기 위해 Round를 통해 반올림 

2.타일맵 경계 설정

public void SetCameraBounds(TilemapRenderer tilemapRenderer)
{
    Bounds bounds = tilemapRenderer.bounds;
    areaMin = bounds.min;
    areaMax = bounds.max;
}
  • 이동할 지역의 타일맵 정보에서 bounds를 통해 시작점과 끝점을 계산

3. 카메라 위치 제한

 private void ApplyCameraBounds()
 {
     if (isApply)
     {
         cameraLimitsHeight = Mathf.Clamp(target.position.y, areaMin.y + cameraHalfHeight, areaMax.y - cameraHalfHeight);
         cameraLimitsWidth = Mathf.Clamp(target.position.x, areaMin.x + cameraHalfWidth, areaMax.x - cameraHalfWidth);

         cameraPos.x = cameraLimitsWidth;
         cameraPos.y = cameraLimitsHeight;
     }
     else
     {
         cameraPos = target.position;
         cameraPos.z = cameraOffset.z;
     }
 }
  • 카메라가 쫓아가고 있는 대상(target)의 위치를 통해 카메라 이동을 제한
  • Clamp value : target의 위치
  • Clamp Min : target이 맵의 끝에 도착했을때 보정값을 적용
  • 예) areaMin.y + cameraHalfHeight → areaMin.y(0) + cameraHalfHeight(5)
    Player 위치(y = 0)  → 카메라의 최소 위치 5(areaMin.y + cameraHalfHeight)
    Player의 위치가 0에 있어도 카메라의 위치는 5에 고정되어 이동을 제한함

결과

카메라 영역 제한 x

영역 제한이 없다면 위 사진과 같이 빈 영역을 게임씬에 비추게 된다.

오소 그래픽을 통해 제어를 한 이유는 카메라가 target과 함께 이동할때

targer이 0지점에 있다면 카메라는 -5~5범위를 비추게 된다.

그래서 0지점에서 오소그래픽만큼 카메라의 제한이 필요하다.

카메라의 위치를 5로 제한을 걸어주면 카메라는 0~10위치를 비추게 된다.

 

카메라 영역 제한 O

그러면 -5만큼 빈공간을 비추지 않고 게임씬에 타일맵만 출력하게 된다.