using UnityEngine; // ============================================================================ // WeaponPickup // ---------------------------------------------------------------------------- // 월드에 떨어진 무기. 플레이어가 트리거 영역에 들어오면 자동으로 인벤토리에 추가되고 사라짐. // // 두 가지 사용 패턴: // 1) 씬에 미리 배치 → Inspector에서 _weapon 할당 → 자동 표시 // 2) 코드로 동적 스폰 → Initialize(WeaponData)로 무기 주입 (Enemy.HandleDeath) // ============================================================================ [RequireComponent(typeof(Collider2D))] [RequireComponent(typeof(SpriteRenderer))] public class WeaponPickup : MonoBehaviour { [SerializeField] private WeaponData _weapon; private SpriteRenderer _spriteRenderer; private void Awake() { _spriteRenderer = GetComponent(); // 픽업은 물리 충돌 아닌 트리거. 플레이어가 통과하면서 줍게. Collider2D col = GetComponent(); col.isTrigger = true; ApplyVisual(); } // 코드로 동적 스폰 시 호출. Enemy.HandleDeath에서 사용. public void Initialize(WeaponData weapon) { _weapon = weapon; ApplyVisual(); } private void ApplyVisual() { if (_spriteRenderer == null || _weapon == null) return; if (_weapon.PickupSprite != null) _spriteRenderer.sprite = _weapon.PickupSprite; } // 플레이어가 트리거 영역에 진입 시 발화. // 인벤토리는 영속 싱글톤(PlayerWeaponInventory.Instance)이므로 Player 본인이 들어왔는지만 확인. // 이미 보유 중이면 Pickup이 false 반환 → pickup 오브젝트 그대로 유지. private void OnTriggerEnter2D(Collider2D other) { if (_weapon == null) return; // 플레이어 본인만 픽업 (적/투사체 등이 트리거 들어와도 무시). if (other.GetComponentInParent() == null) return; PlayerWeaponInventory inventory = PlayerWeaponInventory.Instance; if (inventory == null) return; if (inventory.Pickup(_weapon)) Destroy(gameObject); } }