diff --git a/Assets/WL/Island/Resources/WL/WLIslandSettings.asset b/Assets/WL/Island/Resources/WL/WLIslandSettings.asset index a5a83d19f..8748f53ad 100644 --- a/Assets/WL/Island/Resources/WL/WLIslandSettings.asset +++ b/Assets/WL/Island/Resources/WL/WLIslandSettings.asset @@ -74,7 +74,7 @@ MonoBehaviour: sceneName: WL_Dungeon01 mapId: 903 stageIndex: 12 - gatePosition: {x: -3, y: 0, z: 10.5} + gatePosition: {x: 2.5, y: 0, z: 11} gateYaw: 180 gateScale: 1 gateColor: {r: 0.62, g: 0.42, b: 0.24, a: 1} diff --git a/Assets/WL/Island/WLDungeonSceneSetup.cs b/Assets/WL/Island/WLDungeonSceneSetup.cs index 36d9d252d..94688c04e 100644 --- a/Assets/WL/Island/WLDungeonSceneSetup.cs +++ b/Assets/WL/Island/WLDungeonSceneSetup.cs @@ -93,17 +93,25 @@ namespace WL.Island // ───────────────────────────────────────────────────────────────── static void BakeNavMesh(WLIslandSettings cfg, Scene scene) { - var existing = Object.FindFirstObjectByType(); - if (existing != null) { existing.BuildNavMesh(); NavBakes++; return; } - - var go = new GameObject("~WL_DungeonNavMesh"); - SceneManager.MoveGameObjectToScene(go, scene); - var surf = go.AddComponent(); - // collectObjects = All · useGeometry = RenderMeshes 는 NavMeshSurface 기본값 그대로 쓴다 - // (아레나 바닥에 콜라이더가 없어도 렌더 메시로 베이크된다 · 패키지 실측 NavMeshSurface.cs:54·66) + var surf = Object.FindFirstObjectByType(); + if (surf == null) + { + var go = new GameObject("~WL_DungeonNavMesh"); + SceneManager.MoveGameObjectToScene(go, scene); + surf = go.AddComponent(); + } + // 🔴 기본값(RenderMeshes)은 메시마다 Read/Write 를 요구해 콘솔 에러 100건이 난다(실측). + // 콜라이더 기준으로 베이크하면 임포트 설정을 하나도 건드리지 않고 조용히 끝난다. + surf.useGeometry = UnityEngine.AI.NavMeshCollectGeometry.PhysicsColliders; surf.BuildNavMesh(); NavBakes++; - WLIslandBridge.Log(cfg, "던전 NavMesh 런타임 베이크 완료"); + + UnityEngine.AI.NavMeshHit hit; + var def = StageDefOf(WLDungeonSceneSetup.Current); + Vector3 probe = def != null ? def.anchor : Vector3.zero; + bool onMesh = UnityEngine.AI.NavMesh.SamplePosition(probe, out hit, 6f, UnityEngine.AI.NavMesh.AllAreas); + WLIslandBridge.Log(cfg, "던전 NavMesh 런타임 베이크 완료 — 앵커 " + probe.ToString("F1") + + " 위 NavMesh " + (onMesh ? ("있음(" + hit.position.ToString("F2") + ")") : "🔴 없음")); } // ───────────────────────────────────────────────────────────────── diff --git a/Assets/WL/Island/WLIslandBridge.cs b/Assets/WL/Island/WLIslandBridge.cs index 478214b67..517819b4a 100644 --- a/Assets/WL/Island/WLIslandBridge.cs +++ b/Assets/WL/Island/WLIslandBridge.cs @@ -168,6 +168,7 @@ namespace WL.Island if (cfg == null || d == null) return; EnsureRunner(); + WLIslandPrompt.Hide(); WLDungeonSceneSetup.Pending = d; WLIslandSceneSetup.RestoreDuplicates(); diff --git a/Assets/WL/Island/WLIslandSceneSetup.cs b/Assets/WL/Island/WLIslandSceneSetup.cs index 9e773dd9b..893da5995 100644 --- a/Assets/WL/Island/WLIslandSceneSetup.cs +++ b/Assets/WL/Island/WLIslandSceneSetup.cs @@ -339,6 +339,28 @@ namespace WL.Island { static readonly Dictionary s_cache = new Dictionary(4); + static TMPro.TMP_FontAsset s_font; + static bool s_fontTried; + + /// 이름표·버튼용 한글 폰트(없으면 null = TMP 기본 폰트). + public static TMPro.TMP_FontAsset Font(string path) + { + if (s_fontTried) return s_font; + s_fontTried = true; + if (string.IsNullOrEmpty(path)) return null; +#if UNITY_EDITOR + s_font = UnityEditor.AssetDatabase.LoadAssetAtPath(path); + if (s_font != null) return s_font; +#endif + try + { + var h = UnityEngine.AddressableAssets.Addressables.LoadAssetAsync(path); + s_font = h.WaitForCompletion(); + } + catch (System.Exception) { s_font = null; } + return s_font; + } + public static GameObject LoadPrefab(string path) { if (string.IsNullOrEmpty(path)) return null; diff --git a/Assets/WL/Island/WLIslandSettings.cs b/Assets/WL/Island/WLIslandSettings.cs index f4e63f782..866889b73 100644 --- a/Assets/WL/Island/WLIslandSettings.cs +++ b/Assets/WL/Island/WLIslandSettings.cs @@ -160,6 +160,9 @@ namespace WL.Island [Tooltip("입구 더미 기본 폭(m).")] public float gateWidth = 2.4f; + [Tooltip("이름표·버튼에 쓸 TMP 폰트(한글 포함). 비우면 TMP 기본 폰트 — 기본 폰트에는 한글 글리프가 없어 □ 로 나온다.")] + public string fontAssetPath = "Assets/ThirdParty/TextMesh Pro/Addressables/Fonts & Materials/Font SDF.asset"; + // ───────────────────────────────── 보상 [Header("보상 (던전 클리어 → 섬 코인)")] [Tooltip("0 이면 보상을 주지 않는다.")] diff --git a/Assets/WL/Island/WLIslandUi.cs b/Assets/WL/Island/WLIslandUi.cs index 832c85fe9..618cac163 100644 --- a/Assets/WL/Island/WLIslandUi.cs +++ b/Assets/WL/Island/WLIslandUi.cs @@ -53,11 +53,14 @@ namespace WL.Island { public static void Attach(Transform parent, Vector3 localPos, string text) { + var cfg = WLIslandSettings.Instance; var go = new GameObject("label"); go.transform.SetParent(parent, false); go.transform.localPosition = localPos; var tmp = go.AddComponent(); + var f = WLIslandAssets.Font(cfg != null ? cfg.fontAssetPath : null); + if (f != null) tmp.font = f; tmp.text = text; tmp.fontSize = 3.2f; tmp.alignment = TextAlignmentOptions.Center; @@ -152,6 +155,8 @@ namespace WL.Island trt.offsetMin = Vector2.zero; trt.offsetMax = Vector2.zero; s_text = txtGo.AddComponent(); + var pf = WLIslandAssets.Font(cfg != null ? cfg.fontAssetPath : null); + if (pf != null) s_text.font = pf; s_text.fontSize = 44f; s_text.alignment = TextAlignmentOptions.Center; s_text.color = Color.white;