diff --git a/Assets/Scripts/Skills/Effectors/ProjectileSpawner.cs b/Assets/Scripts/Skills/Effectors/ProjectileSpawner.cs index 88ac6d0..8c67219 100644 --- a/Assets/Scripts/Skills/Effectors/ProjectileSpawner.cs +++ b/Assets/Scripts/Skills/Effectors/ProjectileSpawner.cs @@ -27,13 +27,8 @@ namespace EerieVillage.Skills.Effectors var pc = inventory.GetComponent(); if (pc != null) facing = pc.Facing; - // 프리팹 로드 - GameObject prefab = LoadProjectilePrefab(data); - if (prefab == null) - { - Debug.LogWarning($"[ProjectileSpawner] 투사체 프리팹 로드 실패 (data.id={data.CardId})"); - return; - } + // 프리팹 로드 (없으면 fallback — Trigger 영역에서 직접 생성) + GameObject prefab = LoadProjectilePrefab(); // 다중 발사 수 (기본 1 + ExtraProjectiles) int count = 1 + Mathf.Max(0, inventory.Stats.ExtraProjectiles); @@ -45,7 +40,12 @@ namespace EerieVillage.Skills.Effectors float angle = startAngle + angleStep * i; Vector2 dir = RotateVector(facing, angle); - var go = Object.Instantiate(prefab, (Vector3)spawnPos, Quaternion.identity); + // BT12-Dev 2026-05-09 잔존 투사체 fix: + // prefab 부재 시 Scene GameObject를 prefab으로 Instantiate하면 원본 Scene GO가 잔존. + // → fallback 영역 매번 새 GameObject 직접 생성 (Instantiate X·자기 자신 발사체). + GameObject go = prefab != null + ? Object.Instantiate(prefab, (Vector3)spawnPos, Quaternion.identity) + : CreateFallbackProjectile(data, (Vector3)spawnPos); Projectile proj; if (data.Trajectory == ProjectileTrajectory.Homing) @@ -58,19 +58,25 @@ namespace EerieVillage.Skills.Effectors } /// - /// 투사체 프리팹 로드. - /// Phase 2-C 에서 data.projectilePrefab 필드를 추가하면 해당 경로 우선 사용. - /// 현재는 Resources/Skills/Projectiles/Default 폴백. - /// 폴백 실패 시 Collider2D + SpriteRenderer 부착 빈 오브젝트를 반환한다. - /// PD 지시 2026-05-09 — 시각화: 흰색 원 sprite (Unity 기본 whiteTexture 사용). + /// Resources/Skills/Projectiles/Default prefab 로드. 부재 시 null. + /// Phase 2-C 에서 data.projectilePrefab 필드를 추가하면 해당 경로 우선 사용 가능. /// - private static GameObject LoadProjectilePrefab(ActiveSkillData data) + private static GameObject LoadProjectilePrefab() { - var prefab = Resources.Load("Skills/Projectiles/Default"); - if (prefab != null) return prefab; + return Resources.Load("Skills/Projectiles/Default"); + } - // 폴백 — Collider + SpriteRenderer (시각 표시·판정 동시) + /// + /// fallback 발사체 GameObject 직접 생성. Instantiate 영역 X — 자기 자신 발사체. + /// BT12-Dev 2026-05-09 — 이전 LoadProjectilePrefab fallback 영역에서 분리. + /// 원본 Scene GameObject 영구 잔존 버그 근본 해결 (PD 보고 — 맵에 투사체 영구 잔존). + /// PD 지시 2026-05-09 시각화 — 16×16 RGBA32 동적 알파 원 Texture2D + 속성별 색상. + /// + private static GameObject CreateFallbackProjectile(ActiveSkillData data, Vector3 spawnPos) + { var go = new GameObject($"Projectile_{data.CardId}"); + go.transform.position = spawnPos; + var col = go.AddComponent(); col.isTrigger = true; col.radius = 0.2f;