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

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

개요

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]를 사용해 에디터에서도 실시간 확인 가능
  • 다양한 모바일 기기에서 비슷한 화면 구성을 유지하기 위한 목적의 코드

사용 안할때

사용했을 때

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