diff --git a/Assets/WL/Island/WLIslandBridge.cs b/Assets/WL/Island/WLIslandBridge.cs index 014f5b203..16c371cbe 100644 --- a/Assets/WL/Island/WLIslandBridge.cs +++ b/Assets/WL/Island/WLIslandBridge.cs @@ -233,6 +233,11 @@ namespace WL.Island var cfg = WLIslandSettings.Instance; if (cfg == null || cfg.enabled_ == 0) return; + // 2026-09-16 PD 「던전에서 섬으로 복귀하면 인게임 울타리가 남는다」 — 장벽 그림(HideAndDontSave · 씬 무관)은 씬을 바꿔도 살아남는다. + // 돌아가기 전에 장벽 상태를 닫고 그림을 즉시 반납한다(섬 진입 훅과 3 s 재훑기가 2·3중으로 다시 막는다). + WL.Combat.Stage.StageBarrier.Clear(); + WL.Combat.Stage.StageBarrierVisual.HideImmediate(); + if (InGameInfo.Ins != null) { // 🔴 WL-816i — 나갈 때도 마찬가지다(던전 씬이 내려가며 노드가 죽지 않게 미리 섬 것으로). diff --git a/Assets/WL/Island/WLIslandGateFlow.cs b/Assets/WL/Island/WLIslandGateFlow.cs index a7cdac5cf..9443afc59 100644 --- a/Assets/WL/Island/WLIslandGateFlow.cs +++ b/Assets/WL/Island/WLIslandGateFlow.cs @@ -92,6 +92,7 @@ namespace WL.Island HideIslandFences(cfg, scene, null); // 2026-09-15 Lead 실측(광선·전수 조회) — PD 화면의 「허공에 뜬 울타리·바위」 = 전투 스테이지 「보이는 장벽」(WL815c · HideAndDontSave)이 // 던전 → 섬 전환 뒤에도 남은 것. 섬 진입마다 즉시 풀에 반납한다(슬롯 없으면 비용 0). + WL.Combat.Stage.StageBarrier.Clear(); // 2026-09-16 — 던전에서 열린 채 돌아온 장벽 상태부터 닫는다 int barrier = WL.Combat.Stage.StageBarrierVisual.HideImmediate(); if (barrier > 0) WLIslandBridge.Log(cfg, "전투 장벽 그림 " + barrier + "개 즉시 정리(섬 진입)"); WLIslandTileFenceStrip.Apply(cfg, scene); // 2026-09-15 Lead 실측 — 타일 메시에 구워진 난간 제거 @@ -539,11 +540,14 @@ namespace WL.Island { float wait = Mathf.Max(0.5f, cfg.farmReHideDelaySeconds); // 섬이 살아 있는 동안 3 s 마다 계속 훑는다(이미 꺼진 것은 건너뛰어 비용 0에 가깝다) — 늦게 활성화되는 타일·밭까지 덮는다. - for (int k = 0; k < 400; k++) + // 2026-09-16 PD 「울타리가 또 보인다(던전 갔다 섬으로 복귀 후)」 실측 원인: 이 훑기가 400회(20분)에서 끝나 그 뒤 복귀한 장벽 그림을 아무도 안 지웠다 + // → 섬 씬이 살아 있는 동안 **무한** 반복(3 s 간격 · 지울 게 없으면 비용 0). 장벽 상태(StageBarrier)도 함께 닫아 재표시를 막는다. + for (;;) { yield return new WaitForSeconds(wait); if (cfg == null || cfg.hideIslandFences == 0 || !scene.IsValid() || !scene.isLoaded) yield break; HideIslandFences(cfg, scene, null); + WL.Combat.Stage.StageBarrier.Clear(); // 던전에서 열린 채 돌아온 장벽 상태 닫기(이미 닫혀 있으면 무동작) WL.Combat.Stage.StageBarrierVisual.HideImmediate(); // 늦게 페이드 중이던 전투 장벽 그림까지(슬롯 없으면 비용 0) WLIslandTileFenceStrip.Apply(cfg, scene); // 확장·재구성으로 타일 메시가 바뀌면 다시 잘라낸다(멱등) if (cfg.hideFarms != 0) { Vector3 _c; HideFarms(cfg, scene, out _c); } // 늦게 생긴 밭의 울타리·소품도 diff --git a/Assets/WL/Island/WLIslandSettings.cs b/Assets/WL/Island/WLIslandSettings.cs index 8e2bef870..01edda2ab 100644 --- a/Assets/WL/Island/WLIslandSettings.cs +++ b/Assets/WL/Island/WLIslandSettings.cs @@ -561,7 +561,7 @@ namespace WL.Island label = "상인 설치", price = 30, platformFromDungeonRow = 1, // 기존 발판 #2 좌표 kind = "prefab", - scale = 0.5f, // 2026-09-16 PD 「상인 프랍 크기 50 %」 + scale = 0.6f, // 2026-09-16 PD 「상인 프랍 크기 50 %」 → 「20 % 더 키워」 = 0.6 prefabPath = "Assets/FarmingIsland/Prefabs/Buildings/Stall01.prefab", extraPrefabPath = "Assets/FarmingIsland/Prefabs/Characters/Merchant.prefab", extraSkipIfComponent = "Merchant", // 좌판 안에 이미 상인이 있으면 안 덧붙인다 diff --git a/Assets/WL/Look/Farm/WLDemoTerrain.cs b/Assets/WL/Look/Farm/WLDemoTerrain.cs index 14ea46e87..db2897cd1 100644 --- a/Assets/WL/Look/Farm/WLDemoTerrain.cs +++ b/Assets/WL/Look/Farm/WLDemoTerrain.cs @@ -360,8 +360,10 @@ namespace WL.Look.Farm // 2) TerrainData·Terrain — 해상도가 바뀌면 새로 만들고, 아니면 크기·위치만 옮긴다 EnsureData(hRes, aRes); - _data.size = new Vector3(w, span, l); - _child.transform.position = new Vector3(ox, bottom, oz); + var newSize = new Vector3(w, span, l); + if ((_data.size - newSize).sqrMagnitude > 1e-6f) _data.size = newSize; // 바뀔 때만(재대입 = 내부 재생성 → 프레임 빔) + var newPos = new Vector3(ox, bottom, oz); + if ((_child.transform.position - newPos).sqrMagnitude > 1e-6f) _child.transform.position = newPos; // 3) 거리장 — 테두리 선분 · 열기 연산 링(타일 가장자리에 맞춘 격자 · 칸 ≤ 스플랫 텍셀) BuildEdges(size, half); @@ -474,10 +476,11 @@ namespace WL.Look.Farm if (layers == null || layers.Length != 2 || layers[0] != cfg.demoGrassLayer || layers[1] != cfg.demoDirtLayer) _data.terrainLayers = new[] { cfg.demoGrassLayer, cfg.demoDirtLayer }; // 층0 잔디 · 층1 모래(데모 TerrainLayer 에셋 참조) - _terrain.terrainData = _data; - _terrain.materialTemplate = cfg.demoTerrainMaterial; // 데모 Terrain.mat 그대로(값 무수정) - _terrain.drawInstanced = false; // Demo.unity 1228 m_DrawInstanced 0 · 그 외 Terrain 값은 데모 = 컴포넌트 기본값 - _terrain.allowAutoConnect = false; + // 🔴 2026-09-16 PD 「상인 생성 때 맵이 잠시 사라진 것처럼 보임」 — 같은 값을 다시 대입해도 Terrain 이 내부 상태를 다시 만들어 한 프레임 비는 것을 막는다(바뀔 때만 대입). + if (_terrain.terrainData != _data) _terrain.terrainData = _data; + if (_terrain.materialTemplate != cfg.demoTerrainMaterial) _terrain.materialTemplate = cfg.demoTerrainMaterial; // 데모 Terrain.mat 그대로(값 무수정) + if (_terrain.drawInstanced) _terrain.drawInstanced = false; // Demo.unity 1228 m_DrawInstanced 0 · 그 외 Terrain 값은 데모 = 컴포넌트 기본값 + if (_terrain.allowAutoConnect) _terrain.allowAutoConnect = false; } // ─────────────────────────────────────────────────────────────────