Develog
로그인

[Unity] 해상도에 따른 카메라 거리 조절

muchan
muchan
∙2026년 5월 22일∙조회 17
Unity
[Unity] 해상도에 따른 카메라 거리 조절
유니티 공부 기록
본문 로딩 중...
이전 글[Unity] Safe Area
다음 글[Unity] 오브젝트 투명화 처리
1
muchan

게임 버그도 콘텐츠입니다.

새 글이 올라오면 Develog 알림으로 알려드려요

댓글 0

개요

3인칭 쿼터뷰 게임에서 Cinemachine을 사용하다가 해상도를 바꿔보는데 Distance가 일정하여 특정 해상도에서는 플레이어가 너무 커보이고, 특정 해상도에서는 플레이어가 너무 작아보이는 현상이 발생했다.

이런 시점에서 시뮬레이터를 테블릿으로 바꾸면

뭔가 다른 느낌이 좀 있다

그래서 해상도 비율에 맞춰 카메라를 이동 시키는 코드를 작성해 보았다.

csharp
using Cinemachine;
using UnityEngine;

[ExecuteAlways]
public class SafeAreaCameraAdjuster : MonoBehaviour
{
    [SerializeField]
    private CinemachineVirtualCamera virtualCamera;

    [SerializeField]
    private float baseDistance = 8f;

    [SerializeField]
    private float distanceAdjustRange = 2f;

    private CinemachineFramingTransposer framingTransposer;
    private Rect lastSafeArea = Rect.zero;
    private Vector2Int lastScreenSize = Vector2Int.zero;

    private void Awake()
    {
        framingTransposer = virtualCamera.GetCinemachineComponent<CinemachineFramingTransposer>();
    }

    private void OnEnable()
    {
        Apply();
    }

    private void Update()
    {
        Vector2Int screenSize = new Vector2Int(Screen.width, Screen.height);
        if (Screen.safeArea == lastSafeArea && screenSize == lastScreenSize)
            return;

        Apply();
    }

    private void Apply()
    {
        if (framingTransposer == null)
            return;

        Rect safeArea = Screen.safeArea;
        Vector2Int screenSize = new Vector2Int(Screen.width, Screen.height);

        if (screenSize.x == 0 || screenSize.y == 0)
            return;

        lastSafeArea = safeArea;
        lastScreenSize = screenSize;

        float aspectRatio = (float)screenSize.x / screenSize.y;
        float baseAspect = 16f / 9f;

        // 태블릿(비율 작음) → 양수 → 멀어짐
        // 폰(비율 큼) → 음수 → 가까워짐
        float aspectDiff = baseAspect - aspectRatio;
        float distanceOffset = aspectDiff * distanceAdjustRange;
        distanceOffset = Mathf.Clamp(distanceOffset, -distanceAdjustRange, distanceAdjustRange);

        float finalDistance = baseDistance + distanceOffset;

        // Debug.Log(
        //     $"aspectRatio: {aspectRatio}, distanceOffset: {distanceOffset}, finalDistance: {finalDistance}"
        // );

        framingTransposer.m_CameraDistance = finalDistance;
    }
}
  • Unity 의 화면 비율(Screen Aspect Ratio)에 따라 카메라 거리를 자동 조절
  • Cinemachine 의 CinemachineFramingTransposer를 사용해 카메라 거리 변경
  • Screen.safeArea와 화면 크기 변화를 감지해 필요할 때만 갱신
  • 16:9 비율을 기준으로 현재 기기의 화면 비율과 비교
  • 태블릿처럼 화면이 넓은 경우 카메라를 멀리 배치
  • 세로로 긴 스마트폰은 카메라를 가까이 배치
  • Mathf.Clamp()로 거리 변화 범위를 제한해 과도한 줌 방지
  • [ExecuteAlways]를 사용해 에디터에서도 실시간 확인 가능
  • 다양한 모바일 기기에서 비슷한 화면 구성을 유지하기 위한 목적의 코드

사용 안할때

사용했을 때

크게 차이가 없는 것 같지만 최대 거리, 최소 거리를 조절해서 사용하면 나중에 도움될 수 있을 것 같아 정리해봤습니다.

 

댓글 0

댓글을 작성하려면 로그인이 필요합니다.

아직 댓글이 없습니다. 첫 번째 댓글을 작성해보세요.

관련 글

[Unity] 제네릭의 컴파일

[Unity] 제네릭의 컴파일

ㅇㅇ

10월 7일42
[Unity] 제네릭과 가변성(variance)

[Unity] 제네릭과 가변성(variance)

제네릭과 가변성

10월 6일821
[Unity] IEnumerator 개요

[Unity] IEnumerator 개요

코루틴에이저포에버

10월 6일4
[Unity] 제네릭의 컴파일
Unity

NEW[Unity] 제네릭의 컴파일

ㅇㅇ

KYO
KYO
420
KYO
KYO
∙10월 7일
420
[Unity] 제네릭과 가변성(variance)
Unity

[Unity] 제네릭과 가변성(variance)

제네릭과 가변성

KYO
KYO
821
KYO
KYO
∙10월 6일
821
[Unity] IEnumerator 개요
Unity

[Unity] IEnumerator 개요

코루틴에이저포에버

KYO
KYO
400
KYO
KYO
∙10월 6일
400