// WL-816k — ① 데모 물 셰이더(Water.shadergraph) 복사본 생성 + 셰이더 속성 전수 실측 // 원본 Assets/3DPixelArtEnvironment/** 는 0줄 수정. 복사본만 만든다. using UnityEngine; using UnityEditor; using System.Text; public static class WL816k_Build { const string SRC = "Assets/3DPixelArtEnvironment/Materials/Water.mat"; const string DST = "Assets/WL/Look/Farm/Materials/Farm_Water_Demo.mat"; const string SO = "Assets/WL/Look/Farm/Resources/WL/WLIslandLookSettings.asset"; public static void Run() { var sb = new StringBuilder(); sb.AppendLine("=== WL-816k ① 데모 물 복사본 + 셰이더 속성 실측 ==="); var src = AssetDatabase.LoadAssetAtPath(SRC); sb.AppendLine("원본 = " + (src == null ? "🔴 없음" : src.name + " · shader " + src.shader.name)); if (src == null) { Done(sb); return; } if (AssetDatabase.LoadAssetAtPath(DST) == null) { bool ok = AssetDatabase.CopyAsset(SRC, DST); sb.AppendLine("복사 " + (ok ? "성공" : "🔴 실패") + " → " + DST); AssetDatabase.Refresh(); } else sb.AppendLine("복사본 이미 있음 → " + DST); var dst = AssetDatabase.LoadAssetAtPath(DST); if (dst == null) { sb.AppendLine("🔴 복사본 로드 실패"); Done(sb); return; } sb.AppendLine("복사본 = " + dst.name + " · shader " + (dst.shader == null ? "null" : dst.shader.name) + " · renderQueue " + dst.renderQueue + " · GUID " + AssetDatabase.AssetPathToGUID(DST)); // ── 셰이더 속성 전수 ──────────────────────────────────── var sh = dst.shader; sb.AppendLine(""); sb.AppendLine("[셰이더 속성 " + ShaderUtil.GetPropertyCount(sh) + "개]"); for (int i = 0; i < ShaderUtil.GetPropertyCount(sh); i++) { string n = ShaderUtil.GetPropertyName(sh, i); var t = ShaderUtil.GetPropertyType(sh, i); string v = "?"; if (t == ShaderUtil.ShaderPropertyType.Color) v = dst.GetColor(n).ToString("F3"); else if (t == ShaderUtil.ShaderPropertyType.Vector) v = dst.GetVector(n).ToString("F3"); else if (t == ShaderUtil.ShaderPropertyType.Float || t == ShaderUtil.ShaderPropertyType.Range) v = dst.GetFloat(n).ToString("F4"); else if (t == ShaderUtil.ShaderPropertyType.TexEnv) { var tx = dst.GetTexture(n); v = tx == null ? "(없음)" : tx.name + " " + tx.width + "x" + tx.height; } if (ShaderUtil.IsShaderPropertyHidden(sh, i)) continue; sb.AppendLine(" " + n + " [" + t + "] = " + v); } sb.AppendLine(""); sb.AppendLine("[키워드] " + string.Join(" · ", dst.shaderKeywords)); // ── 지금 SO ──────────────────────────────────────────── var so = AssetDatabase.LoadAssetAtPath(SO) as WL.Look.Farm.WLIslandLookSettings; if (so != null) { sb.AppendLine(""); sb.AppendLine("[SO 지금] waterMode=" + so.waterMode + " · waterTo=" + (so.waterTo == null ? "null" : so.waterTo.name) + " · waterFrom=" + (so.waterFrom == null ? "null" : so.waterFrom.name) + " · shoreFoamEnabled=" + so.shoreFoamEnabled + " · shoreFoamWidth=" + so.shoreFoamWidth); } else sb.AppendLine("🔴 SO 로드 실패"); // ── 섬 물 평면 vs 데모 평면 크기 ─────────────────────── var pf = AssetDatabase.LoadAssetAtPath("Assets/3DPixelArtEnvironment/Prefabs/Water_Plane.prefab"); if (pf != null) { var mf = pf.GetComponentInChildren(); sb.AppendLine("데모 Water_Plane: scale " + pf.transform.localScale.ToString("F2") + " · mesh " + (mf == null ? "?" : mf.sharedMesh.name + " bounds " + mf.sharedMesh.bounds.size.ToString("F1"))); } Done(sb); } static void Done(StringBuilder sb) { System.IO.File.WriteAllText("AgentScripts/WL816k_BUILD.txt", sb.ToString()); Debug.Log("[816k build]\n" + sb); } }