[Unity] 해상도에 따른 카메라 거리 조절
![[Unity] 해상도에 따른 카메라 거리 조절](/_next/image?url=https%3A%2F%2Fdata.develog.develrocket.com%2Fupload%2Fdevelog%2Fuser_1777093328305%2F1779451349404-keil4h%2F_____2026-05-22_205730.png&w=3840&q=75)
본문 로딩 중...
댓글 0
댓글을 작성하려면 로그인이 필요합니다.
아직 댓글이 없습니다. 첫 번째 댓글을 작성해보세요!
3인칭 쿼터뷰 게임에서 Cinemachine을 사용하다가 해상도를 바꿔보는데 Distance가 일정하여 특정 해상도에서는 플레이어가 너무 커보이고, 특정 해상도에서는 플레이어가 너무 작아보이는 현상이 발생했다.

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

뭔가 다른 느낌이 좀 있다
그래서 해상도 비율에 맞춰 카메라를 이동 시키는 코드를 작성해 보았다.
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;
}
}
CinemachineFramingTransposer를 사용해 카메라 거리 변경Screen.safeArea와 화면 크기 변화를 감지해 필요할 때만 갱신Mathf.Clamp()로 거리 변화 범위를 제한해 과도한 줌 방지[ExecuteAlways]를 사용해 에디터에서도 실시간 확인 가능



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