135 lines
3.7 KiB
C#
135 lines
3.7 KiB
C#
using System;
|
|
using System.Collections;
|
|
using System.Collections.Generic;
|
|
using UnityEngine;
|
|
|
|
public class DungeonLogic : MonoBehaviour
|
|
{
|
|
[SerializeField] private DungeonPanelController _dungeonPanelController;
|
|
|
|
[NonSerialized] public bool isCompleted = false; // 던전 클리어 여부
|
|
[NonSerialized] public bool isFailed = false; // 던전 실패 여부
|
|
|
|
private PlayerController _player;
|
|
private EnemyController _enemy;
|
|
|
|
// 던전 결과 이벤트
|
|
public event Action OnDungeonSuccess;
|
|
public event Action OnDungeonFailure;
|
|
|
|
private void Start()
|
|
{
|
|
// tag를 통해 할당 / 추후 플레이어와 에너미 태그 추가 필요
|
|
_player = GameObject.FindGameObjectWithTag("Player").GetComponent<PlayerController>();
|
|
_enemy = GameObject.FindGameObjectWithTag("Enemy").GetComponent<EnemyController>();
|
|
|
|
// 죽음 이벤트 구독
|
|
if (_player != null)
|
|
{
|
|
_player.OnGetHit += OnPlayerGetHit;
|
|
_player.OnDeath += OnPlayerDeath;
|
|
}
|
|
|
|
if (_enemy != null)
|
|
{
|
|
_enemy.OnGetHit += OnEnemyGetHit;
|
|
_enemy.OnDeath += OnEnemyDeath;
|
|
}
|
|
}
|
|
|
|
private void OnPlayerGetHit(CharacterBase player)
|
|
{
|
|
if (isFailed || isCompleted) return; // 어느 한 쪽 사망시 더이상 피격 X
|
|
|
|
// TODO: 플레이어 피격 효과음
|
|
|
|
var result = _dungeonPanelController.SetPlayerHealth();
|
|
if (!result) // 하트 모두 소모
|
|
{
|
|
player.Die();
|
|
}
|
|
}
|
|
|
|
private void OnEnemyGetHit(CharacterBase enemy)
|
|
{
|
|
if (isFailed || isCompleted) return;
|
|
|
|
// TODO: 에너미 피격 효과음
|
|
|
|
_dungeonPanelController.SetBossHealthBar(enemy.currentHP);
|
|
}
|
|
|
|
// 플레이어 사망 처리
|
|
private void OnPlayerDeath()
|
|
{
|
|
if (!isFailed) // 중복 실행 방지
|
|
{
|
|
FailDungeon();
|
|
}
|
|
}
|
|
|
|
// 적 사망 처리
|
|
private void OnEnemyDeath()
|
|
{
|
|
if (!isCompleted) // 중복 실행 방지
|
|
{
|
|
CompleteDungeon();
|
|
}
|
|
}
|
|
|
|
// 던전 성공 처리
|
|
public void CompleteDungeon()
|
|
{
|
|
if (!isCompleted && !isFailed)
|
|
{
|
|
Debug.Log("던전 공략 성공~!");
|
|
isCompleted = true;
|
|
OnDungeonSuccess?.Invoke();
|
|
|
|
_dungeonPanelController.SetBossHealthBar(0.0f); // 보스 체력 0 재설정
|
|
|
|
_player.SetState(PlayerState.Win);
|
|
// TODO: 강화 시스템으로 넘어가고 일상 맵으로 이동
|
|
}
|
|
}
|
|
|
|
// 던전 실패 처리
|
|
public void FailDungeon()
|
|
{
|
|
if (!isCompleted && !isFailed)
|
|
{
|
|
Debug.Log("던전 공략 실패~!");
|
|
isFailed = true;
|
|
OnDungeonFailure?.Invoke();
|
|
|
|
_player.SetState(PlayerState.Dead);
|
|
|
|
// enemy가 더이상 Trace 하지 않도록 처리
|
|
_player.gameObject.layer = LayerMask.NameToLayer("Ignore Raycast");
|
|
_enemy.SetState(EnemyState.Idle);
|
|
|
|
StartCoroutine(DelayedSceneChange()); // 3초 대기 후 전환
|
|
}
|
|
}
|
|
|
|
private IEnumerator DelayedSceneChange()
|
|
{
|
|
yield return new WaitForSeconds(3f);
|
|
GameManager.Instance.ChangeToHomeScene();
|
|
}
|
|
|
|
// 게임 오브젝트 제거 시 이벤트 구독 해제
|
|
private void OnDestroy()
|
|
{
|
|
if (_player != null)
|
|
{
|
|
_player.OnDeath -= OnPlayerDeath;
|
|
}
|
|
|
|
if (_enemy != null)
|
|
{
|
|
_enemy.OnDeath -= OnEnemyDeath;
|
|
}
|
|
}
|
|
}
|