using System.Collections.Generic; // 제네릭 컬렉션을 쓰기 위해 불러올거에요 -> System.Collections.Generic을 using UnityEngine; // 유니티 기본 기능을 쓰기 위해 불러올거에요 -> UnityEngine를 public class MonsterWeapon : MonoBehaviour // 클래스를 선언할거에요 -> MonoBehaviour를 상속받는 MonsterWeapon을 { // 코드 블록을 시작할거에요 -> MonsterWeapon 범위를 [Header("무기 설정")] // 인스펙터에 제목을 표시할거에요 -> 무기 설정을 [Tooltip("이 무기 고유의 공격력 (예: 10)")] // 인스펙터에 툴팁을 달거에요 -> weaponBaseDamage 설명을 [SerializeField] private float weaponBaseDamage = 10f; // 변수를 선언할거에요 -> 무기 기본 공격력을 10으로 private float _finalDamage; // 변수를 선언할거에요 -> 최종 데미지를 저장할 _finalDamage를 [SerializeField] private BoxCollider _weaponCollider; // 변수를 선언할거에요 -> 무기 콜라이더를 저장할 _weaponCollider를 private void Awake() // 함수를 선언할거에요 -> 시작 시 1번 실행되는 Awake를 { // 코드 블록을 시작할거에요 -> Awake 범위를 _weaponCollider = GetComponent(); // 컴포넌트를 가져올거에요 -> 내 오브젝트의 BoxCollider를 찾아 _weaponCollider에 _finalDamage = weaponBaseDamage; // 값을 넣을거에요 -> 최종 데미지를 기본 데미지로 초기화 //DisableHitBox(); // 주석 처리할거에요 -> 시작 시 판정을 끄는 코드(현재는 안 씀) EnableHitBox(); // 함수를 실행할거에요 -> 시작하자마자 판정을 켜기(현재 설정) } // 코드 블록을 끝낼거에요 -> Awake를 public void SetDamage(float monsterStrength) // 함수를 선언할거에요 -> 몬스터 스탯을 받아 최종 데미지를 세팅하는 SetDamage를 { // 코드 블록을 시작할거에요 -> SetDamage 범위를 _finalDamage = weaponBaseDamage + monsterStrength; // 값을 계산할거에요 -> 기본 데미지 + 몬스터 힘으로 최종 데미지 설정 Debug.Log($"✅ [무기] 데미지 설정됨: 총 {_finalDamage}"); // 로그를 찍을거에요 -> 최종 데미지가 얼마인지 } // 코드 블록을 끝낼거에요 -> SetDamage를 public void EnableHitBox() // 함수를 선언할거에요 -> 공격 판정을 켜는 EnableHitBox를 { // 코드 블록을 시작할거에요 -> EnableHitBox 범위를 Debug.Log("enabletest"); // 로그를 찍을거에요 -> 함수가 호출됐는지 확인용 if (_weaponCollider != null) // 조건을 검사할거에요 -> 콜라이더가 정상적으로 잡혔는지 { // 코드 블록을 시작할거에요 -> 콜라이더가 있을 때 처리 Debug.Log("setcollider"); // 로그를 찍을거에요 -> 콜라이더 enable 직전 확인용 _weaponCollider.enabled = true; // 값을 바꿀거에요 -> 트리거 판정을 켜기 Debug.Log("🔴 [무기] 공격 판정 ON! (휘두르기 시작)"); // 로그를 찍을거에요 -> 판정이 켜졌음을 } // 코드 블록을 끝낼거에요 -> 콜라이더 처리 } // 코드 블록을 끝낼거에요 -> EnableHitBox를 public void DisableHitBox() // 함수를 선언할거에요 -> 공격 판정을 끄는 DisableHitBox를 { // 코드 블록을 시작할거에요 -> DisableHitBox 범위를 if (_weaponCollider != null) // 조건을 검사할거에요 -> 콜라이더가 있는지 { // 코드 블록을 시작할거에요 -> 콜라이더가 있을 때 처리 _weaponCollider.enabled = false; // 값을 바꿀거에요 -> 트리거 판정을 끄기 Debug.Log("⚪ [무기] 공격 판정 OFF (휘두르기 끝)"); // 로그를 찍을거에요 -> 판정이 꺼졌음을 } // 코드 블록을 끝낼거에요 -> 콜라이더 처리 } // 코드 블록을 끝낼거에요 -> DisableHitBox를 // ⭐ 여기가 핵심! 닿는 모든 것을 기록함 // 설명을 적을거에요 -> 트리거 충돌 감지 핵심 구간임을 private void OnTriggerEnter(Collider other) // 함수를 선언할거에요 -> 트리거에 다른 콜라이더가 들어오면 호출되는 OnTriggerEnter를 { // 코드 블록을 시작할거에요 -> OnTriggerEnter 범위를 // 1. 무엇이든 닿으면 일단 로그를 찍음 (범인 색출) // 설명을 적을거에요 -> 뭐랑 부딪히는지 디버깅용 Debug.Log($"💥 [충돌 감지] 무기가 닿은 것: {other.name} / 태그: {other.tag}"); // 로그를 찍을거에요 -> 충돌한 오브젝트 이름/태그를 if (other.CompareTag("Player")) // 조건을 검사할거에요 -> 닿은 대상이 Player 태그인지 { // 코드 블록을 시작할거에요 -> 플레이어일 때 처리 PlayerHealth playerHealth = other.GetComponent(); // 컴포넌트를 가져올거에요 -> 플레이어의 PlayerHealth를 찾아 playerHealth에 if (playerHealth != null) // 조건을 검사할거에요 -> PlayerHealth가 실제로 붙어있는지 { // 코드 블록을 시작할거에요 -> PlayerHealth가 있을 때 처리 if (!playerHealth.isInvincible) // 조건을 검사할거에요 -> 플레이어가 무적인지 아닌지 { // 코드 블록을 시작할거에요 -> 무적이 아닐 때 처리 playerHealth.TakeDamage(_finalDamage); // 함수를 실행할거에요 -> 플레이어에게 최종 데미지 적용 Debug.Log($"⚔️ [적중] 플레이어 체력 깎임! (-{_finalDamage})"); // 로그를 찍을거에요 -> 데미지가 들어갔음을 } // 코드 블록을 끝낼거에요 -> 무적 아닐 때 처리 else // 조건이 아니면 실행할거에요 -> 무적이면 { // 코드 블록을 시작할거에요 -> 무적일 때 처리 Debug.Log("🛡️ [방어] 플레이어가 무적 상태입니다."); // 로그를 찍을거에요 -> 무적이라 데미지 안 들어감을 } // 코드 블록을 끝낼거에요 -> 무적 처리 DisableHitBox(); // 함수를 실행할거에요 -> 한 번 맞추면 바로 판정 끄기(중복 타격 방지) } // 코드 블록을 끝낼거에요 -> PlayerHealth 있을 때 처리 else // 조건이 아니면 실행할거에요 -> PlayerHealth가 없으면 { // 코드 블록을 시작할거에요 -> 오류 처리 Debug.LogError("⚠️ [오류] 플레이어 태그는 있는데 'PlayerHealth' 스크립트가 없습니다!"); // 에러 로그를 찍을거에요 -> 컴포넌트 누락 경고 } // 코드 블록을 끝낼거에요 -> 오류 처리 } // 코드 블록을 끝낼거에요 -> 플레이어 처리 } // 코드 블록을 끝낼거에요 -> OnTriggerEnter를 } // 코드 블록을 끝낼거에요 -> MonsterWeapon을