Projext/Assets/Scripts/Obsession/BossPatternPhases.cs

125 lines
10 KiB
C#
Raw Normal View History

2026-02-12 15:23:25 +00:00
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를