// WL833_MagicBoltVisual.cs — 지팡이 기본 공격 투사체 시각 프리팹 생성 (PD 2026-10-10 「마법 투사체 배치」) // unity command run_script --file AgentScripts/WL833_MagicBoltVisual.cs --entry WL833_MagicBoltVisual.Build // 원본 `Projectile_PinkMagicArrow`(스킬 투사체 · bullet·trail 파티클)를 인스턴스로 풀어 루트의 스크립트·콜라이더·리지드바디를 떼고 // 자식 파티클만 남긴 WL 프리팹 `Assets/WL/Combat/Weapon/Resources/WL/WL_MagicBoltVisual.prefab` 을 만든다(원본 0줄). // 런타임 WLProjectileVisual 이 Projectile_10301/10302 인스턴스에 자식으로 붙인다. using System.Linq; using System.Text; using UnityEditor; using UnityEngine; public static class WL833_MagicBoltVisual { const string Src = "Assets/Res_Addr/Projectile/Projectile_PinkMagicArrow.prefab"; const string Dst = "Assets/WL/Combat/Weapon/Resources/WL/WL_MagicBoltVisual.prefab"; public static object Build() { var sb = new StringBuilder(); var src = AssetDatabase.LoadAssetAtPath(Src); if (src == null) return "원본 없음 " + Src; var inst = (GameObject)PrefabUtility.InstantiatePrefab(src); try { PrefabUtility.UnpackPrefabInstance(inst, PrefabUnpackMode.Completely, InteractionMode.AutomatedAction); inst.name = "WL_MagicBoltVisual"; inst.transform.position = Vector3.zero; inst.transform.rotation = Quaternion.identity; inst.transform.localScale = Vector3.one; // 루트의 Transform 외 컴포넌트 제거(스크립트 → 콜라이더 → 리지드바디 순 · 의존성 때문에 여러 번 돈다) int removed = 0; for (int pass = 0; pass < 6; pass++) { var comps = inst.GetComponents().Where(c => c != null && !(c is Transform)).ToArray(); if (comps.Length == 0) break; foreach (var c in comps.OrderBy(c => c is Rigidbody ? 2 : (c is Collider ? 1 : 0))) { try { Object.DestroyImmediate(c); removed++; } catch (System.Exception ex) { sb.AppendLine(" 제거 실패 " + c.GetType().Name + ": " + ex.Message); } } } // 자식의 콜라이더·스크립트도 제거(파티클·렌더러만 남긴다) foreach (var col in inst.GetComponentsInChildren(true)) { Object.DestroyImmediate(col); removed++; } foreach (var mb in inst.GetComponentsInChildren(true)) { if (mb != null) { sb.AppendLine(" 자식 스크립트 제거 " + mb.GetType().Name + " @" + mb.gameObject.name); Object.DestroyImmediate(mb); removed++; } } int ps = 0; foreach (var p in inst.GetComponentsInChildren(true)) { var m = p.main; m.playOnAwake = true; m.loop = false; ps++; } var dir = System.IO.Path.GetDirectoryName(Dst); if (!AssetDatabase.IsValidFolder(dir)) System.IO.Directory.CreateDirectory(dir); PrefabUtility.SaveAsPrefabAsset(inst, Dst); AssetDatabase.ImportAsset(Dst); sb.AppendLine("저장 " + Dst + " · 제거 컴포넌트 " + removed + " · 파티클 " + ps + " · 자식 " + inst.transform.childCount); } finally { Object.DestroyImmediate(inst); } return sb.ToString(); } }