diff --git a/Assets/WL/Island/Resources/WL/WLIslandSettings.asset b/Assets/WL/Island/Resources/WL/WLIslandSettings.asset index 66858cd3a..33e0d59f7 100644 --- a/Assets/WL/Island/Resources/WL/WLIslandSettings.asset +++ b/Assets/WL/Island/Resources/WL/WLIslandSettings.asset @@ -81,7 +81,9 @@ MonoBehaviour: dungeonCameraMatchIsland: 1 camPitch: 45 camYaw: 0 - camDistance: 15 + camDistance: 22 + islandCamDistance: 15 + islandVcamName: PlayerVirtualCamera dungeonCamDistance: 13 camFov: 60 camLookHeight: 0 diff --git a/Assets/WL/Island/WLIslandSceneSetup.cs b/Assets/WL/Island/WLIslandSceneSetup.cs index 10ae52b23..bca0356d5 100644 --- a/Assets/WL/Island/WLIslandSceneSetup.cs +++ b/Assets/WL/Island/WLIslandSceneSetup.cs @@ -78,6 +78,7 @@ namespace WL.Island // ───────────────────────────────────────────────────────────────── public static void FixDuplicates(WLIslandSettings cfg, Scene scene) { + ApplyIslandCameraDistance(cfg, scene); // 2026-09-15 PD 「섬과 던전 모두 좀 더 가까이」 — 섬 카메라 거리(SO) if (cfg.fixIslandDuplicates == 0) return; HideWlPc(cfg); @@ -116,6 +117,32 @@ namespace WL.Island " · AudioListener 해제 " + ListenersFixed); } + // ───────────────────────────────────────────────────────────────── + // ②-b 섬 카메라 거리 — FI `PlayerVirtualCamera` 의 CinemachineFramingTransposer.m_CameraDistance(씬 값 22)를 + // 섬 로드 때 SO 값으로 덮는다(2026-09-15 PD 「섬과 던전 모두 좀 더 가까이」 · FI 씬·코드 0줄). + // `islandCamDistance` 0 이하면 무동작 = 씬 값 그대로(되돌리기). + // ───────────────────────────────────────────────────────────────── + public static int IslandCamApplied; + + public static void ApplyIslandCameraDistance(WLIslandSettings cfg, Scene scene) + { + if (cfg == null || cfg.islandCamDistance <= 0f) return; + var vcams = Object.FindObjectsByType(FindObjectsSortMode.None); + for (int i = 0; i < vcams.Length; i++) + { + var v = vcams[i]; + if (v == null || v.gameObject.scene != scene) continue; + if (!string.IsNullOrEmpty(cfg.islandVcamName) && v.name != cfg.islandVcamName) continue; + var ft = v.GetCinemachineComponent(); + if (ft == null) continue; + float was = ft.m_CameraDistance; + ft.m_CameraDistance = cfg.islandCamDistance; + IslandCamApplied++; + WLIslandBridge.Log(cfg, "섬 카메라 거리 — " + v.name + " " + was.ToString("F1") + " → " + + cfg.islandCamDistance.ToString("F1") + " m"); + } + } + static readonly List s_disabledCams = new List(4); static readonly List s_disabledListeners = new List(4); diff --git a/Assets/WL/Island/WLIslandSettings.cs b/Assets/WL/Island/WLIslandSettings.cs index ce4655aa7..c8f276921 100644 --- a/Assets/WL/Island/WLIslandSettings.cs +++ b/Assets/WL/Island/WLIslandSettings.cs @@ -332,6 +332,14 @@ namespace WL.Island "🔴 섬은 이 값을 쓰지 않는다(FI Cinemachine 이 스스로 잡는다) — 기준 기록용이자 아래 던전 값의 기본값이다.")] public float camDistance = 22f; + [Tooltip("🔴 **섬 전용** 카메라 거리(m) — 2026-09-15 PD 「섬과 던전 모두 좀 더 가까이」. FI `PlayerVirtualCamera` 의 " + + "CinemachineFramingTransposer.m_CameraDistance(씬 값 22)를 섬 로드 때 이 값으로 덮는다(FI 씬·코드 0줄). " + + "0 이하면 무동작(= 씬 값 22 그대로).")] + public float islandCamDistance = 15f; + + [Tooltip("위 섬 거리를 적용할 FI 가상 카메라 이름. 비우면 섬 씬의 FramingTransposer 전부.")] + public string islandVcamName = "PlayerVirtualCamera"; + [Tooltip("🔴 **던전 전용** 카메라 거리(m) — WL-816i2 · PD 「던전에서는 카메라를 조금만 더 당기자」. " + "0 이하면 위 섬 값(22)을 그대로 쓴다. 각도 45°·yaw 0°·FOV 60 은 섬과 같게 유지하고 **거리만** 줄인다. " + "섬은 이 값에 전혀 영향받지 않는다.")]