✅ 오늘의 목표 !
유닛의 공통된 정보를 추상클래스로 만든 뒤, 각각의 유닛들의 자식 클래스를 생성
각각의 유닛 클래스들에 정보를 저장
유닛들은 공통된 스탯을 가지고 있고 공격과 죽는 것을 다 다른 조건에서 동일하게 처리할 수 있을 거 같아서 추상클래스로 묶어보자는 생각을 했다
UnitStat 부모클래스를 만들고 유닛5개의 스크립트를 개별적으로 작성한 뒤 UnitStat 클래스를 상속받게 했다처음 만들어 보는 게임이라 그런지,,, 스크립트 하나에 자꾸 여러 기능을 다 넣어버리고 있다... 애니메이션도 따로 스크립트를 작성하는 게 더 나을 거 같은데 일단 그냥 스파게티 코드여도 내가 생각하고 시도하는걸로 가보기로 했다

using System.Collections;
using System.Collections.Generic;
using System.Runtime.InteropServices;
using UnityEngine;
using UnityEngine.UI;
// 부모 추상 클래스 UnitStat
// 객체를 만들 수 없음
public abstract class UnitStat : MonoBehaviour
{
[SerializeField] protected int maxHealth; // 최대 체력
[SerializeField] protected int currentHealth; // 현재 체력
protected Slider HPslider; // 체력 슬라이더
protected Animator animator; // 애니메이터 추가
private bool isDying = false; // 죽음 상태 플래그
protected virtual void Start()
{
currentHealth = maxHealth;
animator = GetComponent<Animator>(); // Animator 컴포넌트 가져오기
if (HPslider != null)
{
HPslider.maxValue = maxHealth;
HPslider.value = currentHealth;
}
//Debug.Log($"MonsterStat 초기화: MaxHealth={maxHealth}, CurrentHealth={currentHealth}");
}
public void SetHPBar(Slider slider)
{
//Debug.Log("SetHPBar 호출됨");
HPslider = slider;
if (HPslider != null)
{
HPslider.maxValue = maxHealth;
HPslider.value = currentHealth;
}
else
{
//Debug.LogError("슬라이더가 null입니다!");
}
}
인자로 들어온 값만큼 데미지를 입게 설정해두었다 ( 0 이하로 떨어지진 않게)
-> 인자로 들어오게 될 값은 나중에 MonsterGizmo스크립트쪽에 작성해두었다
-> 각각의 몬스터마다 공격력이 다르기 때문에 그 수치를 각 몬스터 공격력만큼 인자로 받아오게 설정해두었다
현재체력에서 계속 데미지만큼 수치를 까게되면 슬라이더 수치에도 적용되게 하였다
현재 체력이 0과 같거나 작아진다면 죽음 애니메이션 함수를 호출한다
public void TakeDamage(int damage)
{
if (isDying) return; // 죽음 중일 때 추가 데미지 방지
currentHealth -= damage;
currentHealth = Mathf.Clamp(currentHealth, 0, maxHealth);
if (HPslider != null)
{
HPslider.value = currentHealth;
}
if (currentHealth <= 0)
{
PlayDeathAnimation();
}
}
// 죽음 애니메이션 실행
protected virtual void PlayDeathAnimation()
{
if (animator != null)
{
isDying = true;
animator.SetTrigger("Die"); // Die 트리거 설정
StartCoroutine(WaitForDeathAnimation());
}
else
{
Die(); // 애니메이터가 없으면 바로 Die 호출
}
}

protected virtual void Die()
{
MonsterCount.Instance.DecreaseCount(); // 몬스터 카운트 감소 <- 이거 왜 여기있냐..?
Debug.Log($"{gameObject.name} 사망!");
Destroy(gameObject);
HPslider.gameObject.SetActive(false);
}
private IEnumerator WaitForDeathAnimation()
{
yield return new WaitForSeconds(1.5f); // 애니메이션 지속 시간
Die();
}
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
// 상속받은 자식 클래스
public class Unit00010 : UnitStat
{
protected override void Start()
{
maxHealth = 50;
base.Start(); // 부모 클래스의 Start 호출
}
// 애니메이션 이벤트에서 호출
protected override void Die()
{
base.Die(); // 기본 Die 동작 실행
}
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class Unit00020 : UnitStat
{
protected override void Start()
{
maxHealth = 50;
base.Start(); // 부모 클래스의 Start 호출
}
// 애니메이션 이벤트에서 호출
protected override void Die()
{
base.Die(); // 기본 Die 동작 실행
}
유닛이 공격받아서 체력이 까이는 상황을 유니티 인스펙터창에서 확인할 수 있다
나중에 MonsterGizmo 스크립트에서 공격범위에 들어오면 몬스터가 공격액션을 취하고 유닛에게 데미지를 입히는 것까지 할 것이다!
