Merge branch 'wl/gameplay/WL-816n-ground-match-arena'

This commit is contained in:
깃 관리자 2026-09-15 01:38:55 +09:00
commit 2fb0b8489e
12 changed files with 971 additions and 5 deletions

View File

@ -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<UnityEngine.Material>(TOP_A);
var gra = UnityEditor.AssetDatabase.LoadAssetAtPath<UnityEngine.Material>(GR_A);
var topD = UnityEditor.AssetDatabase.LoadAssetAtPath<UnityEngine.Material>(TOP_D);
var graD = UnityEditor.AssetDatabase.LoadAssetAtPath<UnityEngine.Material>(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<UnityEngine.Material>(TOP_A);
var gra = UnityEditor.AssetDatabase.LoadAssetAtPath<UnityEngine.Material>(GR_A);
var topD = UnityEditor.AssetDatabase.LoadAssetAtPath<UnityEngine.Material>(TOP_D);
var graD = UnityEditor.AssetDatabase.LoadAssetAtPath<UnityEngine.Material>(GR_D);
// SO 값
var so = UnityEditor.AssetDatabase.LoadAssetAtPath<UnityEngine.ScriptableObject>(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());
}
}

View File

@ -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));
}
}

132
AgentScripts/WL816n_Demo.cs Normal file
View File

@ -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<UnityEngine.Terrain>();
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<Environment.Instancing.TerrainInstancesBehaviour>();
if (tib == null) tib = UnityEngine.Object.FindFirstObjectByType<Environment.Instancing.TerrainInstancesBehaviour>();
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<UnityEngine.Camera>();
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<int>();
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<int>();
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());
}
}

View File

@ -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);
}
}

153
AgentScripts/WL816n_Play.cs Normal file
View File

@ -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<WL816n_PlayRunner>();
}
}
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<WL.Look.Farm.WLIslandGrass>(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<UnityEngine.Material>(TOP_A);
var graA = UnityEditor.AssetDatabase.LoadAssetAtPath<UnityEngine.Material>(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<UnityEngine.Camera>();
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());
}
}

View File

@ -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.Terrain>(
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.Renderer>(
UnityEngine.FindObjectsInactive.Include, UnityEngine.FindObjectsSortMode.None);
var seen = new System.Collections.Generic.HashSet<string>();
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.Light>(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.Rendering.Volume>(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);
}
}

View File

@ -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<UnityEngine.Terrain>();
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.Renderer>(
UnityEngine.FindObjectsInactive.Include, UnityEngine.FindObjectsSortMode.None);
var cnt = new System.Collections.Generic.Dictionary<string, int>();
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<string, string>();
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") + ")";
}
}

View File

@ -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

View File

@ -0,0 +1,8 @@
fileFormatVersion: 2
guid: dc21f047088dee14f9b080798ebe8560
NativeFormatImporter:
externalObjects: {}
mainObjectFileID: 2100000
userData:
assetBundleName:
assetBundleVariant:

View File

@ -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

View File

@ -0,0 +1,8 @@
fileFormatVersion: 2
guid: 197cbcbf4165c954887272f7aea2ac42
NativeFormatImporter:
externalObjects: {}
mainObjectFileID: 2100000
userData:
assetBundleName:
assetBundleVariant:

View File

@ -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}