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
|
||||
}
|
||||
}
|
||||
|
||||
// 프리셋별 초기 상태 저장
|
||||
[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);
|
||||
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user