Project_WL/AgentScripts/WL833_MagicBoltVisual.cs

53 lines
3.3 KiB
C#

// 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<GameObject>(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<Component>().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<Collider>(true)) { Object.DestroyImmediate(col); removed++; }
foreach (var mb in inst.GetComponentsInChildren<MonoBehaviour>(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<ParticleSystem>(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();
}
}