Projext/Assets/Scripts/Enemy/AI/Monster Weapon.cs
2026-02-13 00:23:25 +09:00

80 lines
6.9 KiB
C#

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>(); // 컴포넌트를 가져올거에요 -> 내 오브젝트의 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를 찾아 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을