diff --git a/Assets/WL/Look/Farm/WLIslandLook.cs b/Assets/WL/Look/Farm/WLIslandLook.cs
index 473ce2324..a1f1714d7 100644
--- a/Assets/WL/Look/Farm/WLIslandLook.cs
+++ b/Assets/WL/Look/Farm/WLIslandLook.cs
@@ -134,6 +134,7 @@ namespace WL.Look.Farm
// ๐ด 816zf โ ํ ๋ฐ์นผ์ **ํ๋ณด๋ค ๋จผ์ ** ๋ง๋ ๋ค. ํ์ ๋ฐญ ์ ์ธ๊ฐ ์ด ๋ง์คํฌ๋ฅผ ์ฝ๊ธฐ ๋๋ฌธ์ด๋ค.
if (cfg.softDirtEnabled != 0) SpawnSoftDirt(cfg, scene);
+ if (cfg.seabedEnabled != 0) SpawnSeabed(cfg, scene);
if (cfg.grassEnabled != 0) SpawnGrass(cfg, scene);
if (cfg.shoreFoamEnabled != 0) SpawnShoreFoam(cfg, scene);
@@ -305,6 +306,59 @@ namespace WL.Look.Farm
SoftDirtSpawned = true;
}
+ public static bool SeabedSpawned;
+ public static string SeabedLog = "";
+
+ ///
+ /// 2026-09-15 Lead ์ค์ธก โ ๋ฐ๋ชจ ๋ฌผ ์
ฐ์ด๋(`Farm_Water_Demo3` = ๋ฐ๋ชจ `Water.mat`)๋ **๊น์ด**๋ก ์ยท๊ฑฐํ์ ์ ํ๋ค.
+ /// ๋ฐ๋ชจ ์ฐ๋ชป์ ๋ฐ๋ฅ์ด 1 m ์ํ์ด๋ผ ์ฒญ๋ก + ํฐ ๋ฌผ๊ฐ๊ฐ ๋์ค์ง๋ง, ์ฐ๋ฆฌ ๋ฐ๋ค๋ ๋ฐ์ ์๋ฌด๊ฒ๋ ์์ด ์นด๋ฉ๋ผ ๋ฐฐ๊ฒฝ์์ด ๋น์ณ
+ /// ์งํ๋์ผ๋ก ์ฐํ๋ค(PD ใ๋ฐ๋ชจ์ ๋๋์ด ๋ค๋ฅด๋คใ์ ํฐ ๋ชซ). ๋ฌผ ์๋ `seabedDepth` ์ ๋ชจ๋์ ์ธ๋ฆฟ ํ 1์ฅ(์ผ๊ฐํ 2 ยท ๋๋ก์ฐ์ฝ 1)์ ๊น๋ค.
+ /// ๐ด ๋ชจ๋ฐ์ผ ๋น๋: `Universal Render Pipeline/Unlit` ์ด ๋น๋์ ํฌํจ๋์ง ์์ผ๋ฉด ๋ถํ โ Always Included ํ์ธ.
+ ///
+ public static void SpawnSeabed(WLIslandLookSettings cfg, Scene scene)
+ {
+ const string Name = "~WL_Seabed";
+ float waterY = -1f; bool found = false;
+ var mrs = Object.FindObjectsByType(FindObjectsInactive.Include, FindObjectsSortMode.None);
+ for (int i = 0; i < mrs.Length; i++)
+ {
+ var r = mrs[i];
+ if (r == null || r.gameObject.name != "Water" || (scene.IsValid() && r.gameObject.scene != scene)) continue;
+ waterY = r.transform.position.y; found = true; break;
+ }
+ GameObject go = null;
+ for (int i = 0; i < mrs.Length; i++) if (mrs[i] != null && mrs[i].gameObject.name == Name) { go = mrs[i].gameObject; break; }
+ if (go == null)
+ {
+ go = new GameObject(Name);
+ if (scene.IsValid()) SceneManager.MoveGameObjectToScene(go, scene);
+ var mf = go.AddComponent();
+ var mesh = new Mesh { name = "WL_SeabedQuad" };
+ mesh.vertices = new[] { new Vector3(-0.5f, 0f, -0.5f), new Vector3(-0.5f, 0f, 0.5f), new Vector3(0.5f, 0f, 0.5f), new Vector3(0.5f, 0f, -0.5f) };
+ mesh.triangles = new[] { 0, 1, 2, 0, 2, 3 };
+ mesh.normals = new[] { Vector3.up, Vector3.up, Vector3.up, Vector3.up };
+ mesh.uv = new[] { Vector2.zero, Vector2.up, Vector2.one, Vector2.right };
+ mesh.RecalculateBounds();
+ mf.sharedMesh = mesh;
+ var mr = go.AddComponent();
+ var sh = Shader.Find("Universal Render Pipeline/Unlit");
+ var mat = new Material(sh != null ? sh : Shader.Find("Unlit/Color")) { name = "WL_Seabed(runtime)" };
+ mr.sharedMaterial = mat;
+ mr.shadowCastingMode = UnityEngine.Rendering.ShadowCastingMode.Off;
+ mr.receiveShadows = false;
+ mr.lightProbeUsage = UnityEngine.Rendering.LightProbeUsage.Off;
+ }
+ var m = go.GetComponent().sharedMaterial;
+ if (m.HasProperty("_BaseColor")) m.SetColor("_BaseColor", cfg.seabedColor);
+ if (m.HasProperty("_Color")) m.SetColor("_Color", cfg.seabedColor);
+ go.transform.position = new Vector3(0f, waterY - Mathf.Max(0.05f, cfg.seabedDepth), 0f);
+ go.transform.rotation = Quaternion.identity;
+ go.transform.localScale = new Vector3(Mathf.Max(1f, cfg.seabedSize), 1f, Mathf.Max(1f, cfg.seabedSize));
+ go.SetActive(cfg.seabedEnabled != 0);
+ SeabedSpawned = true;
+ SeabedLog = "๋ฐ๋ค ๋ฐ๋ฅํ y=" + go.transform.position.y.ToString("F2") + (found ? "(๋ฌผ " + waterY.ToString("F2") + ")" : "(๋ฌผ ๋ฏธ๋ฐ๊ฒฌ ยท ๊ธฐ๋ณธ -1)") + " ยท ๊น์ด " + cfg.seabedDepth + " m";
+ }
+
/// ์ฌ ๋๋ ๊ฑฐํ ๋ โ ํ๊ณผ ๊ฐ์ ์๋ฆฌ์์ ๋ง๋ค๊ณ ๊ฐ์ ํ
์ผ๋ก ๋ค์ ๋ง๋ ๋ค(816j2).
public static void SpawnShoreFoam(WLIslandLookSettings cfg, Scene scene)
{
diff --git a/Assets/WL/Look/Farm/WLIslandLookSettings.cs b/Assets/WL/Look/Farm/WLIslandLookSettings.cs
index a7dfe1773..a0bc3f118 100644
--- a/Assets/WL/Look/Farm/WLIslandLookSettings.cs
+++ b/Assets/WL/Look/Farm/WLIslandLookSettings.cs
@@ -292,6 +292,20 @@ namespace WL.Look.Farm
[Tooltip("ํ ์ผ๋ฃฉ์ ์ธ๊ธฐ(0~1). ํ ๋ฉ์ด๋ฆฌ ๋จ์์ผ๋ก ๋ณด์ด์ง ์๊ฒ ๋ฐ๊ธฐ๋ฅผ ์ด๋งํผ ํ๋ ๋ค.")]
[Range(0f, 1f)] public float softDirtTexNoise = 0.08f;
+ // โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ ยง0-b ๋ฐ๋ค ๋ฐ๋ฅ (2026-09-15 Lead ์ค์ธก)
+ [Header("ยง0-b โ ๋ฌผ ๋ฐ ๋ฐ๋ฅํ (๋ฐ๋ชจ ์ฐ๋ชป์ ๋ฐ๋ฅ์ด ์์ ๋ฌผ์ด ์ฒญ๋ก ยท ์ฐ๋ฆฌ๋ ๋ฐ๋ฅ์ด ์์ด ๋ฐฐ๊ฒฝ์์ด ๋น์ณ ์งํ๋)")]
+ [Tooltip("1 = ๋ฌผ ํ๋ฉด ์๋์ ๋ชจ๋์ ๋ฐ๋ฅํ 1์ฅ์ ๊น๋ค. ๋ฐ๋ชจ ๋ฌผ ์
ฐ์ด๋๋ ๊น์ด๋ก ์ยท๊ฑฐํ์ ์ ํ๋ฏ๋ก ๋ฐ๋ฅ์ด ์์ด์ผ ๋ฐ๋ชจ์ฒ๋ผ ์ฒญ๋ก ๋ฌผ + ํฐ ๋ฌผ๊ฐ๊ฐ ๋์จ๋ค. 0 = ์์(๋ฐฐ๊ฒฝ์์ด ๋น์นจ).")]
+ public int seabedEnabled = 1;
+
+ [Tooltip("๋ฌผ ํ๋ฉด์์ ๋ฐ๋ฅํ๊น์ง ๊น์ด(m). ์์์๋ก ์ฒญ๋กยท๊ฑฐํ์ด ์งํด์ง๋ค.")]
+ public float seabedDepth = 0.8f;
+
+ [Tooltip("๋ฐ๋ฅํ ํ ๋ณ ๊ธธ์ด(m). ์นด๋ฉ๋ผ๊ฐ ๋ณด๋ ๋ฒ์๋ง ๋ฎ์ผ๋ฉด ๋๋ค.")]
+ public float seabedSize = 400f;
+
+ [Tooltip("๋ฐ๋ฅํ ์(์ธ๋ฆฟ ยท sRGB). ๊ธฐ๋ณธ = ๋ฐ๋ชจ ๋ชจ๋์.")]
+ public Color seabedColor = new Color(0.71f, 0.706f, 0.549f, 1f);
+
// โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ ยง1 ํ๋ฐญ
[Header("ยง1 โ ์ฌ ํ์ผ ์ ํ๋ฐญ (๋ฐ๋ชจ์ ๊ฐ์ ์ธ์คํด์ฑ)")]
[Tooltip("0 ์ด๋ฉด ํ์ ๊น์ง ์๋๋ค.")]