[TIL] Unity - Condition

MINO·2024년 7월 30일
post-thumbnail

2024-07-30


구현 목적

플레이어와 몬스터, NPC 는 각각의 공격력과 방어력, 이동 속도 등의 능력치를 가진다.

공통되는 능력치가 있기도 하고,
최소, 최대치가 정해져 있는 능력치에 가감 연산 등을 공통적으로 사용하기 위해
구현하였다.


참고 레퍼런스

공격 데미지를 담당할 STR,
피해 데미지를 담당할 DEF,
체력을 담당할 HP, (MP 의 경우, 바바리안 특성 상 HP 를 소모하기로 결정)
치명타 확률을 담당할 LUK

등을 구상할 수 있었다.


스크립트

HP, STR, DEF 등의 능력치 하나하나를 나타내는 클래스인 Condition 과
능력치들이 모여 한 객체의 상태를 만드는 BaseStat 클래스가 존재한다.


Condition.cs

public class Condition
{
    public float curValue;
    public float maxValue;


    public Condition(float value)
    {
        this.maxValue = value;
        this.curValue = maxValue;
    }

    public void SetCurValueToZero()
    {
        this.curValue = 0;
    }


    public int AddCurValue(float amount)
    {
        if (curValue != maxValue)
        {
            curValue = Mathf.Min(curValue + amount, maxValue);
            return 1;
        }
        else
        {
            return 0;
        }
    }

    public void SubtractCurValue(float amount)
    {
        curValue = Mathf.Max(curValue - amount, 0.0f);
    }
    public void AddMaxValue(float amount)
    {
        maxValue += amount;
    }

    public void SubtractMaxValue(float amount)
    {
        maxValue = Mathf.Max(maxValue - amount, 0.0f);
    }

    public void AddMaxCurValue(float amount)
    {
        maxValue += amount;
        curValue = Mathf.Min(curValue + amount, maxValue);
    }

    public void SubtractMaxCurValue(float amount)
    {
        maxValue = Mathf.Max(maxValue - amount, 0.0f);
        curValue = Mathf.Max(curValue - amount, 0.0f);
    }


    public float GetPercentage()
    {
        return curValue / maxValue;
    }

    public void BuffCurValue(float amount)
    {
        curValue += amount;
    }

}

IDamagable.cs

데미지와 DEF 를 감안해 피해량을 계산하기 위한 인터페이스

public interface IDamagable
{
    //피격 이벤트 함수
    void TakeDamage(float damageAmount);

    void CalDamage(BaseStat stat); // 방어력을 감안하여 데미지를 계산하는 메서드

    bool isDebuffed { get; set; } // 디버프에 대한 효과를 한 번만 적용시키기 위한 bool 변수
    bool isFrozenState { get; set; } // 빙결 상태에 대한 true false

}

BaseStat.cs

플레이어, NPC , 몬스터 Stat 의 부모 클래스가 되는 BaseStat

using UnityEngine;

public class BaseStat : MonoBehaviour, IDamagable
{
    public Condition HP;
    public Condition STR;

    public Condition runSpeed;
    public Condition attackRate;

    public virtual void CalDamage(BaseStat stat)
    {
        TakeDamage(stat.GetAtk());
    }

    public virtual float GetAtk()
    {
        float damageRange = Random.Range(-0.3f, 0.3f);
        double randomValue = Random.Range(0f, 100f);

        if (randomValue < 20f)
        {
            //20% 확률로 크리티컬 데미지(150%) 반환
            return STR.curValue * (1 + damageRange) * 1.5f;
        }
        else
        {
            return STR.curValue * (1 + damageRange);
        }
    }

    public virtual void TakeDamage(float damageAmount)
    {

    }

    
}

TIL 마무리

팀원이 짠 코드를 함께 뜯어보고 수정하다 보니
코드를 분석하는 능력이 좋아지는 것 같기도 하다.

복잡한 코드의 경우 코드의 의도와 패턴을 주석과 함께 달아주긴 하지만,
현업에 가게 되면 친절한 주석은 없을 수도 없으니
팀원이 작성한 여러 코드를 많이 뜯어보는 것도 도움이 되는 것 같다.

profile
안녕하세요 게임 개발하는 MINO 입니다.

0개의 댓글