Projext/Assets/Scripts/Combat/WePonHitBox.cs
2026-02-13 00:23:25 +09:00

43 lines
3.7 KiB
C#

using UnityEngine; // 유니티 기본 기능을 쓰기 위해 불러올거에요 -> UnityEngine를
using System.Collections.Generic; // List를 쓰기 위해 불러올거에요 -> System.Collections.Generic을
public class WeaponHitBox : MonoBehaviour // 클래스를 선언할거에요 -> 무기 히트박스(트리거)로 타격을 처리하는 WeaponHitBox를
{ // 코드 블록을 시작할거에요 -> WeaponHitBox 범위를
private float _damage; // 변수를 선언할거에요 -> 이번 공격에서 적용할 데미지를 _damage에
private bool _isActive = false; // 변수를 선언할거에요 -> 히트박스 활성 여부를 _isActive에(기본 false)
private List<IDamageable> _hitTargets = new List<IDamageable>(); // 리스트를 만들거에요 -> 이미 때린 대상 저장용 _hitTargets를
public void EnableHitBox(float damage) // 함수를 선언할거에요 -> 히트박스를 켜고 데미지를 세팅하는 EnableHitBox를
{ // 코드 블록을 시작할거에요 -> EnableHitBox 범위를
_damage = damage; // 값을 넣을거에요 -> 받은 damage를 _damage로 설정
_isActive = true; // 상태를 바꿀거에요 -> 히트박스를 활성 상태(true)로
_hitTargets.Clear(); // 리스트를 비울거에요 -> 이전 공격에서 맞춘 기록을 초기화
gameObject.SetActive(true); // 오브젝트를 켤거에요 -> 히트박스 트리거 오브젝트 활성화
} // 코드 블록을 끝낼거에요 -> EnableHitBox를
public void DisableHitBox() // 함수를 선언할거에요 -> 히트박스를 끄는 DisableHitBox를
{ // 코드 블록을 시작할거에요 -> DisableHitBox 범위를
_isActive = false; // 상태를 바꿀거에요 -> 히트박스를 비활성(false)로
gameObject.SetActive(false); // 오브젝트를 끌거에요 -> 히트박스 트리거 오브젝트 비활성화
} // 코드 블록을 끝낼거에요 -> DisableHitBox를
private void OnTriggerEnter(Collider other) // 함수를 선언할거에요 -> 트리거에 뭔가 들어오면 호출되는 OnTriggerEnter를
{ // 코드 블록을 시작할거에요 -> OnTriggerEnter 범위를
if (!_isActive || other.CompareTag("Player")) return; // 조건이 맞으면 종료할거에요 -> 비활성이거나 플레이어면 무시
// ⭐ [핵심] 몬스터의 감지 영역(Trigger)은 무시하고 '진짜 몸통'만 타격! // 설명을 적을거에요 -> 트리거 콜라이더는 공격 대상으로 안 잡겠다는 뜻
if (other.isTrigger) return; // 조건이 맞으면 종료할거에요 -> 상대 콜라이더가 트리거면 무시
if (other.TryGetComponent<IDamageable>(out var target)) // 조건을 검사할거에요 -> IDamageable을 가진 대상인지
{ // 코드 블록을 시작할거에요 -> 데미지 처리
if (!_hitTargets.Contains(target)) // 조건을 검사할거에요 -> 이번 공격에서 아직 안 때린 대상인지
{ // 코드 블록을 시작할거에요 -> 1회 타격 처리
target.TakeDamage(_damage); // 함수를 실행할거에요 -> 대상에게 _damage만큼 데미지 주기
_hitTargets.Add(target); // 리스트에 추가할거에요 -> 중복 타격 방지를 위해 대상 기록
Debug.Log($"<color=green>[Hit]</color> {other.name}의 몸통을 정확히 타격!"); // 로그를 찍을거에요 -> 타격 확인
} // 코드 블록을 끝낼거에요 -> 1회 타격 처리
} // 코드 블록을 끝낼거에요 -> 데미지 처리
} // 코드 블록을 끝낼거에요 -> OnTriggerEnter를
} // 코드 블록을 끝낼거에요 -> WeaponHitBox를