From 6ff9df92a92d32c1fb815f13934d896dfb8be552 Mon Sep 17 00:00:00 2001 From: swrring Date: Tue, 15 Sep 2026 01:36:47 +0900 Subject: [PATCH] =?UTF-8?q?[WL-816n]=20=EC=84=AC=20=ED=92=80=EB=B0=AD=20?= =?UTF-8?q?=3D=20=EB=8D=B0=EB=AA=A8=20=EB=B0=B0=EC=B9=98=20=EA=B7=9C?= =?UTF-8?q?=EC=B9=99(=EB=B0=80=EB=8F=84=202.5)=20+=20=EA=B5=AC=EB=A6=84=20?= =?UTF-8?q?=EA=B7=B8=EB=A6=BC=EC=9E=90=205=EB=B0=B0=20=EA=B0=90=EC=86=8D?= =?UTF-8?q?=20(#816)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 실측: 데모 바닥의 「등고선 띠」 = 구름 그림자 (고유색 99→59 · 색경계% 0.13→0.02 · _Cloud_Strength=0 격리 렌더) - 실측: 데모 풀 배치 = 균일 격자(TerrainInstancesBehaviour · Density 2.5 · PositionVariance 0.5) — 경계 마스크 아님 - 실측: 데모 풀/바닥 밝기비 0.933 · 보이는 풀의 88%가 경계대(면적 15.7%)에 몰림 = 5.6배 집중 - 적용: scatter 밀도 1.8→2.5 · Farm_IslandTop_Arena/Farm_Grass_Arena 신규(구름 _Cloud_Change 0.005→0.001 · _Cloud_Movement (1,1)→(0.2,0.2)) · 풀색 x0.93 Co-Authored-By: Claude Opus 5 (1M context) --- AgentScripts/WL816n_Apply.cs | 165 ++++++++++++++++++ AgentScripts/WL816n_Cmp.cs | 53 ++++++ AgentScripts/WL816n_Demo.cs | 132 ++++++++++++++ AgentScripts/WL816n_Open.cs | 9 + AgentScripts/WL816n_Play.cs | 153 ++++++++++++++++ AgentScripts/WL816n_Probe.cs | 105 +++++++++++ AgentScripts/WL816n_Probe2.cs | 71 ++++++++ .../Look/Farm/Materials/Farm_Grass_Arena.mat | 159 +++++++++++++++++ .../Farm/Materials/Farm_Grass_Arena.mat.meta | 8 + .../Farm/Materials/Farm_IslandTop_Arena.mat | 103 +++++++++++ .../Materials/Farm_IslandTop_Arena.mat.meta | 8 + .../Resources/WL/WLIslandLookSettings.asset | 10 +- 12 files changed, 971 insertions(+), 5 deletions(-) create mode 100644 AgentScripts/WL816n_Apply.cs create mode 100644 AgentScripts/WL816n_Cmp.cs create mode 100644 AgentScripts/WL816n_Demo.cs create mode 100644 AgentScripts/WL816n_Open.cs create mode 100644 AgentScripts/WL816n_Play.cs create mode 100644 AgentScripts/WL816n_Probe.cs create mode 100644 AgentScripts/WL816n_Probe2.cs create mode 100644 Assets/WL/Look/Farm/Materials/Farm_Grass_Arena.mat create mode 100644 Assets/WL/Look/Farm/Materials/Farm_Grass_Arena.mat.meta create mode 100644 Assets/WL/Look/Farm/Materials/Farm_IslandTop_Arena.mat create mode 100644 Assets/WL/Look/Farm/Materials/Farm_IslandTop_Arena.mat.meta diff --git a/AgentScripts/WL816n_Apply.cs b/AgentScripts/WL816n_Apply.cs new file mode 100644 index 000000000..0da9f1907 --- /dev/null +++ b/AgentScripts/WL816n_Apply.cs @@ -0,0 +1,165 @@ +// WL-816n — ① 기준 캡처(c_demo_vs_island_ground.png) 이미지 분석: 데모 풀 대비 · 경계 집중도 +// ② 섬 바닥/풀 머티리얼 *_Arena 복사본 생성(구름 속도 감속) + SO 값 적용(밀도 = 데모 2.5) +// ③ 섬 전/후 렌더(PD 구도 12 m · 45° · fov 60) +public static class WL816n_Apply +{ + const string TOP_D = "Assets/WL/Look/Farm/Materials/Farm_IslandTop_Demo.mat"; + const string TOP_A = "Assets/WL/Look/Farm/Materials/Farm_IslandTop_Arena.mat"; + const string GR_D = "Assets/WL/Look/Farm/Materials/Farm_Grass_Demo.mat"; + const string GR_A = "Assets/WL/Look/Farm/Materials/Farm_Grass_Arena.mat"; + const string SO_P = "Assets/WL/Look/Farm/Resources/WL/WLIslandLookSettings.asset"; + const int W = 540, H = 960; + static System.Text.StringBuilder sb = new System.Text.StringBuilder(); + + // ─────────────────────────────────────────── 1) 기준 이미지 분석 + public static void Analyze() + { + sb.Length = 0; + var path = "Screenshots_WL/WL816f/c_demo_vs_island_ground.png"; + var bytes = System.IO.File.ReadAllBytes(path); + var tex = new UnityEngine.Texture2D(2, 2, UnityEngine.TextureFormat.RGB24, false); + UnityEngine.ImageConversion.LoadImage(tex, bytes); + int w = tex.width, h = tex.height; + var px = tex.GetPixels32(); + sb.AppendLine("기준 캡처 " + w + "x" + h + " (좌 = 데모 · 우 = 우리 섬)"); + + Half(px, w, h, 10, w / 2 - 12, 40, h - 60, "데모(좌)"); + Half(px, w, h, w / 2 + 12, w - 10, 40, h - 60, "우리섬(우)"); + Flush("AgentScripts/WL816n_IMG.txt"); + UnityEngine.Object.DestroyImmediate(tex); + } + + // 로컬 중앙값(=띠 색) 대비 어두운 이탈 픽셀 = 풀 실루엣. 띠 경계 근처 / 평면 내부로 갈라 센다. + static void Half(UnityEngine.Color32[] px, int w, int h, int x0, int x1, int y0, int y1, string tag) + { + int R = 9; // 로컬 창 반경(풀 포기보다 크게) + long tuft = 0, tot = 0, tuftNearEdge = 0, nearEdge = 0; + double dsum = 0; + long lr = 0, lg = 0, lb = 0; // 바닥(띠) 평균 + long gr = 0, gg = 0, gb = 0; long gn = 0; + for (int y = y0 + R; y < y1 - R; y += 2) + for (int x = x0 + R; x < x1 - R; x += 2) + { + // 로컬 밝기 중앙값 근사 = 창 안 최대값 쪽 25% 평균(풀이 어두우므로 바닥이 밝은 쪽) + int mx = 0; long s = 0; int c = 0; + for (int dy = -R; dy <= R; dy += 3) + for (int dx = -R; dx <= R; dx += 3) + { + var p = px[(y + dy) * w + (x + dx)]; + int L = p.r + p.g + p.b; + if (L > mx) mx = L; + s += L; c++; + } + int mean = (int)(s / c); + var q = px[y * w + x]; + int lum = q.r + q.g + q.b; + tot++; + lr += q.r; lg += q.g; lb += q.b; + // 창 안 밝기 폭 = 띠 경계 지표(경계면 창 안 명암 차가 크다) + bool edgeZone = (mx - mean) > 14; + if (edgeZone) nearEdge++; + if (lum < mx - 18) // 바닥보다 뚜렷이 어두움 = 풀 실루엣 + { + tuft++; + dsum += (double)lum / mx; + gr += q.r; gg += q.g; gb += q.b; gn++; + if (edgeZone) tuftNearEdge++; + } + } + double cov = 100.0 * tuft / System.Math.Max(1, tot); + double ne = 100.0 * nearEdge / System.Math.Max(1, tot); + double tne = 100.0 * tuftNearEdge / System.Math.Max(1, tuft); + sb.AppendLine(string.Format("{0}: 표본={1} 풀실루엣커버%={2:F2} 풀/바닥 밝기비={3:F3} 바닥평균=#{4:X2}{5:X2}{6:X2} 풀평균=#{7:X2}{8:X2}{9:X2}", + tag, tot, cov, gn == 0 ? 0 : dsum / gn, lr / System.Math.Max(1, tot), lg / System.Math.Max(1, tot), lb / System.Math.Max(1, tot), + gn == 0 ? 0 : gr / gn, gn == 0 ? 0 : gg / gn, gn == 0 ? 0 : gb / gn)); + sb.AppendLine(string.Format(" 경계대 면적%={0:F2} · 풀 중 경계대 비율={1:F1}% (균일 배치면 면적%와 같아야 한다 → 초과분 = 경계 집중)", + ne, tne)); + } + + // ─────────────────────────────────────────── 2) 값 적용 + public static void Apply() { MakeMats(); SetSO(); } + + public static void MakeMats() + { + sb.Length = 0; + // 머티리얼 복사본 + if (!System.IO.File.Exists(TOP_A)) UnityEditor.AssetDatabase.CopyAsset(TOP_D, TOP_A); + if (!System.IO.File.Exists(GR_A)) UnityEditor.AssetDatabase.CopyAsset(GR_D, GR_A); + UnityEditor.AssetDatabase.Refresh(); + var top = UnityEditor.AssetDatabase.LoadAssetAtPath(TOP_A); + var gra = UnityEditor.AssetDatabase.LoadAssetAtPath(GR_A); + var topD = UnityEditor.AssetDatabase.LoadAssetAtPath(TOP_D); + var graD = UnityEditor.AssetDatabase.LoadAssetAtPath(GR_D); + + // 구름 그림자 = 데모 띠의 원천(실측). 움직임만 5배 느리게 — 얼룩 모양·세기는 데모 그대로. + foreach (var m in new UnityEngine.Material[] { top, gra }) + { + if (m == null) continue; + m.EnableKeyword("_CLOUDSENABLED"); + m.SetFloat("_CLOUDSENABLED", 1f); + m.SetFloat("_Cloud_Change", 0.001f); // 0.005 → 0.001 (5배 감속) + m.SetVector("_Cloud_Movement", new UnityEngine.Vector4(0.2f, 0.2f, 0, 0)); // (1,1) → (0.2,0.2) + m.SetFloat("_Cloud_Strength", 1f); + m.SetFloat("_Cloud_Cover", 0.5f); + m.SetFloat("_Cloud_Density", 0.01f); + m.SetVector("_Cloud_Step", new UnityEngine.Vector4(13f, 17f, 0, 0)); + } + // 풀은 바닥보다 살짝 진하게 (기준 이미지 실측 비율 적용 — Analyze 로그 참조) + if (gra != null && graD != null) + { + var d = graD.GetColor("_DiffuseColor"); + var s = graD.GetColor("_ShadowDiffuseColor"); + gra.SetColor("_DiffuseColor", Mul(d, GRASS_MUL)); + gra.SetColor("_ShadowDiffuseColor", Mul(s, GRASS_MUL)); + sb.AppendLine("풀색 " + Hex(d) + "/" + Hex(s) + " → " + Hex(Mul(d, GRASS_MUL)) + "/" + Hex(Mul(s, GRASS_MUL)) + " (x" + GRASS_MUL + ")"); + } + UnityEditor.EditorUtility.SetDirty(top); UnityEditor.EditorUtility.SetDirty(gra); + UnityEditor.AssetDatabase.SaveAssets(); + Flush("AgentScripts/WL816n_MATS.txt"); + } + + public static void SetSO() + { + sb.Length = 0; + var top = UnityEditor.AssetDatabase.LoadAssetAtPath(TOP_A); + var gra = UnityEditor.AssetDatabase.LoadAssetAtPath(GR_A); + var topD = UnityEditor.AssetDatabase.LoadAssetAtPath(TOP_D); + var graD = UnityEditor.AssetDatabase.LoadAssetAtPath(GR_D); + // SO 값 + var so = UnityEditor.AssetDatabase.LoadAssetAtPath(SO_P); + var sobj = new UnityEditor.SerializedObject(so); + var mr = sobj.FindProperty("materialRemap"); + for (int i = 0; i < mr.arraySize; i++) + { + var to = mr.GetArrayElementAtIndex(i).FindPropertyRelative("to"); + if (to.objectReferenceValue == topD) { to.objectReferenceValue = top; sb.AppendLine("materialRemap[" + i + "].to → Farm_IslandTop_Arena"); } + } + sobj.FindProperty("islandTopMaterial").objectReferenceValue = top; + var sc = sobj.FindProperty("scatter"); + for (int i = 0; i < sc.arraySize; i++) + { + var e = sc.GetArrayElementAtIndex(i); + var mp = e.FindPropertyRelative("material"); + if (mp.objectReferenceValue == graD) mp.objectReferenceValue = gra; + var dp = e.FindPropertyRelative("density"); + var lb = e.FindPropertyRelative("label").stringValue; + if (dp.floatValue > 0.5f) { sb.AppendLine("scatter[" + i + "](" + lb + ") density " + dp.floatValue + " → 2.5 (데모 FirstLayer 값)"); dp.floatValue = 2.5f; } + } + sobj.ApplyModifiedPropertiesWithoutUndo(); + UnityEditor.EditorUtility.SetDirty(so); + UnityEditor.AssetDatabase.SaveAssets(); + sb.AppendLine("SO 저장 완료"); + Flush("AgentScripts/WL816n_APPLY.txt"); + } + + public static float GRASS_MUL = 0.93f; + + static UnityEngine.Color Mul(UnityEngine.Color c, float k) { return new UnityEngine.Color(c.r * k, c.g * k, c.b * k, c.a); } + static string Hex(UnityEngine.Color c) { return "#" + UnityEngine.ColorUtility.ToHtmlStringRGB(c); } + + static void Flush(string p) + { + System.IO.File.WriteAllText(p, sb.ToString()); + UnityEngine.Debug.Log("[816n]\n" + sb.ToString()); + } +} diff --git a/AgentScripts/WL816n_Cmp.cs b/AgentScripts/WL816n_Cmp.cs new file mode 100644 index 000000000..57c4ee5f0 --- /dev/null +++ b/AgentScripts/WL816n_Cmp.cs @@ -0,0 +1,53 @@ +// WL-816n — 비교 캡처 합성: ⓐ 데모 | 섬 전 | 섬 후 +public static class WL816n_Cmp +{ + public static void Run() + { + var demo = Load("Screenshots_WL/WL816f/c_demo_vs_island_ground.png"); + var bef = Load("Screenshots_WL/WL816n/a_before.png"); + var aft = Load("Screenshots_WL/WL816n/b_after.png"); + if (demo == null || bef == null || aft == null) { UnityEngine.Debug.LogError("[816n] png 없음"); return; } + // 데모 좌측 절반만 잘라 쓴다 + int dw = demo.width / 2 - 20, dh = demo.height - 60; + var dcrop = Crop(demo, 10, 30, dw, dh); + int H = 900; + var a = Fit(dcrop, H); var b = Fit(bef, H); var c = Fit(aft, H); + int W = a.width + b.width + c.width + 16; + var outT = new UnityEngine.Texture2D(W, H, UnityEngine.TextureFormat.RGB24, false); + var bg = new UnityEngine.Color32(24, 24, 24, 255); + var fill = new UnityEngine.Color32[W * H]; + for (int i = 0; i < fill.Length; i++) fill[i] = bg; + outT.SetPixels32(fill); + Blit(outT, a, 0); Blit(outT, b, a.width + 8); Blit(outT, c, a.width + b.width + 16); + outT.Apply(); + System.IO.File.WriteAllBytes("Screenshots_WL/WL816n/a_demo_vs_before_after.png", UnityEngine.ImageConversion.EncodeToPNG(outT)); + UnityEngine.Debug.Log("[816n] cmp written " + W + "x" + H); + } + static UnityEngine.Texture2D Load(string p) + { + if (!System.IO.File.Exists(p)) return null; + var t = new UnityEngine.Texture2D(2, 2, UnityEngine.TextureFormat.RGB24, false); + UnityEngine.ImageConversion.LoadImage(t, System.IO.File.ReadAllBytes(p)); + return t; + } + static UnityEngine.Texture2D Crop(UnityEngine.Texture2D s, int x, int y, int w, int h) + { + var t = new UnityEngine.Texture2D(w, h, UnityEngine.TextureFormat.RGB24, false); + t.SetPixels(s.GetPixels(x, y, w, h)); t.Apply(); return t; + } + static UnityEngine.Texture2D Fit(UnityEngine.Texture2D s, int H) + { + int W = UnityEngine.Mathf.RoundToInt(s.width * (float)H / s.height); + var t = new UnityEngine.Texture2D(W, H, UnityEngine.TextureFormat.RGB24, false); + for (int y = 0; y < H; y++) + for (int x = 0; x < W; x++) + t.SetPixel(x, y, s.GetPixelBilinear((x + 0.5f) / W, (y + 0.5f) / H)); + t.Apply(); return t; + } + static void Blit(UnityEngine.Texture2D dst, UnityEngine.Texture2D src, int x0) + { + for (int y = 0; y < src.height && y < dst.height; y++) + for (int x = 0; x < src.width && x0 + x < dst.width; x++) + dst.SetPixel(x0 + x, y, src.GetPixel(x, y)); + } +} diff --git a/AgentScripts/WL816n_Demo.cs b/AgentScripts/WL816n_Demo.cs new file mode 100644 index 000000000..067642919 --- /dev/null +++ b/AgentScripts/WL816n_Demo.cs @@ -0,0 +1,132 @@ +// WL-816n — 데모 풀밭의 「색 경계」가 무엇으로 생기는지 격리 렌더로 가른다. 에디트 모드 전용(데모 Play 금지). +// 원본 에셋 무수정: terrain.materialTemplate 에 복사본을 잠시 물렸다가 원복하고, 씬은 저장하지 않는다. +public static class WL816n_Demo +{ + const int W = 540, H = 960; + + public static void Run() + { + var sb = new System.Text.StringBuilder(); + var sc = UnityEditor.SceneManagement.EditorSceneManager.OpenScene( + "Assets/3DPixelArtEnvironment/Demo/Demo.unity", UnityEditor.SceneManagement.OpenSceneMode.Single); + sb.AppendLine("=== Demo.unity roots=" + sc.rootCount + " ==="); + + var terrain = UnityEngine.Object.FindFirstObjectByType(); + if (terrain == null) { sb.AppendLine("NO TERRAIN"); Dump(sb); return; } + var td = terrain.terrainData; + sb.AppendLine("terrain size=" + td.size + " pos=" + terrain.transform.position + + " mat=" + (terrain.materialTemplate ? terrain.materialTemplate.name : "null") + + " alphamapTex=" + td.alphamapTextureCount + " alphamapRes=" + td.alphamapResolution + + " heightmapRes=" + td.heightmapResolution + " detailProtos=" + td.detailPrototypes.Length); + // 높이 분포(= 툰 램프 띠의 원천 후보) + float hmin = 1e9f, hmax = -1e9f; + for (int i = 0; i <= 32; i++) + for (int j = 0; j <= 32; j++) + { var h = td.GetInterpolatedHeight(i / 32f, j / 32f); if (h < hmin) hmin = h; if (h > hmax) hmax = h; } + sb.AppendLine("terrain height min=" + hmin.ToString("F2") + " max=" + hmax.ToString("F2") + " (월드 y 범위)"); + + // 데모 풀 배치 규칙 (ⓓ) + var tib = terrain.GetComponent(); + if (tib == null) tib = UnityEngine.Object.FindFirstObjectByType(); + if (tib != null) + { + sb.AppendLine("--- TerrainInstancesBehaviour (배치 규칙) ---"); + sb.AppendLine(" PositionVariance=" + tib.PositionVariance + " ScaleVariance=" + tib.ScaleVariance); + DumpLayer(sb, "FirstLayer", tib.FirstLayer); + DumpLayer(sb, "SecondLayer", tib.SecondLayer); + DumpLayer(sb, "ThirdLayer", tib.ThirdLayer); + DumpLayer(sb, "FourthLayer", tib.FourthLayer); + } + else sb.AppendLine("TerrainInstancesBehaviour 없음"); + + // 카메라 (816f 판정 카메라와 같은 각 · 직교 6) + var camGo = new UnityEngine.GameObject("~816nCam"); + var cam = camGo.AddComponent(); + cam.orthographic = true; cam.orthographicSize = 6f; + cam.transform.rotation = UnityEngine.Quaternion.Euler(30f, 60f, 0f); + var c = terrain.transform.position + td.size * 0.5f; c.y = terrain.transform.position.y + hmax; + cam.transform.position = c - cam.transform.forward * 40f; + cam.clearFlags = UnityEngine.CameraClearFlags.SolidColor; + cam.backgroundColor = new UnityEngine.Color(1f, 0f, 1f, 1f); + cam.nearClipPlane = 0.1f; cam.farClipPlane = 200f; + + var orig = terrain.materialTemplate; + var copy = new UnityEngine.Material(orig); + terrain.materialTemplate = copy; + + sb.AppendLine("--- 격리 렌더 (데모 바닥 · 풀은 에디트 모드에서 안 그려짐) ---"); + Shot(sb, cam, copy, "A_baseline", orig, false, -1); + Shot(sb, cam, copy, "B_clouds_off", orig, true, -1); + Shot(sb, cam, copy, "C_shades1", orig, false, 1); + Shot(sb, cam, copy, "D_clouds_off_shades1", orig, true, 1); + + terrain.materialTemplate = orig; + UnityEngine.Object.DestroyImmediate(copy); + UnityEngine.Object.DestroyImmediate(camGo); + Dump(sb); + } + + static void DumpLayer(System.Text.StringBuilder sb, string name, Environment.Instancing.TerrainInstancesBehaviour.TerrainInstancingInput v) + { + if (v == null) { sb.AppendLine(" " + name + " null"); return; } + sb.AppendLine(" " + name + " Density=" + v.Density + " settings=" + (v.Settings == null ? 0 : v.Settings.Length)); + if (v.Settings == null) return; + foreach (var s in v.Settings) + sb.AppendLine(" mesh=" + (s.Mesh ? s.Mesh.name : "-") + " mat=" + (s.Material ? s.Material.name : "-") + + " scale=" + s.Scale + " prob=" + s.Probability + " normalOffset=" + s.NormalOffset); + } + + static void Shot(System.Text.StringBuilder sb, UnityEngine.Camera cam, UnityEngine.Material copy, string tag, + UnityEngine.Material orig, bool cloudsOff, int shades) + { + copy.CopyPropertiesFromMaterial(orig); + if (cloudsOff) { copy.SetFloat("_Cloud_Strength", 0f); copy.DisableKeyword("_CLOUDSENABLED"); } + if (shades > 0) copy.SetFloat("_Shades", shades); + + var rt = new UnityEngine.RenderTexture(W, H, 24, UnityEngine.RenderTextureFormat.ARGB32, UnityEngine.RenderTextureReadWrite.sRGB); + cam.targetTexture = rt; cam.Render(); + var prev = UnityEngine.RenderTexture.active; UnityEngine.RenderTexture.active = rt; + var tex = new UnityEngine.Texture2D(W, H, UnityEngine.TextureFormat.RGB24, false); + tex.ReadPixels(new UnityEngine.Rect(0, 0, W, H), 0, 0); tex.Apply(); + UnityEngine.RenderTexture.active = prev; cam.targetTexture = null; + + var px = tex.GetPixels32(); + // 배경(마젠타) 제외한 지형 픽셀만 + var idx = new System.Collections.Generic.List(); + for (int i = 0; i < px.Length; i++) + if (!(px[i].r > 200 && px[i].g < 60 && px[i].b > 200)) idx.Add(i); + // 고유색 수 + 에지%(가로 인접 차 > 6) + var uniq = new System.Collections.Generic.HashSet(); + long sr = 0, sg = 0, sb2 = 0; int edge = 0, cmp = 0; + foreach (var i in idx) + { + uniq.Add((px[i].r << 16) | (px[i].g << 8) | px[i].b); + sr += px[i].r; sg += px[i].g; sb2 += px[i].b; + int x = i % W; + if (x + 1 < W) + { + int j = i + 1; + if (!(px[j].r > 200 && px[j].g < 60 && px[j].b > 200)) + { + cmp++; + int d = System.Math.Abs(px[i].r - px[j].r) + System.Math.Abs(px[i].g - px[j].g) + System.Math.Abs(px[i].b - px[j].b); + if (d > 6) edge++; + } + } + } + int n = idx.Count == 0 ? 1 : idx.Count; + sb.AppendLine(string.Format(" {0,-22} 지형px={1} 평균=#{2:X2}{3:X2}{4:X2} 고유색={5} 색경계%={6:F2}", + tag, idx.Count, sr / n, sg / n, sb2 / n, uniq.Count, cmp == 0 ? 0f : 100f * edge / cmp)); + + System.IO.Directory.CreateDirectory("Screenshots_WL/WL816n"); + System.IO.File.WriteAllBytes("Screenshots_WL/WL816n/demo_" + tag + ".png", UnityEngine.ImageConversion.EncodeToPNG(tex)); + UnityEngine.Object.DestroyImmediate(tex); + rt.Release(); UnityEngine.Object.DestroyImmediate(rt); + } + + static void Dump(System.Text.StringBuilder sb) + { + System.IO.File.WriteAllText("AgentScripts/WL816n_DEMO.txt", sb.ToString()); + UnityEngine.Debug.Log("[816n] demo probe done\n" + sb.ToString()); + } +} diff --git a/AgentScripts/WL816n_Open.cs b/AgentScripts/WL816n_Open.cs new file mode 100644 index 000000000..f289fb276 --- /dev/null +++ b/AgentScripts/WL816n_Open.cs @@ -0,0 +1,9 @@ +public static class WL816n_Open +{ + public static void Run() + { + UnityEditor.SceneManagement.EditorSceneManager.OpenScene( + "Assets/Scenes/InGame.unity", UnityEditor.SceneManagement.OpenSceneMode.Single); + UnityEngine.Debug.Log("[816n] InGame opened, active=" + UnityEngine.SceneManagement.SceneManager.GetActiveScene().name); + } +} diff --git a/AgentScripts/WL816n_Play.cs b/AgentScripts/WL816n_Play.cs new file mode 100644 index 000000000..6940a7758 --- /dev/null +++ b/AgentScripts/WL816n_Play.cs @@ -0,0 +1,153 @@ +// WL-816n — PD 구도(12 m · 45° · fov 60)에서 섬 전/후 캡처 + 화면색·성능 실측. +// 에셋은 건드리지 않는다 (cfg 는 Instantiate 복제본 · 816f 방식). +public static class WL816n_Play +{ + public static void Start() + { + var go = UnityEngine.GameObject.Find("~WL816nPlay"); + if (go != null) UnityEngine.Object.DestroyImmediate(go); + go = new UnityEngine.GameObject("~WL816nPlay"); + go.AddComponent(); + } +} + +public class WL816n_PlayRunner : UnityEngine.MonoBehaviour +{ + static System.Text.StringBuilder sb; + const int W = 1080, H = 1920; + const string TOP_A = "Assets/WL/Look/Farm/Materials/Farm_IslandTop_Arena.mat"; + const string GR_A = "Assets/WL/Look/Farm/Materials/Farm_Grass_Arena.mat"; + + void Start() { StartCoroutine(Co()); } + + System.Collections.IEnumerator Co() + { + sb = new System.Text.StringBuilder(); + if (UnityEngine.SceneManagement.SceneManager.sceneCount < 2) + { + var op = UnityEngine.SceneManagement.SceneManager.LoadSceneAsync("Level01", UnityEngine.SceneManagement.LoadSceneMode.Additive); + while (op != null && !op.isDone) yield return null; + } + for (int i = 0; i < 7; i++) yield return new UnityEngine.WaitForSeconds(1f); + + var g = UnityEngine.Object.FindFirstObjectByType(UnityEngine.FindObjectsInactive.Include); + if (g == null) { L("🔴 WLIslandGrass 없음 — 중단"); Flush(); yield break; } + var src = WL.Look.Farm.WLIslandLookSettings.Instance; + var rt = UnityEngine.Object.Instantiate(src); // 에셋 무변경 + g.cfg = rt; + var cam = MakeCam(); + L("카메라 " + cam.transform.position + " euler=" + cam.transform.eulerAngles + " fov=" + cam.fieldOfView + " (타깃까지 12 m · 45°)"); + + // ── BEFORE (현재 값: 밀도 1.8 · Demo 머티리얼) ───────────── + g.Rebuild(); yield return null; yield return null; + L(Shot(cam, "a_before", "BEFORE 밀도=" + Dens(rt) + " 풀mat=" + MatName(rt))); + L(" 인스턴스=" + WL.Look.Farm.WLIslandGrass.Instances + " 삼각형=" + WL.Look.Farm.WLIslandGrass.Triangles + + " 드로우콜+" + WL.Look.Farm.WLIslandGrass.DrawnConfigs + " " + Bench(cam, 60).ToString("F3") + " ms/frame"); + + // ── AFTER (밀도 2.5 = 데모 FirstLayer 값 · *_Arena 머티리얼) ─ + var topA = UnityEditor.AssetDatabase.LoadAssetAtPath(TOP_A); + var graA = UnityEditor.AssetDatabase.LoadAssetAtPath(GR_A); + if (topA == null || graA == null) { L("🔴 *_Arena 머티리얼 없음 — Apply 먼저"); Flush(); yield break; } + for (int i = 0; i < rt.scatter.Length; i++) + if (rt.scatter[i] != null && (rt.scatter[i].label.Contains("풀") || rt.scatter[i].label.Contains("꽃"))) + { rt.scatter[i].density = 2.5f; if (rt.scatter[i].label.Contains("풀")) rt.scatter[i].material = graA; } + var topD = rt.islandTopMaterial; + rt.islandTopMaterial = topA; + for (int i = 0; i < rt.materialRemap.Length; i++) + if (rt.materialRemap[i] != null && rt.materialRemap[i].to == topD) rt.materialRemap[i].to = topA; + WL.Look.Farm.WLIslandLook.SwapMaterials(rt, UnityEngine.SceneManagement.SceneManager.GetSceneByName("Level01")); + g.Rebuild(); + yield return new UnityEngine.WaitForSeconds(1.5f); + L(Shot(cam, "b_after", "AFTER 밀도=" + Dens(rt) + " 풀mat=" + MatName(rt))); + L(" 인스턴스=" + WL.Look.Farm.WLIslandGrass.Instances + " 삼각형=" + WL.Look.Farm.WLIslandGrass.Triangles + + " 드로우콜+" + WL.Look.Farm.WLIslandGrass.DrawnConfigs + " " + Bench(cam, 60).ToString("F3") + " ms/frame"); + + // 구름 띠가 시간에 따라 움직이는가 (같은 카메라 · 3초 간격 두 장의 차이) + var t0 = Grab(cam); + yield return new UnityEngine.WaitForSeconds(3f); + var t1 = Grab(cam); + L("[구름 이동] 3초 간격 두 프레임의 평균 채널차 = " + Diff(t0, t1).ToString("F2") + " (0 이면 정지)"); + + Flush(); + } + + // ─────────────────────────────────────────── helpers + static string Dens(WL.Look.Farm.WLIslandLookSettings c) + { for (int i = 0; i < c.scatter.Length; i++) if (c.scatter[i] != null && c.scatter[i].label.Contains("풀")) return c.scatter[i].density.ToString("F2"); return "?"; } + static string MatName(WL.Look.Farm.WLIslandLookSettings c) + { for (int i = 0; i < c.scatter.Length; i++) if (c.scatter[i] != null && c.scatter[i].label.Contains("풀")) return c.scatter[i].material ? c.scatter[i].material.name : "-"; return "?"; } + + static UnityEngine.Camera MakeCam() + { + UnityEngine.Vector3 tgt = UnityEngine.Vector3.zero; + var pc = UnityEngine.GameObject.FindGameObjectWithTag("Player"); + if (pc != null) tgt = pc.transform.position; + var go = new UnityEngine.GameObject("~816nCam"); + var c = go.AddComponent(); + c.fieldOfView = 60f; c.orthographic = false; + c.nearClipPlane = 0.1f; c.farClipPlane = 300f; + c.transform.rotation = UnityEngine.Quaternion.Euler(45f, 45f, 0f); + c.transform.position = tgt - c.transform.forward * 12f; + c.enabled = false; + return c; + } + + static UnityEngine.Texture2D Grab(UnityEngine.Camera cam) + { + var rt = new UnityEngine.RenderTexture(W, H, 24, UnityEngine.RenderTextureFormat.ARGB32, UnityEngine.RenderTextureReadWrite.sRGB); + rt.Create(); cam.targetTexture = rt; cam.Render(); + var prev = UnityEngine.RenderTexture.active; UnityEngine.RenderTexture.active = rt; + var tex = new UnityEngine.Texture2D(W, H, UnityEngine.TextureFormat.RGB24, false); + tex.ReadPixels(new UnityEngine.Rect(0, 0, W, H), 0, 0); tex.Apply(); + UnityEngine.RenderTexture.active = prev; cam.targetTexture = null; + rt.Release(); UnityEngine.Object.DestroyImmediate(rt); + return tex; + } + + static float Diff(UnityEngine.Texture2D a, UnityEngine.Texture2D b) + { + var pa = a.GetPixels32(); var pb = b.GetPixels32(); + long s = 0; int n = 0; + for (int i = 0; i < pa.Length; i += 7) + { s += System.Math.Abs(pa[i].r - pb[i].r) + System.Math.Abs(pa[i].g - pb[i].g) + System.Math.Abs(pa[i].b - pb[i].b); n += 3; } + UnityEngine.Object.DestroyImmediate(a); UnityEngine.Object.DestroyImmediate(b); + return n == 0 ? 0f : (float)s / n; + } + + static string Shot(UnityEngine.Camera cam, string name, string tag) + { + var tex = Grab(cam); + System.IO.Directory.CreateDirectory("Screenshots_WL/WL816n"); + System.IO.File.WriteAllBytes("Screenshots_WL/WL816n/" + name + ".png", UnityEngine.ImageConversion.EncodeToPNG(tex)); + // 초록(풀밭) 픽셀 통계 + 풀 실루엣 커버% + var px = tex.GetPixels32(); + long r = 0, gg = 0, b = 0; int n = 0; + for (int i = 0; i < px.Length; i++) + { + var p = px[i]; + if (p.g > p.b + 12 && p.g > p.r + 8 && p.g > 60) { r += p.r; gg += p.g; b += p.b; n++; } + } + UnityEngine.Object.DestroyImmediate(tex); + if (n == 0) return tag + " : 초록 픽셀 0"; + return string.Format("{0} : 풀밭 초록 픽셀 {1} ({2:F1}%) 평균 #{3:X2}{4:X2}{5:X2}", tag, n, 100f * n / px.Length, r / n, gg / n, b / n); + } + + static float Bench(UnityEngine.Camera cam, int frames) + { + var rt = new UnityEngine.RenderTexture(W, H, 24, UnityEngine.RenderTextureFormat.ARGB32, UnityEngine.RenderTextureReadWrite.sRGB); + rt.Create(); cam.targetTexture = rt; + for (int i = 0; i < 10; i++) cam.Render(); + var sw = System.Diagnostics.Stopwatch.StartNew(); + for (int i = 0; i < frames; i++) cam.Render(); + sw.Stop(); cam.targetTexture = null; + rt.Release(); UnityEngine.Object.DestroyImmediate(rt); + return (float)sw.Elapsed.TotalMilliseconds / frames; + } + + static void L(string s) { sb.AppendLine(s); } + static void Flush() + { + System.IO.File.WriteAllText("AgentScripts/WL816n_PLAY.txt", sb.ToString()); + UnityEngine.Debug.Log("[816n play]\n" + sb.ToString()); + } +} diff --git a/AgentScripts/WL816n_Probe.cs b/AgentScripts/WL816n_Probe.cs new file mode 100644 index 000000000..8f7ee1880 --- /dev/null +++ b/AgentScripts/WL816n_Probe.cs @@ -0,0 +1,105 @@ +// WL-816n — 던전(아레나 복사본) 바닥·풀 실측 프로브. 에디트 모드 전용. +public static class WL816n_Probe +{ + public static void Run() + { + var sb = new System.Text.StringBuilder(); + var sc = UnityEditor.SceneManagement.EditorSceneManager.OpenScene( + "Assets/WL/Island/Scenes/WL_Dungeon01.unity", UnityEditor.SceneManagement.OpenSceneMode.Single); + sb.AppendLine("=== WL_Dungeon01 === roots=" + sc.rootCount); + foreach (var r in sc.GetRootGameObjects()) + sb.AppendLine(" ROOT " + r.name + " active=" + r.activeSelf); + + // Terrain + var ts = UnityEngine.Object.FindObjectsByType( + UnityEngine.FindObjectsInactive.Include, UnityEngine.FindObjectsSortMode.None); + sb.AppendLine("Terrain count=" + ts.Length); + foreach (var t in ts) + { + var td = t.terrainData; + sb.AppendLine(" TERRAIN " + t.name + " mat=" + (t.materialTemplate ? t.materialTemplate.name + "/" + t.materialTemplate.shader.name : "null") + + " size=" + (td != null ? td.size.ToString() : "?") + " pos=" + t.transform.position); + if (td != null) + { + for (int i = 0; i < td.terrainLayers.Length; i++) + { + var L = td.terrainLayers[i]; + if (L == null) { sb.AppendLine(" layer" + i + " null"); continue; } + sb.AppendLine(" layer" + i + " " + L.name + " tex=" + (L.diffuseTexture ? L.diffuseTexture.name : "-") + + " remapMin=" + L.diffuseRemapMin + " remapMax=" + L.diffuseRemapMax + " tile=" + L.tileSize + + " path=" + UnityEditor.AssetDatabase.GetAssetPath(L)); + if (L.diffuseTexture != null) sb.AppendLine(" texAvg=" + Avg(L.diffuseTexture as UnityEngine.Texture2D)); + } + sb.AppendLine(" detailPrototypes=" + td.detailPrototypes.Length + " detailRes=" + td.detailResolution); + for (int i = 0; i < td.detailPrototypes.Length; i++) + { + var d = td.detailPrototypes[i]; + sb.AppendLine(" det" + i + " mesh=" + (d.prototype ? d.prototype.name : "-") + " tex=" + (d.prototypeTexture ? d.prototypeTexture.name : "-") + + " healthy=" + Hex(d.healthyColor) + " dry=" + Hex(d.dryColor) + " usePrototypeMesh=" + d.usePrototypeMesh + " render=" + d.renderMode + + " density=" + d.density + " minW=" + d.minWidth + " maxW=" + d.maxWidth); + } + } + } + + // 바닥·풀 후보 렌더러 + sb.AppendLine("--- renderers with ground/grass-ish materials ---"); + var rs = UnityEngine.Object.FindObjectsByType( + UnityEngine.FindObjectsInactive.Include, UnityEngine.FindObjectsSortMode.None); + var seen = new System.Collections.Generic.HashSet(); + int nR = 0; + foreach (var r in rs) + { + foreach (var m in r.sharedMaterials) + { + if (m == null) continue; + var n = m.name.ToLower(); + if (n.Contains("grass") || n.Contains("ground") || n.Contains("terrain") || n.Contains("floor") || n.Contains("dirt") || n.Contains("land")) + { + var key = m.name; + if (seen.Add(key)) + sb.AppendLine(" MAT " + m.name + " sh=" + m.shader.name + " path=" + UnityEditor.AssetDatabase.GetAssetPath(m) + " ex=" + r.name); + } + } + nR++; + } + sb.AppendLine(" renderers=" + nR); + + // 조명 + sb.AppendLine("--- lighting ---"); + sb.AppendLine(" ambientMode=" + UnityEngine.RenderSettings.ambientMode + + " light=" + Hex(UnityEngine.RenderSettings.ambientLight) + + " sky=" + Hex(UnityEngine.RenderSettings.ambientSkyColor) + + " eq=" + Hex(UnityEngine.RenderSettings.ambientEquatorColor) + + " gr=" + Hex(UnityEngine.RenderSettings.ambientGroundColor) + + " int=" + UnityEngine.RenderSettings.ambientIntensity + + " skybox=" + (UnityEngine.RenderSettings.skybox ? UnityEngine.RenderSettings.skybox.name : "null") + + " fog=" + UnityEngine.RenderSettings.fog); + foreach (var l in UnityEngine.Object.FindObjectsByType(UnityEngine.FindObjectsInactive.Include, UnityEngine.FindObjectsSortMode.None)) + sb.AppendLine(" LIGHT " + l.name + " type=" + l.type + " col=" + Hex(l.color) + " int=" + l.intensity + " rot=" + l.transform.eulerAngles + " active=" + l.gameObject.activeInHierarchy); + + // Volume + foreach (var v in UnityEngine.Object.FindObjectsByType(UnityEngine.FindObjectsInactive.Include, UnityEngine.FindObjectsSortMode.None)) + sb.AppendLine(" VOLUME " + v.name + " global=" + v.isGlobal + " w=" + v.weight + " prio=" + v.priority + " profile=" + (v.sharedProfile ? v.sharedProfile.name : "null") + " active=" + v.gameObject.activeInHierarchy); + + System.IO.File.WriteAllText("AgentScripts/WL816n_PROBE.txt", sb.ToString()); + UnityEngine.Debug.Log("[816n] probe written\n" + sb.ToString()); + } + + static string Hex(UnityEngine.Color c) + { + return "#" + UnityEngine.ColorUtility.ToHtmlStringRGB(c) + "(" + c.r.ToString("F3") + "," + c.g.ToString("F3") + "," + c.b.ToString("F3") + ")"; + } + + static string Avg(UnityEngine.Texture2D t) + { + if (t == null) return "-"; + var p = UnityEditor.AssetDatabase.GetAssetPath(t); + var imp = UnityEditor.AssetImporter.GetAtPath(p) as UnityEditor.TextureImporter; + bool rw = imp != null && imp.isReadable; + if (!rw) return "(notReadable)"; + var px = t.GetPixels32(); + long r = 0, g = 0, b = 0; + for (int i = 0; i < px.Length; i++) { r += px[i].r; g += px[i].g; b += px[i].b; } + return string.Format("#{0:X2}{1:X2}{2:X2} n={3}", r / px.Length, g / px.Length, b / px.Length, px.Length); + } +} diff --git a/AgentScripts/WL816n_Probe2.cs b/AgentScripts/WL816n_Probe2.cs new file mode 100644 index 000000000..64a310a2e --- /dev/null +++ b/AgentScripts/WL816n_Probe2.cs @@ -0,0 +1,71 @@ +// WL-816n — 던전 터레인 머티리얼 프로퍼티 + 풀 후보 오브젝트 탐색 +public static class WL816n_Probe2 +{ + public static void Run() + { + var sb = new System.Text.StringBuilder(); + var sc = UnityEngine.SceneManagement.SceneManager.GetActiveScene(); + if (sc.name != "WL_Dungeon01") + sc = UnityEditor.SceneManagement.EditorSceneManager.OpenScene( + "Assets/WL/Island/Scenes/WL_Dungeon01.unity", UnityEditor.SceneManagement.OpenSceneMode.Single); + + var t = UnityEngine.Object.FindFirstObjectByType(); + var m = t != null ? t.materialTemplate : null; + if (m != null) + { + sb.AppendLine("TERRAIN MAT " + m.name + " path=" + UnityEditor.AssetDatabase.GetAssetPath(m) + " sh=" + m.shader.name); + int n = m.shader.GetPropertyCount(); + for (int i = 0; i < n; i++) + { + var pn = m.shader.GetPropertyName(i); + var ty = m.shader.GetPropertyType(i); + if (ty == UnityEngine.Rendering.ShaderPropertyType.Color) + sb.AppendLine(" COL " + pn + " = " + Hex(m.GetColor(pn))); + else if (ty == UnityEngine.Rendering.ShaderPropertyType.Float || ty == UnityEngine.Rendering.ShaderPropertyType.Range) + sb.AppendLine(" F " + pn + " = " + m.GetFloat(pn)); + else if (ty == UnityEngine.Rendering.ShaderPropertyType.Vector) + sb.AppendLine(" V " + pn + " = " + m.GetVector(pn)); + else if (ty == UnityEngine.Rendering.ShaderPropertyType.Texture) + { + var tx = m.GetTexture(pn); + sb.AppendLine(" TEX " + pn + " = " + (tx ? tx.name + " | " + UnityEditor.AssetDatabase.GetAssetPath(tx) : "null")); + } + } + } + + sb.AppendLine("--- 풀/식생 후보 (오브젝트·메시 이름) ---"); + var rs = UnityEngine.Object.FindObjectsByType( + UnityEngine.FindObjectsInactive.Include, UnityEngine.FindObjectsSortMode.None); + var cnt = new System.Collections.Generic.Dictionary(); + foreach (var r in rs) + { + string mn = r.sharedMaterial ? r.sharedMaterial.name : "null"; + string key = r.name + " | mat=" + mn; + var lower = (r.name + " " + mn).ToLower(); + if (lower.Contains("grass") || lower.Contains("plant") || lower.Contains("bush") || lower.Contains("flower") + || lower.Contains("fern") || lower.Contains("weed") || lower.Contains("foliage") || lower.Contains("tree")) + { + if (!cnt.ContainsKey(key)) cnt[key] = 0; + cnt[key]++; + } + } + foreach (var kv in cnt) sb.AppendLine(" " + kv.Key + " x" + kv.Value); + sb.AppendLine(" (총 렌더러 " + rs.Length + ")"); + + sb.AppendLine("--- 전체 머티리얼 목록(고유) ---"); + var mats = new System.Collections.Generic.SortedDictionary(); + foreach (var r in rs) + foreach (var mm in r.sharedMaterials) + if (mm != null && !mats.ContainsKey(mm.name)) + mats[mm.name] = UnityEditor.AssetDatabase.GetAssetPath(mm); + foreach (var kv in mats) sb.AppendLine(" " + kv.Key + " <- " + kv.Value); + + System.IO.File.WriteAllText("AgentScripts/WL816n_PROBE2.txt", sb.ToString()); + UnityEngine.Debug.Log("[816n] probe2 done"); + } + + static string Hex(UnityEngine.Color c) + { + return "#" + UnityEngine.ColorUtility.ToHtmlStringRGB(c) + "(" + c.r.ToString("F3") + "," + c.g.ToString("F3") + "," + c.b.ToString("F3") + ")"; + } +} diff --git a/Assets/WL/Look/Farm/Materials/Farm_Grass_Arena.mat b/Assets/WL/Look/Farm/Materials/Farm_Grass_Arena.mat new file mode 100644 index 000000000..dd0415f5c --- /dev/null +++ b/Assets/WL/Look/Farm/Materials/Farm_Grass_Arena.mat @@ -0,0 +1,159 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!114 &-3938375536428912352 +MonoBehaviour: + m_ObjectHideFlags: 11 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 0} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: d0353a89b1f911e48b9e16bdc9f2e058, type: 3} + m_Name: + m_EditorClassIdentifier: Unity.RenderPipelines.Universal.Editor::UnityEditor.Rendering.Universal.AssetVersion + version: 10 +--- !u!21 &2100000 +Material: + serializedVersion: 8 + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_Name: Farm_Grass_Arena + m_Shader: {fileID: -6465566751694194690, guid: 116bae4840169554085c5aa591d459f5, + type: 3} + m_Parent: {fileID: 0} + m_ModifiedSerializedProperties: 0 + m_ValidKeywords: + - _MAIN_LIGHT_SHADOWS + - _SHADOWS_SOFT + m_InvalidKeywords: + - _CLOUDSENABLED + m_LightmapFlags: 4 + m_EnableInstancingVariants: 0 + m_DoubleSidedGI: 0 + m_CustomRenderQueue: -1 + stringTagMap: {} + disabledShaderPasses: + - MOTIONVECTORS + m_LockedProperties: + m_SavedProperties: + serializedVersion: 3 + m_TexEnvs: + - _BaseMap: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _BumpMap: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _DetailAlbedoMap: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _DetailMask: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _DetailNormalMap: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _EmissionMap: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _MainTex: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _MetallicGlossMap: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _OcclusionMap: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _ParallaxMap: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _SpecGlossMap: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - unity_Lightmaps: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - unity_LightmapsInd: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - unity_ShadowMasks: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + m_Ints: [] + m_Floats: + - _AlphaClip: 0 + - _AlphaToMask: 0 + - _AmbientStrength: 0.1 + - _Blend: 0 + - _BlendModePreserveSpecular: 1 + - _Brightness: 0.25 + - _BumpScale: 1 + - _CLOUDSENABLED: 1 + - _ClearCoatMask: 0 + - _ClearCoatSmoothness: 0 + - _Cloud_Change: 0.001 + - _Cloud_Cover: 0.5 + - _Cloud_Density: 0.01 + - _Cloud_Strength: 1 + - _Cull: 2 + - _Cutoff: 0.5 + - _DetailAlbedoMapScale: 1 + - _DetailNormalMapScale: 1 + - _DstBlend: 0 + - _DstBlendAlpha: 0 + - _EnvironmentReflections: 1 + - _GlossMapScale: 0 + - _Glossiness: 0 + - _GlossyReflections: 0 + - _MAIN_LIGHT: 0 + - _Metallic: 0 + - _MinimumDarkness: 0.2 + - _OcclusionStrength: 1 + - _Parallax: 0.005 + - _QueueControl: 0 + - _QueueOffset: 0 + - _ReceiveShadows: 1 + - _SHADOWS_SOFT: 1 + - _Shades: 7 + - _Smoothness: 0.5 + - _SmoothnessTextureChannel: 0 + - _SpecularHighlights: 1 + - _SrcBlend: 1 + - _SrcBlendAlpha: 1 + - _Surface: 0 + - _VerticalDifference: 1 + - _WindDensity: 0.2 + - _WindStrength: 0.3 + - _WorkflowMode: 1 + - _XRMotionVectorsPass: 1 + - _ZWrite: 1 + m_Colors: + - _BaseColor: {r: 1, g: 1, b: 1, a: 1} + - _Cloud_Movement: {r: 0.2, g: 0.2, b: 0, a: 0} + - _Cloud_Step: {r: 13, g: 17, b: 0, a: 0} + - _Color: {r: 1, g: 1, b: 1, a: 1} + - _DiffuseColor: {r: 0.60541177, g: 0.82788235, b: 0.5798824, a: 1} + - _EmissionColor: {r: 0, g: 0, b: 0, a: 1} + - _ShadowDiffuseColor: {r: 0.5434118, g: 0.744, b: 0.5215294, a: 1} + - _SpecColor: {r: 0.19999996, g: 0.19999996, b: 0.19999996, a: 1} + - _WindMovement: {r: 6, g: 0, b: 0, a: 0} + m_BuildTextureStacks: [] + m_AllowLocking: 1 diff --git a/Assets/WL/Look/Farm/Materials/Farm_Grass_Arena.mat.meta b/Assets/WL/Look/Farm/Materials/Farm_Grass_Arena.mat.meta new file mode 100644 index 000000000..b83daf857 --- /dev/null +++ b/Assets/WL/Look/Farm/Materials/Farm_Grass_Arena.mat.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: dc21f047088dee14f9b080798ebe8560 +NativeFormatImporter: + externalObjects: {} + mainObjectFileID: 2100000 + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/WL/Look/Farm/Materials/Farm_IslandTop_Arena.mat b/Assets/WL/Look/Farm/Materials/Farm_IslandTop_Arena.mat new file mode 100644 index 000000000..17dd2d1dc --- /dev/null +++ b/Assets/WL/Look/Farm/Materials/Farm_IslandTop_Arena.mat @@ -0,0 +1,103 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!21 &2100000 +Material: + serializedVersion: 8 + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_Name: Farm_IslandTop_Arena + m_Shader: {fileID: -6465566751694194690, guid: 378227f8a69213e419dfb0d889d8dd2f, + type: 3} + m_Parent: {fileID: 0} + m_ModifiedSerializedProperties: 0 + m_ValidKeywords: + - _OUTLINESENABLED + - _SHADOWS_SOFT + m_InvalidKeywords: + - _CLOUDSENABLED + m_LightmapFlags: 4 + m_EnableInstancingVariants: 0 + m_DoubleSidedGI: 0 + m_CustomRenderQueue: -1 + stringTagMap: + RenderType: Opaque + disabledShaderPasses: + - MOTIONVECTORS + m_LockedProperties: + m_SavedProperties: + serializedVersion: 3 + m_TexEnvs: + - _BaseMap: + m_Texture: {fileID: 2800000, guid: c8df71f32cd52ec4ab69508f09a66921, type: 3} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _ShadowBaseMap: + m_Texture: {fileID: 2800000, guid: c8df71f32cd52ec4ab69508f09a66921, type: 3} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - unity_Lightmaps: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - unity_LightmapsInd: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - unity_ShadowMasks: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + m_Ints: [] + m_Floats: + - _AlphaClip: 0 + - _AlphaToMask: 0 + - _Blend: 0 + - _Brightness: 0.25 + - _CastShadows: 1 + - _Cloud_Change: 0.001 + - _Cloud_Cover: 0.5 + - _Cloud_Density: 0.01 + - _Cloud_Strength: 1 + - _Cull: 2 + - _DepthEdgeStrength: 0.5 + - _DepthThreshold: 0.01 + - _DstBlend: 0 + - _DstBlendAlpha: 0 + - _MinimumDarkness: 0.2 + - _NormalEdgeStrength: 0.3 + - _NormalThreshold: 1 + - _OUTLINESENABLED: 1 + - _QueueControl: 0 + - _QueueOffset: 0 + - _Shades: 7 + - _SrcBlend: 1 + - _SrcBlendAlpha: 1 + - _Surface: 0 + - _XRMotionVectorsPass: 1 + - _ZTest: 4 + - _ZWrite: 1 + - _ZWriteControl: 0 + m_Colors: + - _Cloud_Movement: {r: 0.2, g: 0.2, b: 0, a: 0} + - _Cloud_Step: {r: 13, g: 17, b: 0, a: 0} + - _DiffuseColor: {r: 1, g: 1, b: 1, a: 1} + - _NormalBias: {r: 1, g: 1, b: 1, a: 0} + - _Outline: {r: 0, g: 0, b: 0, a: 0} + - _ShadowDiffuseColor: {r: 0.3248, g: 0.3416, b: 0.3936, a: 1} + m_BuildTextureStacks: [] + m_AllowLocking: 1 +--- !u!114 &4831086338097714236 +MonoBehaviour: + m_ObjectHideFlags: 11 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 0} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: d0353a89b1f911e48b9e16bdc9f2e058, type: 3} + m_Name: + m_EditorClassIdentifier: Unity.RenderPipelines.Universal.Editor::UnityEditor.Rendering.Universal.AssetVersion + version: 10 diff --git a/Assets/WL/Look/Farm/Materials/Farm_IslandTop_Arena.mat.meta b/Assets/WL/Look/Farm/Materials/Farm_IslandTop_Arena.mat.meta new file mode 100644 index 000000000..acdc32173 --- /dev/null +++ b/Assets/WL/Look/Farm/Materials/Farm_IslandTop_Arena.mat.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 197cbcbf4165c954887272f7aea2ac42 +NativeFormatImporter: + externalObjects: {} + mainObjectFileID: 2100000 + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/WL/Look/Farm/Resources/WL/WLIslandLookSettings.asset b/Assets/WL/Look/Farm/Resources/WL/WLIslandLookSettings.asset index 8af4a13ed..05de71677 100644 --- a/Assets/WL/Look/Farm/Resources/WL/WLIslandLookSettings.asset +++ b/Assets/WL/Look/Farm/Resources/WL/WLIslandLookSettings.asset @@ -23,7 +23,7 @@ MonoBehaviour: to: {fileID: 2100000, guid: 68107aa66ca3855458e2ac55c239d57c, type: 2} - enabled_: 1 from: {fileID: 2100000, guid: 8b9c3fe585ec43742a0e29e3b3c82f6b, type: 2} - to: {fileID: 2100000, guid: 500f1cf3127afb748b316fe28b128edc, type: 2} + to: {fileID: 2100000, guid: 197cbcbf4165c954887272f7aea2ac42, type: 2} - enabled_: 1 from: {fileID: 2100000, guid: ee0c382820516a74ba37852af34ecd11, type: 2} to: {fileID: 2100000, guid: ece3895a184497040812f320d69cb967, type: 2} @@ -36,7 +36,7 @@ MonoBehaviour: - enabled_: 1 from: {fileID: 2100000, guid: ce0f8fd131f36964dbc918b8c63f838b, type: 2} to: {fileID: 2100000, guid: 1c9ce9b7865f6d643ad9601f6fa81ba3, type: 2} - islandTopMaterial: {fileID: 2100000, guid: 500f1cf3127afb748b316fe28b128edc, type: 2} + islandTopMaterial: {fileID: 2100000, guid: 197cbcbf4165c954887272f7aea2ac42, type: 2} skipSoilRenderers: 1 soilToneEnabled: 1 soilTint: {r: 0.84, g: 0.86, b: 0.9, a: 1} @@ -79,11 +79,11 @@ MonoBehaviour: - enabled_: 1 label: "\uD480" mesh: {fileID: -4413095505993930501, guid: 1f298817fdd2a184480e8af5b21278bc, type: 3} - material: {fileID: 2100000, guid: bfa67f7091cb7ff418051fec03e5c28c, type: 2} + material: {fileID: 2100000, guid: dc21f047088dee14f9b080798ebe8560, type: 2} probability: 100 scale: 0.35 normalOffset: 0.04 - density: 1.8 + density: 2.5 - enabled_: 1 label: "\uAF43" mesh: {fileID: -6327915695457451627, guid: dab2c84bf0b5ced4aaf0cffc4c491d55, type: 3} @@ -91,7 +91,7 @@ MonoBehaviour: probability: 1 scale: 0.35 normalOffset: 0.04 - density: 1.8 + density: 2.5 - enabled_: 1 label: "\uC790\uAC08" mesh: {fileID: 2928966540353291585, guid: 7f1f11ac2c783374b876f8dc2bb7c7db, type: 3}