Unity/Unity Study

[Unity] 3D Surviver 팀 프로젝트 중, 스탯 부분 리팩토링

JEE_YA 2025. 3. 18. 11:45

 

처음에는 플레이어 전용 스탯 관리를 위해 PlayerCondition을 만들고, 여러 스탯 계산을 편리하게 하기 위해 Condition 클래스를 추가하여 메서드를 만들어 사용했었으...나 

이런 방식은 코드가 지저분하고 PlayerController에서 스태미나 감소 등을 처리하는 과정도 있고 여러곳에서 이상하게 사용되는 느낌이 들어, 결국 Condition 클래스를 제거하고 모든 스탯 관리 기능을 PlayerCondition에 통합하기로 결정했다.

 

Condition에는 Add(추가), Subtract(감소) 등의 함수가 있었으며 이것을 PlayerCondition에서 간단하게 사용했지만 단순한 추가, 감소정도는 코드가 길지 않기에 변경해주었다.

public class Condition : MonoBehaviour
{
    public float curValue;
    public float maxValue;
    
    public void Add(float Value)
    {
        curValue = Mathf.Min(curValue + Value, maxValue);
    }
}

Add의 경우 최대값을 넘지않는 선에서 추가하는 식으로 되어있었으며

public class PlayerCondition : MonoBehaviour
{
    public Condition _health;
    public Condition _hunger;
    public Condition _stamina;
	
    public void Heal(float amout)
    {
        _health.Add(amout);
    }
}

Heal을 호출할경우 health의 값이 최대값을 넘지않는 선에서 회복(추가)되게, 이런식으로 간단하게 사용하고 있었다.

 

일단 Condition을 없애줄거기 때문에 스탯 값들을 전부 float 형식으로 바꿔주었으며 현재값, 시작값, 최대값도 모두 필요하여 따로 만들어주었다.

public class PlayerCondition : StatManager
{
    public float curHealth;
    public float maxHealth;
    public float startHealth;
    
    public void Awake()
    {
        curHealth = health;
        maxHealth = health;
        startHealth = health;
    }
    
    public void Heal(float amount)
    {
        curHealth = Mathf.Min(curHealth + amount, maxHealth);
    }
}

health의 경우 위와같이 나뉘게 되며 hunger, stamina도 cur(현재), max(최대), start(시작)값들을 각각 선언해주었고

Heal의 경우 단순한 회복(추가)이기 때문에 Add에 쓰이던 코드를 넣어주었다.

아직까지는 복잡한 계산이 없기때문에 Add, Subtract가 없어도 크게 불편한점은 없었다.

 

그런데....

 

진짜 더러운 스탯창

일단 Inspector 창이 너무 더럽다.. 이게 정리를 하게 된 계기이다.

Health, Hunger, Stamina에선 초기값을, Cur Health, Cur Hunger, Cur Stamina에선 현재값 확인이 가능하다.

상속받은 스탯(Health 등)들은 초기값만 보이도록 설정되며, 실제로 현재값은 Cur Health등의 변수에서만 확인이 가능하여 현재값을 확인하려면 어쩔수없이 숨김처리를 할수없었다.

 

해결방법은 StatManager에서 초기값을 관리하고, PlayerCondition에서 현재값을 관리하며 두 값을 동기화하는 방식으로 가야하는데 지금의 나로썬 많이 복잡해보여서 그냥 현재값 빼고 다른값들을 숨겨주는걸로 정리하기로 했다...

public class PlayerCondition : StatManager
{
    public float curHealth;
    [HideInInspector] public float maxHealth;
    [HideInInspector] public float startHealth;

    public float curHunger;
    [HideInInspector] public float maxHunger;
    [HideInInspector] public float startHunger;

    public float curStamina;
    [HideInInspector] public float maxStamina;
    [HideInInspector] public float startStamina;
    public float passiveStamina;
}

이렇게 숨겨주고 나면!

변경된 Inspector

그래도 어느정도 깔끔해진다.

초기값을 숨겨볼까 생각도 해봤는데 값을 계속 변경하면서 테스트도 해야하고 현재값을 숨기기엔 아직 UI도 없기 때문에 그냥 저렇게 당분간 진행하려고 한다. 

- Moisture, Temperature도 추후에 구현 예정이나 아직 미구현으로 현재값이 없다.