Fix: 카메라 전환 시 마우스 조작 위치가 리셋되는 문제 수정

카메라 전환 후 다시 돌아왔을 때 마우스로 조작한 orbit 상태(각도, 거리, 초점)가
유지되도록 프리셋별로 orbit 상태를 저장/복원하는 기능 추가

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
This commit is contained in:
DESKTOP-S4BOTN2\user 2026-01-18 16:15:26 +09:00
parent 0134d541f7
commit e1ebb55921

View File

@ -152,10 +152,17 @@ public class CameraManager : MonoBehaviour, IController
}
}
// 프리셋별 초기 상태 저장
[System.NonSerialized] public Vector3 savedPosition;
[System.NonSerialized] public Quaternion savedRotation;
[System.NonSerialized] public bool hasSavedState = false;
// 프리셋별 초기 상태 저장 (Alt+Q 복원용)
[System.NonSerialized] public Vector3 initialPosition;
[System.NonSerialized] public Quaternion initialRotation;
[System.NonSerialized] public bool hasInitialState = false;
// 프리셋별 orbit 상태 저장 (카메라 전환 시 유지용)
[System.NonSerialized] public float savedHorizontalAngle;
[System.NonSerialized] public float savedVerticalAngle;
[System.NonSerialized] public float savedDistance;
[System.NonSerialized] public Vector3 savedFocusPoint;
[System.NonSerialized] public bool hasOrbitState = false;
public CameraPreset(CinemachineCamera camera)
{
@ -167,19 +174,41 @@ public class CameraManager : MonoBehaviour, IController
public bool IsValid() => virtualCamera != null && hotkey != null;
public void SaveCurrentState()
// 초기 상태 저장 (Alt+Q 복원용)
public void SaveInitialState()
{
if (virtualCamera == null) return;
savedPosition = virtualCamera.transform.position;
savedRotation = virtualCamera.transform.rotation;
hasSavedState = true;
initialPosition = virtualCamera.transform.position;
initialRotation = virtualCamera.transform.rotation;
hasInitialState = true;
}
public void RestoreSavedState()
// 초기 상태 복원 (Alt+Q)
public void RestoreInitialState()
{
if (!hasSavedState || virtualCamera == null) return;
virtualCamera.transform.position = savedPosition;
virtualCamera.transform.rotation = savedRotation;
if (!hasInitialState || virtualCamera == null) return;
virtualCamera.transform.position = initialPosition;
virtualCamera.transform.rotation = initialRotation;
}
// orbit 상태 저장 (카메라 전환 시)
public void SaveOrbitState(float hAngle, float vAngle, float dist, Vector3 focus)
{
savedHorizontalAngle = hAngle;
savedVerticalAngle = vAngle;
savedDistance = dist;
savedFocusPoint = focus;
hasOrbitState = true;
}
// orbit 상태 복원 (카메라 전환 시)
public bool TryRestoreOrbitState(out float hAngle, out float vAngle, out float dist, out Vector3 focus)
{
hAngle = savedHorizontalAngle;
vAngle = savedVerticalAngle;
dist = savedDistance;
focus = savedFocusPoint;
return hasOrbitState;
}
}
#endregion
@ -367,9 +396,9 @@ public class CameraManager : MonoBehaviour, IController
// 모든 프리셋의 초기 상태 저장
foreach (var preset in cameraPresets.Where(p => p?.IsValid() == true))
{
if (!preset.hasSavedState)
if (!preset.hasInitialState)
{
preset.SaveCurrentState();
preset.SaveInitialState();
}
}
@ -662,11 +691,12 @@ public class CameraManager : MonoBehaviour, IController
private void RestoreInitialCameraState()
{
if (currentPreset == null || !currentPreset.hasSavedState) return;
if (currentPreset == null || !currentPreset.hasInitialState) return;
currentPreset.RestoreSavedState();
currentPreset.RestoreInitialState();
// 각도 상태 다시 초기화
// orbit 상태도 리셋 (초기 위치 기반으로 다시 계산)
currentPreset.hasOrbitState = false;
InitializeOrbitState();
}
#endregion
@ -727,11 +757,37 @@ public class CameraManager : MonoBehaviour, IController
var oldPreset = currentPreset;
var newCameraName = newPreset.virtualCamera?.gameObject.name ?? "Unknown";
// 이전 프리셋의 orbit 상태 저장
if (oldPreset != null && oldPreset.allowMouseControl)
{
oldPreset.SaveOrbitState(targetHorizontalAngle, targetVerticalAngle, targetDistance, targetFocusPoint);
}
currentPreset = newPreset;
UpdateCameraPriorities(newPreset.virtualCamera);
// 오빗 상태 초기화 (각도, 거리 계산)
InitializeOrbitState();
// 새 프리셋의 orbit 상태 복원 또는 초기화
if (newPreset.hasOrbitState && newPreset.allowMouseControl)
{
// 저장된 orbit 상태 복원
if (newPreset.TryRestoreOrbitState(out float hAngle, out float vAngle, out float dist, out Vector3 focus))
{
targetHorizontalAngle = hAngle;
targetVerticalAngle = vAngle;
targetDistance = dist;
targetFocusPoint = focus;
horizontalAngle = hAngle;
verticalAngle = vAngle;
currentDistance = dist;
focusPoint = focus;
}
}
else
{
// 첫 진입 시 현재 카메라 위치 기반으로 초기화
InitializeOrbitState();
}
OnCameraChanged?.Invoke(oldPreset, newPreset);