[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)
본문 로딩 중...
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]를 사용해 에디터에서도 실시간 확인 가능



크게 차이가 없는 것 같지만 최대 거리, 최소 거리를 조절해서 사용하면 나중에 도움될 수 있을 것 같아 정리해봤습니다.
댓글을 작성하려면 로그인이 필요합니다.
아직 댓글이 없습니다. 첫 번째 댓글을 작성해보세요.
ㅇㅇ
![[Unity] 제네릭과 가변성(variance)](https://data.develog.develrocket.com/upload/develog/gmumdev/1791297148427-udtfz5/_____.png)
제네릭과 가변성
![[Unity] IEnumerator 개요](https://data.develog.develrocket.com/upload/develog/gmumdev/1791297506756-dx8ros/_____.png)
코루틴에이저포에버
![[Unity] 제네릭과 가변성(variance)](https://data.develog.develrocket.com/upload/develog/gmumdev/1791297148427-udtfz5/_____.png)
![[Unity] IEnumerator 개요](https://data.develog.develrocket.com/upload/develog/gmumdev/1791297506756-dx8ros/_____.png)