// WL839_ChargeVisuals.cs — 활 3타 「기 모으기」·「강화 화살 글로우」 시각 프리팹 생성 (#839 · PD 「활에 기가 모이는 임팩트 후 좀 더 큰 화살」) // unity command run_script --file AgentScripts/WL839_ChargeVisuals.cs --entry WL839_ChargeVisuals.Build // 원본(Hovl Studio RPG VFX Bundle · 프로젝트 안 에셋)을 인스턴스로 풀어 파티클·렌더러만 남긴 WL 프리팹 2종을 만든다(원본 0줄): // Magic Sparks → Assets/WL/Combat/Weapon/Resources/WL/WL_BowChargeVisual.prefab (활 소켓에 0.45 s · 크기 0.4) // Gold dot → Assets/WL/Combat/Weapon/Resources/WL/WL_ArrowChargeVisual.prefab (강화 화살 자식 · 크기 0.5) using System.Linq; using System.Text; using UnityEditor; using UnityEngine; public static class WL839_ChargeVisuals { const string SrcDir = "Assets/ResWork/VFX/Hovl Studio/RPG VFX Bundle/Prefabs/Magic buffs and hits/"; const string DstDir = "Assets/WL/Combat/Weapon/Resources/WL/"; public static object Build() { if (EditorApplication.isPlaying) return "skipped: playing"; var sb = new StringBuilder(); sb.Append(Clone(SrcDir + "Magic Sparks.prefab", DstDir + "WL_BowChargeVisual.prefab", "WL_BowChargeVisual", 0.4f, true)).Append('\n'); sb.Append(Clone(SrcDir + "Gold dot.prefab", DstDir + "WL_ArrowChargeVisual.prefab", "WL_ArrowChargeVisual", 0.5f, true)); AssetDatabase.SaveAssets(); return sb.ToString(); } static string Clone(string srcPath, string dstPath, string name, float scale, bool loop) { var src = AssetDatabase.LoadAssetAtPath(srcPath); if (src == null) return "원본 없음 " + srcPath; var inst = (GameObject)PrefabUtility.InstantiatePrefab(src); try { PrefabUtility.UnpackPrefabInstance(inst, PrefabUnpackMode.Completely, InteractionMode.AutomatedAction); inst.name = name; inst.transform.position = Vector3.zero; inst.transform.rotation = Quaternion.identity; inst.transform.localScale = Vector3.one * scale; 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))) { if (c is ParticleSystem || c is ParticleSystemRenderer) continue; try { Object.DestroyImmediate(c); removed++; } catch (System.Exception) { } } if (inst.GetComponents().All(c => c is Transform || c is ParticleSystem || c is ParticleSystemRenderer)) break; } foreach (var col in inst.GetComponentsInChildren(true)) { Object.DestroyImmediate(col); removed++; } foreach (var mb in inst.GetComponentsInChildren(true)) { if (mb != null) { Object.DestroyImmediate(mb); removed++; } } foreach (var l in inst.GetComponentsInChildren(true)) { Object.DestroyImmediate(l); removed++; } int ps = 0; foreach (var p in inst.GetComponentsInChildren(true)) { var m = p.main; m.playOnAwake = true; m.loop = loop; ps++; } PrefabUtility.SaveAsPrefabAsset(inst, dstPath); AssetDatabase.ImportAsset(dstPath); return "저장 " + dstPath + " · 제거 " + removed + " · 파티클 " + ps + " · 크기 " + scale; } finally { Object.DestroyImmediate(inst); } } }