using UnityEngine; // 유니티 기본 기능을 쓰기 위해 불러올거에요 -> UnityEngine를 public class BossPatternPhases : MonoBehaviour // 클래스를 선언할거에요 -> 보스 패턴 페이즈 진행을 관리하는 BossPatternPhases를 { // 코드 블록을 시작할거에요 -> BossPatternPhases 범위를 // [Header]는 유니티 Inspector 창에서 폴더처럼 보이게 해줌 // 설명을 적을거에요 -> 인스펙터 그룹 라벨용 [Header("🔧 패턴 설정")] // 인스펙터에 제목을 표시할거에요 -> 패턴 설정을 [SerializeField] private int totalPhases = 3; // 변수를 선언할거에요 -> 전체 페이즈 수를 3으로 [Header("💎 XP 설정")] // 인스펙터에 제목을 표시할거에요 -> XP 설정을 [SerializeField] private int phaseClearXP = 10; // 변수를 선언할거에요 -> 페이즈 성공 시 XP를 10으로 [SerializeField] private int fullClearBonus = 30; // 변수를 선언할거에요 -> 전체 클리어 보너스를 30으로 [SerializeField] private int hitPenalty = -5; // 변수를 선언할거에요 -> 피격 시 감점 XP를 -5로 // [SerializeField]는 인스펙터에서 실시간으로 볼 수 있게 해줌 // 설명을 적을거에요 -> 런타임에도 값 확인 가능 [Header("🚩 상태 확인용")] // 인스펙터에 제목을 표시할거에요 -> 상태 확인용을 [SerializeField] private int currentPhase = 0; // 변수를 선언할거에요 -> 현재 페이즈를 0으로(시작 전) [SerializeField] private bool isPatternActive = false; // 변수를 선언할거에요 -> 패턴 진행 여부를 false로 [SerializeField] private bool wasHitThisPhase = false; // 변수를 선언할거에요 -> 이번 페이즈 피격 여부를 false로 // ★ 초기화 // 설명을 적을거에요 -> 시작 시 초기화 수행 private void Start() // 함수를 선언할거에요 -> 시작 시 1회 실행되는 Start를 { // 코드 블록을 시작할거에요 -> Start 범위를 ResetPattern(); // 함수를 실행할거에요 -> 패턴 상태를 초기화 } // 코드 블록을 끝낼거에요 -> Start를 // ★ 패턴 전체 리셋 (새로운 패턴 시작 시 호출) // 설명을 적을거에요 -> 상태를 처음으로 되돌리는 함수 public void ResetPattern() // 함수를 선언할거에요 -> 패턴 전체 초기화 ResetPattern을 { // 코드 블록을 시작할거에요 -> ResetPattern 범위를 currentPhase = 0; // 값을 설정할거에요 -> 현재 페이즈를 0으로 wasHitThisPhase = false; // 값을 설정할거에요 -> 피격 여부를 false로 isPatternActive = false; // 값을 설정할거에요 -> 패턴 진행 상태를 false로 Debug.Log("[보스] 패턴 초기화 완료!"); // 로그를 찍을거에요 -> 초기화 완료 확인 } // 코드 블록을 끝낼거에요 -> ResetPattern을 // ★ 패턴 시작 (보스 AI에서 호출) // 설명을 적을거에요 -> 보스가 패턴을 시작할 때 호출 public void StartPattern() // 함수를 선언할거에요 -> 패턴 시작 함수 StartPattern을 { // 코드 블록을 시작할거에요 -> StartPattern 범위를 if (currentPhase >= totalPhases) // 조건을 검사할거에요 -> 이미 전부 끝났는지 { // 코드 블록을 시작할거에요 -> 전부 끝난 경우 처리 Debug.Log("이미 모든 패턴을 완료했어요!"); // 로그를 찍을거에요 -> 더 이상 시작 불가 안내 return; // 함수를 끝낼거에요 -> 아래 로직 실행 안 하게 } // 코드 블록을 끝낼거에요 -> 완료 처리 isPatternActive = true; // 값을 설정할거에요 -> 패턴 진행 상태를 true로 wasHitThisPhase = false; // 값을 설정할거에요 -> 이번 페이즈 피격 여부 초기화 Debug.Log($"🔔 [페이즈 {currentPhase + 1}] 시작! 회피하세요!"); // 로그를 찍을거에요 -> 페이즈 시작 알림 // ★ ★ ★ 여기서 보스의 애니메이션/이펙트 시작하면 됨 ★ ★ ★ // 설명을 적을거에요 -> 연출 시작 지점 } // 코드 블록을 끝낼거에요 -> StartPattern을 // ★ 플레이어가 피격당했을 때 호출 (PlayerHealth에서 연결) // 설명을 적을거에요 -> 플레이어 피격 이벤트 연결용 public void OnPlayerHit() // 함수를 선언할거에요 -> 피격 처리 함수 OnPlayerHit을 { // 코드 블록을 시작할거에요 -> OnPlayerHit 범위를 if (!isPatternActive) return; // 조건이 맞으면 종료할거에요 -> 패턴 중이 아니면 무시 wasHitThisPhase = true; // 값을 설정할거에요 -> 이번 페이즈에서 맞았다고 표시 Debug.Log($"💥 [페이즈 {currentPhase + 1}] 중 피격당함! (XP 감점)"); // 로그를 찍을거에요 -> 피격 안내 // 피격 시 감점 처리 (필요하면) // 설명을 적을거에요 -> hitPenalty가 0이 아니면 XP 감소 if (hitPenalty != 0 && ObsessionSystem.instance != null) // 조건을 검사할거에요 -> 감점이 있고 시스템이 존재하는지 { // 코드 블록을 시작할거에요 -> 감점 처리 ObsessionSystem.instance.AddRunXP(hitPenalty); // XP를 더할거에요 -> 음수면 감점됨 } // 코드 블록을 끝낼거에요 -> 감점 처리 } // 코드 블록을 끝낼거에요 -> OnPlayerHit을 // ★ 현재 구간을 성공적으로 통과했을 때 호출 (보스 AI에서 호출) // 설명을 적을거에요 -> 페이즈 종료/판정 처리 public void ClearCurrentPhase() // 함수를 선언할거에요 -> 현재 페이즈 클리어 처리 ClearCurrentPhase를 { // 코드 블록을 시작할거에요 -> ClearCurrentPhase 범위를 if (!isPatternActive) return; // 조건이 맞으면 종료할거에요 -> 패턴 중이 아니면 무시 // 피격당했는지 확인 // 설명을 적을거에요 -> 성공/실패 판정 기준 if (wasHitThisPhase) // 조건을 검사할거에요 -> 이번 페이즈 중 피격 여부 { // 코드 블록을 시작할거에요 -> 실패 처리 Debug.Log($"❌ [페이즈 {currentPhase + 1}] 실패... 다음 구간 진행"); // 로그를 찍을거에요 -> 실패 안내 } // 코드 블록을 끝낼거에요 -> 실패 처리 else // 조건이 아니면 실행할거에요 -> 안 맞았으면 { // 코드 블록을 시작할거에요 -> 성공 처리 // ★ 성공 시 XP 지급 // 설명을 적을거에요 -> 시스템이 있으면 XP 지급 if (ObsessionSystem.instance != null) // 조건을 검사할거에요 -> XP 시스템이 존재하는지 { // 코드 블록을 시작할거에요 -> XP 지급 ObsessionSystem.instance.AddRunXP(phaseClearXP); // XP를 더할거에요 -> phaseClearXP만큼 Debug.Log($"✅ [페이즈 {currentPhase + 1}] 성공! +{phaseClearXP}XP"); // 로그를 찍을거에요 -> 성공 안내 } // 코드 블록을 끝낼거에요 -> XP 지급 } // 코드 블록을 끝낼거에요 -> 성공/실패 분기 // 다음 구간으로 // 설명을 적을거에요 -> 페이즈 진행 업데이트 currentPhase++; // 값을 증가시킬거에요 -> 다음 페이즈로 이동 wasHitThisPhase = false; // 값을 초기화할거에요 -> 다음 페이즈를 위해 피격 여부 리셋 // 모든 구간을 완료했는가? // 설명을 적을거에요 -> 전체 클리어 체크 if (currentPhase >= totalPhases) // 조건을 검사할거에요 -> 마지막 페이즈까지 끝났는지 { // 코드 블록을 시작할거에요 -> 전체 클리어 처리 Debug.Log("🎉 모든 패턴 완료!"); // 로그를 찍을거에요 -> 전체 완료 안내 FullClearBonus(); // 함수를 실행할거에요 -> 보너스 XP 지급 isPatternActive = false; // 값을 설정할거에요 -> 패턴 종료 상태로 } // 코드 블록을 끝낼거에요 -> 전체 클리어 처리 } // 코드 블록을 끝낼거에요 -> ClearCurrentPhase를 // ★ 모든 구간 통과 시 보너스 // 설명을 적을거에요 -> 전체 클리어 보너스 지급 private void FullClearBonus() // 함수를 선언할거에요 -> 전체 클리어 보너스 FullClearBonus를 { // 코드 블록을 시작할거에요 -> FullClearBonus 범위를 if (ObsessionSystem.instance != null) // 조건을 검사할거에요 -> XP 시스템이 존재하는지 { // 코드 블록을 시작할거에요 -> 보너스 지급 ObsessionSystem.instance.AddRunXP(fullClearBonus); // XP를 더할거에요 -> 보너스 XP 지급 Debug.Log($"🌟 전체 패턴 클리어 보너스 +{fullClearBonus}XP!"); // 로그를 찍을거에요 -> 보너스 안내 } // 코드 블록을 끝낼거에요 -> 보너스 지급 } // 코드 블록을 끝낼거에요 -> FullClearBonus를 // ★ 디버그용: 현재 상태를 콘솔에 출력 // 설명을 적을거에요 -> 테스트용 단축키 출력 private void Update() // 함수를 선언할거에요 -> 매 프레임 호출되는 Update를 { // 코드 블록을 시작할거에요 -> Update 범위를 if (Input.GetKeyDown(KeyCode.P)) // 조건을 검사할거에요 -> P 키를 눌렀는지 { // 코드 블록을 시작할거에요 -> 디버그 출력 Debug.Log($"[패턴 상태] 현재 구간: {currentPhase + 1}/{totalPhases}, 활성: {isPatternActive}"); // 로그를 찍을거에요 -> 현재 상태를 } // 코드 블록을 끝낼거에요 -> 디버그 출력 } // 코드 블록을 끝낼거에요 -> Update를 // BossPatternPhases.cs에 추가 // 설명을 적을거에요 -> 외부에서 패턴 진행 여부 확인용 public bool IsPatternActive() // 함수를 선언할거에요 -> 패턴 활성 여부 반환 함수 IsPatternActive를 { // 코드 블록을 시작할거에요 -> IsPatternActive 범위를 return isPatternActive; // 값을 돌려줄거에요 -> 현재 활성 상태를 } // 코드 블록을 끝낼거에요 -> IsPatternActive를 } // 코드 블록을 끝낼거에요 -> BossPatternPhases를