diff --git a/Assets/Scripts/Streamingle/StreamingleControl/Controllers/CameraController.cs b/Assets/Scripts/Streamingle/StreamingleControl/Controllers/CameraController.cs index e165c7a3..d1e9bf3a 100644 --- a/Assets/Scripts/Streamingle/StreamingleControl/Controllers/CameraController.cs +++ b/Assets/Scripts/Streamingle/StreamingleControl/Controllers/CameraController.cs @@ -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);