Project_WL/AgentScripts/WL816f_Probe.cs

114 lines
6.3 KiB
C#
Raw Permalink Normal View History

[WL-816f] 바닥을 데모와 일치 — 잔디 단색 + 풀 대비↓ + 밀도 2.5→1.8 + 밭 칸 표시 톤↓ (#816) PD 「내가 실행할 때는 전혀 풀밭이 아니야 · 바닥이 완전히 같은 느낌이 나도록」 ■ ① PD 실행 경로 실측 = 훅은 실제로 돈다(버그 아님) InGame 활성 + Level01 Additive 재현: 머티리얼 1,575 렌더러 교체 · 풀 생성 · ReferenceLook on · 콘솔 error 0. 「안 나온다」가 아니라 「데모와 전혀 다르게 보인다」였다. 다만 이 경로에서만 생기는 실측 차이 2가지를 찾아 보고에 적었다 (세이브 파일이 활성 씬 이름으로 갈린다 · RenderSettings 가 InGame 소유). ■ ② 바닥 3요소 (같은 화각·같은 거리 캡처로 판정) 체크무늬 : 잔디 타일 텍스처는 단색(#A0E4A2) — 격자 0. 밭(Soil)의 칸 표시는 게임 기능이라 남기고 **색만** 데모 톤으로(soilTint·soilCheckerContrast). 바닥 색 : #AFEDAE → #A0E4A2 (화면색 평균 데모 #94BE81 ↔ 우리 #9AC37E) 풀 색 : 새 복사본 Farm_Grass_Demo.mat (_DiffuseColor #A6E39F · _ShadowDiffuseColor #95CC8F) → 풀이 바닥과 같은 색으로 깔려 「카펫」이 사라진다(에지% 8.09 → 1.96 · 데모 1.79) 밀도 : 2.5 → 1.8 (6.25 → 3.24 개/㎡) 🔴 Assets/FarmingIsland/** 0줄 · Assets/Script/** 0줄 · 3DPixelArtEnvironment 0줄 · ProjectSettings 0줄 · 전역 URP/품질 0. 되돌리기 = enabled_ = 0. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-09-13 05:19:39 +00:00
// WL-816f — ① PD 실행 경로(로그인 → Load_Map(900) → Level01 Additive) 구조 실측
// 에디트 모드 전용. InGame 씬이 섬 위에 무엇을 얹는지(조명·Volume·카메라)를 본다.
public static class WL816f_Probe
{
public static void Run()
{
var sb = new System.Text.StringBuilder();
// 1) InGame 씬(= PD 경로의 활성 씬)을 연다
var sc = UnityEditor.SceneManagement.EditorSceneManager.OpenScene(
"Assets/Scenes/InGame.unity", UnityEditor.SceneManagement.OpenSceneMode.Single);
sb.AppendLine("=== InGame.unity (PD 경로의 ACTIVE 씬) ===");
Dump(sb, sc);
// 2) Level01 을 Additive 로 얹는다 (= Load_Map(900) 과 같은 구조)
var sc2 = UnityEditor.SceneManagement.EditorSceneManager.OpenScene(
"Assets/FarmingIsland/Scenes/Level01.unity", UnityEditor.SceneManagement.OpenSceneMode.Additive);
sb.AppendLine();
sb.AppendLine("=== Level01.unity (Additive) ===");
Dump(sb, sc2);
sb.AppendLine();
sb.AppendLine("active scene = " + UnityEngine.SceneManagement.SceneManager.GetActiveScene().name);
sb.AppendLine("RenderSettings(활성 씬 기준) ambient=" + UnityEngine.RenderSettings.ambientMode
+ " light=" + UnityEngine.RenderSettings.ambientLight
+ " sky=" + UnityEngine.RenderSettings.ambientSkyColor
+ " skyboxMat=" + (UnityEngine.RenderSettings.skybox ? UnityEngine.RenderSettings.skybox.name : "없음")
+ " fog=" + UnityEngine.RenderSettings.fog);
// 3) 레이어 이름 확인 (풀은 Default 레이어에 그려진다)
sb.AppendLine("layer Default=" + UnityEngine.LayerMask.NameToLayer("Default"));
for (int i = 0; i < 32; i++)
{
string n = UnityEngine.LayerMask.LayerToName(i);
if (!string.IsNullOrEmpty(n)) sb.Append(i + ":" + n + " ");
}
sb.AppendLine();
System.IO.File.WriteAllText("AgentScripts/WL816f_PROBE.txt", sb.ToString());
UnityEngine.Debug.Log(sb.ToString());
}
static void Dump(System.Text.StringBuilder sb, UnityEngine.SceneManagement.Scene sc)
{
var roots = sc.GetRootGameObjects();
sb.AppendLine("roots=" + roots.Length);
for (int i = 0; i < roots.Length; i++) sb.Append(roots[i].name + (roots[i].activeSelf ? "" : "(off)") + " · ");
sb.AppendLine();
// 카메라
foreach (var r in roots)
foreach (var c in r.GetComponentsInChildren<UnityEngine.Camera>(true))
sb.AppendLine(" CAM " + Path(c.transform) + " active=" + c.gameObject.activeInHierarchy + "/" + c.enabled
+ " depth=" + c.depth + " mask=0x" + c.cullingMask.ToString("X")
+ " clear=" + c.clearFlags + " ortho=" + c.orthographic + " fov=" + c.fieldOfView
+ " far=" + c.farClipPlane
+ " urp=" + (c.GetComponent<UnityEngine.Rendering.Universal.UniversalAdditionalCameraData>() != null
? ("post=" + c.GetComponent<UnityEngine.Rendering.Universal.UniversalAdditionalCameraData>().renderPostProcessing
+ " volMask=0x" + c.GetComponent<UnityEngine.Rendering.Universal.UniversalAdditionalCameraData>().volumeLayerMask.value.ToString("X")
+ " type=" + c.GetComponent<UnityEngine.Rendering.Universal.UniversalAdditionalCameraData>().renderType)
: "없음"));
// 라이트
foreach (var r in roots)
foreach (var l in r.GetComponentsInChildren<UnityEngine.Light>(true))
sb.AppendLine(" LIGHT " + Path(l.transform) + " active=" + l.gameObject.activeInHierarchy + "/" + l.enabled
+ " " + l.type + " col=" + l.color + " I=" + l.intensity + " sh=" + l.shadows
+ " rot=" + l.transform.eulerAngles);
// Volume (포스트)
foreach (var r in roots)
foreach (var v in r.GetComponentsInChildren<UnityEngine.Rendering.Volume>(true))
sb.AppendLine(" VOL " + Path(v.transform) + " active=" + v.gameObject.activeInHierarchy + "/" + v.enabled
+ " global=" + v.isGlobal + " prio=" + v.priority + " weight=" + v.weight
+ " profile=" + (v.sharedProfile ? v.sharedProfile.name + " [" + Comps(v.sharedProfile) + "]" : "없음")
+ " layer=" + v.gameObject.layer);
// RenderSettings 는 씬별이다 — 씬을 활성으로 만들고 읽는다
var prev = UnityEngine.SceneManagement.SceneManager.GetActiveScene();
UnityEngine.SceneManagement.SceneManager.SetActiveScene(sc);
sb.AppendLine(" RS ambient=" + UnityEngine.RenderSettings.ambientMode
+ " light=" + UnityEngine.RenderSettings.ambientLight + " sky=" + UnityEngine.RenderSettings.ambientSkyColor
+ " I=" + UnityEngine.RenderSettings.ambientIntensity
+ " skyboxMat=" + (UnityEngine.RenderSettings.skybox ? UnityEngine.RenderSettings.skybox.name : "없음")
+ " fog=" + UnityEngine.RenderSettings.fog + " sun=" + (UnityEngine.RenderSettings.sun ? UnityEngine.RenderSettings.sun.name : "없음"));
if (prev.IsValid() && prev != sc) UnityEngine.SceneManagement.SceneManager.SetActiveScene(prev);
// MapData / GlobalVolumeMgr / CheckShadow 같은 룩 관여 컴포넌트
foreach (var r in roots)
foreach (var m in r.GetComponentsInChildren<UnityEngine.MonoBehaviour>(true))
{
if (m == null) continue;
string t = m.GetType().Name;
if (t == "MapData" || t == "GlobalVolumeMgr" || t == "CheckShadow" || t == "SetSkybox"
|| t == "GraphicsManager" || t == "UniversalRenderPipelineAsset")
sb.AppendLine(" COMP " + t + " @ " + Path(m.transform) + " active=" + m.gameObject.activeInHierarchy + "/" + m.enabled);
}
}
static string Comps(UnityEngine.Rendering.VolumeProfile p)
{
var s = "";
for (int i = 0; i < p.components.Count; i++) s += p.components[i].GetType().Name + (p.components[i].active ? "" : "(off)") + ",";
return s;
}
static string Path(UnityEngine.Transform t)
{
string s = t.name;
while (t.parent != null) { t = t.parent; s = t.name + "/" + s; }
return s;
}
}