// WL761_SlashPrefab.cs — PD 지시 #761 실측 도구 (에디트 모드 · Assets 무수정) // unity command run_script --file AgentScripts/WL761_SlashPrefab.cs --entry WL761_SlashPrefab.Dump --args '["Effect_Slash_10101_1"]' // unity command run_script --file AgentScripts/WL761_SlashPrefab.cs --entry WL761_SlashPrefab.DumpMany --args '["Effect_Slash_10101_1,Effect_Slash_10101_3,Effect_Slash_10102_1,Effect_Slash_10501_1,Effect_Slash_10502_1"]' // 슬래시 이펙트 프리팹의 이미터별 로컬 자세(오일러) · 렌더 모드 · 메시 · 셰이프 · 시뮬레이션 공간 · 머티리얼/텍스처를 덤프한다. // "무기 방향에 맞게 배치" 를 위해 프리팹의 크레센트가 어느 로컬 평면/축에 그려지는지 파악하는 용도. using System.Linq; using System.Text; using UnityEditor; using UnityEngine; public static class WL761_SlashPrefab { public static object DumpMany(string csv) { var sb = new StringBuilder(); foreach (var n in csv.Split(',')) sb.AppendLine(Dump(n.Trim()).ToString()); return sb.ToString(); } public static object Dump(string prefabName) { var guids = AssetDatabase.FindAssets(prefabName + " t:Prefab"); string path = guids.Select(AssetDatabase.GUIDToAssetPath).FirstOrDefault(p => System.IO.Path.GetFileNameWithoutExtension(p) == prefabName); if (path == null) return "prefab not found: " + prefabName; var go = AssetDatabase.LoadAssetAtPath(path); var sb = new StringBuilder(); sb.AppendLine("== " + prefabName + " (" + path + ") root euler=" + go.transform.localEulerAngles.ToString("F0") + " scale=" + go.transform.localScale.ToString("F2")); foreach (var ps in go.GetComponentsInChildren(true)) { var t = ps.transform; var r = ps.GetComponent(); var main = ps.main; var shape = ps.shape; var vel = ps.velocityOverLifetime; string mat = r != null && r.sharedMaterial != null ? r.sharedMaterial.name : "-"; string tex = r != null && r.sharedMaterial != null && r.sharedMaterial.mainTexture != null ? r.sharedMaterial.mainTexture.name : "-"; string mesh = r != null && r.renderMode == ParticleSystemRenderMode.Mesh && r.mesh != null ? r.mesh.name : ""; sb.AppendLine(string.Format(" {0,-18} on={1} depth={2} localEuler={3} localPos={4} scale={5} sim={6} render={7}{8} align={9} startRot3D={10} startSize={11:F2} life={12:F2} loop={13} shape={14}{15} mat={16} tex={17}", t.name, r != null && r.enabled, Depth(t, go.transform), t.localEulerAngles.ToString("F0"), t.localPosition.ToString("F2"), t.localScale.ToString("F1"), main.simulationSpace, r != null ? r.renderMode.ToString() : "-", mesh != "" ? "(" + mesh + ")" : "", r != null ? r.alignment.ToString() : "-", main.startRotation3D, main.startSize.constantMax, main.startLifetime.constantMax, main.loop, shape.enabled ? shape.shapeType.ToString() : "off", shape.enabled ? " shapeRot=" + shape.rotation.ToString("F0") : "", mat, tex)); } return sb.ToString(); } static int Depth(Transform t, Transform root) { int d = 0; while (t != null && t != root) { d++; t = t.parent; } return d; } }