캐릭터나 오브젝트의 다양한 수치적 속성(생명력, 공격력 등)을 관리하는 Stat과 그 스탯들을 관리하는 Status를 구현한다.
Stat
구현 방법
새로운 스탯 인스턴스를 생성하여 초기값을 생성하는 생성자를 만들고, StatModifier에서 modifier의 값을 받아 스탯의 수정치를 확인하고 수정하는 함수를 구현한다.
구현 기능
Stat(): 새로운 스탯 인스턴스를 생성하고 초기값을 생성하는 생성자.
SetValue(): 값을 받으면 바뀐 값을 대입한다.
AddModifier() /RemoveModifier(): 수정치를 추가하거나 삭제한다.
GetModifyValue(): Value를 해당하는 StatModifierType으로 계산한다.
public class Stat
{
public StatType Type { get; private set; }
public float Min { get; private set; }
public float Max { get; private set; }
public float Value { get; private set; }
public float OriginValue { get; private set; }
private List<StatModifier> _modifiers = new(); // 스탯이 가지고 있는 수정치 목록.
public event Action<Stat> OnChanged;
// 새로운 스탯 인스턴스를 생성하고 초기값을 생성하는 생성자.
public Stat(StatType type, float value = 0, float min = 0, float max = float.MaxValue)
{
this.Type = type;
this.Min = min;
this.Max = max;
SetValue(value);
}
// 값을 받으면 바뀐 값을 대입.
public void SetValue(float value)
{
OriginValue = value;
Value = GetModifyValue();
OnChanged?.Invoke(this);
}
// 수정치를 추가하거나 삭제하는 기능.
public void AddModifier(StatModifier modifier)
{
_modifiers.Add(modifier);
Value = GetModifyValue();
OnChanged?.Invoke(this); // 능력치에 변화가 있다면 호출.
}
public void RemoveModifier(StatModifier modifier)
{
_modifiers.Remove(modifier);
Value = GetModifyValue();
OnChanged?.Invoke(this); // 능력치에 변화가 있다면 호출.
}
// _modifiers 리스트에 들어있는 객체들의 StatModifierType을 비교하여 Value를 해당하는 StatModifierType으로 계산한다.
private float GetModifyValue()
{
float value = OriginValue;
for (int i = 0; i < _modifiers.Count; i++)
{
// Stat 계산 방법.
if (_modifiers[i].Type == StatModifierType.Add) value += _modifiers[i].Value;
else if (_modifiers[i].Type == StatModifierType.Multiple) value *= _modifiers[i].Value;
else if (_modifiers[i].Type == StatModifierType.Override) value = _modifiers[i].Value;
}
value = Mathf.Clamp(value, Min, Max);
return value;
}
}
Status
구현 방법
수정할 스탯 리스트를 받아 알맞은 스탯에 추가하거나 제거하는 기능을 구현한다.
구현 기능
StatType: 스탯 타입들. COUNT는 갯수를 파악하기 위한 상수이다.
StatModifierType: 수정치 계산 종류.
Stat this: 스탯 종류를 받아온다.
Status(): 스탯 종류를 확인 후, 딕셔너리에 추가.
Status(CreatureData data): 기존 데이터를 받아와 스탯에 대입한다.
AddModifiers / RemoveModifiers: 변화될 스탯을 리스트에서 찾아 스탯에 변화를 주는 함수들를 추가하거나 제거한다.
public enum StatType
{
HpMax,
HpRegen,
Damage,
Defense,
MoveSpeed,
AttackSpeed,
//Cost,
//Range,
//Sight,
COUNT // StatType 갯수 파악을 위한 상수.
}
public enum StatModifierType
{
Add,
Multiple,
Override,
}
public class Status
{
private Dictionary<StatType, Stat> _stats;
public Stat this[StatType type]
{
get => _stats[type];
}
// 스탯 타입을 확인하고 딕셔너리에 추가.
public Status()
{
_stats = new();
for (int i = 0; i < (int)StatType.COUNT; i++)
{
_stats.Add((StatType)i, new Stat((StatType)i));
}
}
// 크리처의 기존 데이터를 받아와서 스탯에 대입.
public Status(CreatureData data)
{
_stats = new()
{
[StatType.HpMax] = new(StatType.HpMax, data.HpMax),
[StatType.HpRegen] = new(StatType.HpRegen, data.HpRegen),
[StatType.Damage] = new(StatType.Damage, data.Damage),
[StatType.Defense] = new(StatType.Defense, data.Defense),
[StatType.MoveSpeed] = new(StatType.MoveSpeed, data.MoveSpeed),
[StatType.AttackSpeed] = new(StatType.AttackSpeed, data.AttackSpeed),
};
}
// 변화될 스탯을 리스트에서 찾아 스탯에 변화를 주는 함수를 추가 / 제거.
public void AddModifiers(List<StatModifier> modifiers)
{
for (int i = 0; i < modifiers.Count; i++)
{
this[modifiers[i].Stat].AddModifier(modifiers[i]);
}
}
public void RemoveModifiers(List<StatModifier> modifiers)
{
for (int i = 0; i < modifiers.Count; i++)
{
this[modifiers[i].Stat].RemoveModifier(modifiers[i]);
}
}
}
'부트캠프 > Project' 카테고리의 다른 글
Skill 구상 (0) | 2024.01.23 |
---|---|
Projectile 구현 (0) | 2024.01.19 |
StatModifier 구현 계획 (0) | 2024.01.17 |
Resource Manager 구현 (0) | 2024.01.15 |
<프로젝트> 팀과제 Unity 리듬 게임 회고 (2) | 2024.01.09 |