diff --git a/AgentScripts/WL816f_Final.cs b/AgentScripts/WL816f_Final.cs new file mode 100644 index 000000000..10f86f899 --- /dev/null +++ b/AgentScripts/WL816f_Final.cs @@ -0,0 +1,114 @@ +// WL-816f — 마무리 실측: ⓐ성능 전(밀도 2.5)/후(1.8) ⓑ밭 칸 표시 유지 ⓒ확장 시 새 타일에 풀 +public static class WL816f_Final +{ + public static void Start() + { + var go = UnityEngine.GameObject.Find("~WL816fFinal"); + if (go != null) UnityEngine.Object.DestroyImmediate(go); + go = new UnityEngine.GameObject("~WL816fFinal"); + go.AddComponent(); + } +} + +public class WL816f_FinalRunner : UnityEngine.MonoBehaviour +{ + static System.Text.StringBuilder sb; + 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 < 6; i++) yield return new UnityEngine.WaitForSeconds(1f); + + var g = UnityEngine.Object.FindFirstObjectByType(UnityEngine.FindObjectsInactive.Include); + var src = WL.Look.Farm.WLIslandLookSettings.Instance; + var rt = UnityEngine.Object.Instantiate(src); // 에셋 무변경 + g.cfg = rt; + var cam = LiveCam(); + + // ── ⓐ 성능: 816e(2.5) vs 816f(1.8) vs 풀 없음 ─────────────── + L("[성능] 같은 카메라(" + (cam ? cam.name : "?") + ") · 1080×1920 오프스크린 60프레임 평균"); + float[] dens = { 2.5f, 1.8f }; + for (int k = 0; k < dens.Length; k++) + { + SetD(rt, dens[k]); g.Rebuild(); yield return null; yield return null; + float ms = Bench(cam, 60); + L(" 밀도 " + dens[k].ToString("F2") + " : 인스턴스 " + WL.Look.Farm.WLIslandGrass.Instances + + " · 삼각형 " + WL.Look.Farm.WLIslandGrass.Triangles + + " · 드로우콜 +" + WL.Look.Farm.WLIslandGrass.DrawnConfigs + + " · " + ms.ToString("F3") + " ms/frame (" + (1000f / ms).ToString("F0") + " fps 환산)"); + } + g.enabled = false; yield return null; yield return null; + float off = Bench(cam, 60); + L(" 풀 없음 : " + off.ToString("F3") + " ms/frame"); + g.enabled = true; SetD(rt, 1.8f); g.Rebuild(); yield return null; + + // ── ⓑ 밭 칸 표시가 남아 있나(두 색이 서로 달라야 한다) ────── + L(""); + var soils = UnityEngine.Object.FindObjectsByType(UnityEngine.FindObjectsInactive.Exclude, UnityEngine.FindObjectsSortMode.None); + var seen = new System.Collections.Generic.Dictionary(); + for (int i = 0; i < soils.Length; i++) + { + var r = soils[i].GetComponentInChildren(true); + if (r == null) continue; + var h = UnityEngine.ColorUtility.ToHtmlStringRGB(r.material.color); + seen[h] = seen.ContainsKey(h) ? seen[h] + 1 : 1; + } + L("[밭 칸 표시] Soil " + soils.Length + "개의 색 종류 " + seen.Count + " (2 여야 칸 구분이 살아 있다)"); + foreach (var kv in seen) L(" " + kv.Key + " ×" + kv.Value); + + // ── ⓒ 확장: 타일 하나를 잠갔다 다시 열어 풀이 따라오는지 ──── + L(""); + var islands = UnityEngine.Object.FindObjectsByType(UnityEngine.FindObjectsInactive.Exclude, UnityEngine.FindObjectsSortMode.None); + CryingSnow.FarmingIsland.Island target = null; + for (int i = 0; i < islands.Length; i++) + if (islands[i].IsUnlocked && islands[i].gameObject.activeInHierarchy && islands[i].transform.position != UnityEngine.Vector3.zero) { target = islands[i]; break; } + int before = WL.Look.Farm.WLIslandGrass.Tiles; + if (target != null) + { + target.gameObject.SetActive(false); + yield return new UnityEngine.WaitForSeconds(2.5f); + int mid = WL.Look.Farm.WLIslandGrass.Tiles; + target.gameObject.SetActive(true); + yield return new UnityEngine.WaitForSeconds(3f); + int after = WL.Look.Farm.WLIslandGrass.Tiles; + L("[확장] 풀 깔린 타일 " + before + " → (타일 1개 잠금) " + mid + " → (다시 열기) " + after + + (after == before ? " ✔ 새로 열린 타일에 풀이 자동으로 깔린다" : " 🔴 복귀 실패")); + } + else L("[확장] 대상 타일 없음(미확인)"); + + System.IO.File.WriteAllText("AgentScripts/WL816f_FINAL.txt", sb.ToString()); + UnityEngine.Debug.Log("[816f final]\n" + sb.ToString()); + } + + static void L(string s) { sb.AppendLine(s); } + static void SetD(WL.Look.Farm.WLIslandLookSettings c, float d) + { + for (int i = 0; i < c.scatter.Length; i++) + if (c.scatter[i] != null && (c.scatter[i].label.Contains("풀") || c.scatter[i].label.Contains("꽃"))) c.scatter[i].density = d; + } + static UnityEngine.Camera LiveCam() + { + var cams = UnityEngine.Object.FindObjectsByType(UnityEngine.FindObjectsInactive.Exclude, UnityEngine.FindObjectsSortMode.None); + UnityEngine.Camera t = null; + for (int i = 0; i < cams.Length; i++) { var c = cams[i]; if (!c.enabled || c.targetTexture != null) continue; if (t == null || c.depth > t.depth) t = c; } + return t; + } + static float Bench(UnityEngine.Camera cam, int frames) + { + if (cam == null) return -1f; + var rt = new UnityEngine.RenderTexture(1080, 1920, 24, UnityEngine.RenderTextureFormat.ARGB32, UnityEngine.RenderTextureReadWrite.sRGB); + rt.Create(); var prev = cam.targetTexture; 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 = prev; + rt.Release(); UnityEngine.Object.DestroyImmediate(rt); + return (float)sw.Elapsed.TotalMilliseconds / frames; + } +}