Fix: 카메라 전환 시 마우스 조작 위치가 리셋되는 문제 수정
카메라 전환 후 다시 돌아왔을 때 마우스로 조작한 orbit 상태(각도, 거리, 초점)가 유지되도록 프리셋별로 orbit 상태를 저장/복원하는 기능 추가 Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
This commit is contained in:
parent
0134d541f7
commit
e1ebb55921
@ -152,10 +152,17 @@ public class CameraManager : MonoBehaviour, IController
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// 프리셋별 초기 상태 저장
|
// 프리셋별 초기 상태 저장 (Alt+Q 복원용)
|
||||||
[System.NonSerialized] public Vector3 savedPosition;
|
[System.NonSerialized] public Vector3 initialPosition;
|
||||||
[System.NonSerialized] public Quaternion savedRotation;
|
[System.NonSerialized] public Quaternion initialRotation;
|
||||||
[System.NonSerialized] public bool hasSavedState = false;
|
[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)
|
public CameraPreset(CinemachineCamera camera)
|
||||||
{
|
{
|
||||||
@ -167,19 +174,41 @@ public class CameraManager : MonoBehaviour, IController
|
|||||||
|
|
||||||
public bool IsValid() => virtualCamera != null && hotkey != null;
|
public bool IsValid() => virtualCamera != null && hotkey != null;
|
||||||
|
|
||||||
public void SaveCurrentState()
|
// 초기 상태 저장 (Alt+Q 복원용)
|
||||||
|
public void SaveInitialState()
|
||||||
{
|
{
|
||||||
if (virtualCamera == null) return;
|
if (virtualCamera == null) return;
|
||||||
savedPosition = virtualCamera.transform.position;
|
initialPosition = virtualCamera.transform.position;
|
||||||
savedRotation = virtualCamera.transform.rotation;
|
initialRotation = virtualCamera.transform.rotation;
|
||||||
hasSavedState = true;
|
hasInitialState = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
public void RestoreSavedState()
|
// 초기 상태 복원 (Alt+Q)
|
||||||
|
public void RestoreInitialState()
|
||||||
{
|
{
|
||||||
if (!hasSavedState || virtualCamera == null) return;
|
if (!hasInitialState || virtualCamera == null) return;
|
||||||
virtualCamera.transform.position = savedPosition;
|
virtualCamera.transform.position = initialPosition;
|
||||||
virtualCamera.transform.rotation = savedRotation;
|
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
|
#endregion
|
||||||
@ -367,9 +396,9 @@ public class CameraManager : MonoBehaviour, IController
|
|||||||
// 모든 프리셋의 초기 상태 저장
|
// 모든 프리셋의 초기 상태 저장
|
||||||
foreach (var preset in cameraPresets.Where(p => p?.IsValid() == true))
|
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()
|
private void RestoreInitialCameraState()
|
||||||
{
|
{
|
||||||
if (currentPreset == null || !currentPreset.hasSavedState) return;
|
if (currentPreset == null || !currentPreset.hasInitialState) return;
|
||||||
|
|
||||||
currentPreset.RestoreSavedState();
|
currentPreset.RestoreInitialState();
|
||||||
|
|
||||||
// 각도 상태 다시 초기화
|
// orbit 상태도 리셋 (초기 위치 기반으로 다시 계산)
|
||||||
|
currentPreset.hasOrbitState = false;
|
||||||
InitializeOrbitState();
|
InitializeOrbitState();
|
||||||
}
|
}
|
||||||
#endregion
|
#endregion
|
||||||
@ -727,11 +757,37 @@ public class CameraManager : MonoBehaviour, IController
|
|||||||
var oldPreset = currentPreset;
|
var oldPreset = currentPreset;
|
||||||
var newCameraName = newPreset.virtualCamera?.gameObject.name ?? "Unknown";
|
var newCameraName = newPreset.virtualCamera?.gameObject.name ?? "Unknown";
|
||||||
|
|
||||||
|
// 이전 프리셋의 orbit 상태 저장
|
||||||
|
if (oldPreset != null && oldPreset.allowMouseControl)
|
||||||
|
{
|
||||||
|
oldPreset.SaveOrbitState(targetHorizontalAngle, targetVerticalAngle, targetDistance, targetFocusPoint);
|
||||||
|
}
|
||||||
|
|
||||||
currentPreset = newPreset;
|
currentPreset = newPreset;
|
||||||
UpdateCameraPriorities(newPreset.virtualCamera);
|
UpdateCameraPriorities(newPreset.virtualCamera);
|
||||||
|
|
||||||
// 오빗 상태 초기화 (각도, 거리 계산)
|
// 새 프리셋의 orbit 상태 복원 또는 초기화
|
||||||
InitializeOrbitState();
|
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);
|
OnCameraChanged?.Invoke(oldPreset, newPreset);
|
||||||
|
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user