
무기 구매만 하고 장착을 안 해야 그 무기의 스탯이 적용되고 있음.
장착하는 순간 나무검 스탯이 적용됨.
이 문제를 팀원분들과 함께 해결하려고 함.
웨폰데이터 스크립트에서 foeach문이 돌아가면서 스탯계산 하는데
hierarchy창에 마지막 무기 오브젝트인 나무검의 무기가 계산되어서
대미지가 항상 나무검으로 나오는 것 같다고 판단.
UI업데이트에 디버그 로그를 보면 모든 무기가 한 번씩 순서대로 출력되는데
나는 왜 그렇게 출력되는지 이해가 안 갔다.
결론은 무기 장착여부와 상관없이 마지막 오브젝트인 나무검이 작동하면서 무기 스탯에 나무검 스탯으로 덮어씌어 버린 것.
<WeaponData.cs>
public int GetDamage(int level) // 무기 SO에서 현재 대미지 값 가져오기
{
int baseWeaponDamage = 0; // 무기 기본 대미지
foreach (WeaponStatEntry weaponStat in weaponStats)
{
if (weaponStat.weaponStatType == WeaponStatType.Damage)
{
// 무기 SO에 저장된 대미지 기본값을 저장
baseWeaponDamage = weaponStat.baseValue;
PlayerData.Instance.BonusAttack = (baseWeaponDamage + damageIncreasePerLevel * level);
break;
}
}
// 무기 레벨업 시 증가하는 대미지 량
// 무기 기본 대미지 + (레벨당 증가하는 대미지 * 무기 레벨)
return baseWeaponDamage + damageIncreasePerLevel * level;
}
public float GetCritChance(int level) // 무기 SO에서 현재 크리티컬 확률 값 가져오기
{
int baseWeaponCritChance = 0; // 무기 기본 크리티컬 확률
foreach (WeaponStatEntry weaponStat in weaponStats)
{
if (weaponStat.weaponStatType == WeaponStatType.CriticalChance)
{
// 무기 SO에 저장된 크리티컬 확률 기본값을 저장
baseWeaponCritChance = weaponStat.baseValue;
PlayerData.Instance.BonusCritChance = (baseWeaponCritChance + critChanceIncreasePerLevel * level);
break;
}
}
// 무기 레벨업 시 증가하는 크리티컬 확률 량
// 무기 기본 크리티컬 확률 + (레벨당 증가하는 크리티컬 확률 * 무기 레벨)
return baseWeaponCritChance + critChanceIncreasePerLevel * level;
처음에 무기를 장착하면 기본 스탯을 가져오면서 무기로 인한 플레이어의 스탯을 더하려고 했었다.
<WeaponData.cs>
public int GetDamage(int level) // 무기 SO에서 현재 대미지 값 가져오기
{
int baseWeaponDamage = 0; // 무기 기본 대미지
foreach (WeaponStatEntry weaponStat in weaponStats)
{
if (weaponStat.weaponStatType == WeaponStatType.Damage)
{
// 무기 SO에 저장된 대미지 기본값을 저장
baseWeaponDamage = weaponStat.baseValue;
break;
}
}
// 무기 레벨업 시 증가하는 대미지 량
// 무기 기본 대미지 + (레벨당 증가하는 대미지 * 무기 레벨)
return baseWeaponDamage + damageIncreasePerLevel * level;
}
public float GetCritChance(int level) // 무기 SO에서 현재 크리티컬 확률 값 가져오기
{
int baseWeaponCritChance = 0; // 무기 기본 크리티컬 확률
foreach (WeaponStatEntry weaponStat in weaponStats)
{
if (weaponStat.weaponStatType == WeaponStatType.CriticalChance)
{
// 무기 SO에 저장된 크리티컬 확률 기본값을 저장
baseWeaponCritChance = weaponStat.baseValue;
break;
}
}
// 무기 레벨업 시 증가하는 크리티컬 확률 량
// 무기 기본 크리티컬 확률 + (레벨당 증가하는 크리티컬 확률 * 무기 레벨)
return baseWeaponCritChance + critChanceIncreasePerLevel * level;
}
<EquipmentManager.cs>
public void EquipWeapon(PlayerWeapon newWeaponToEquip) // 무기 장착
{
// 생각해보면 굳이 해제 시키고 장착 시킬 필요없이 바로 장착 무기에 저장해버리면 됨
EquippedWeapon = newWeaponToEquip; // 매개변수 무기 장착
if (EquippedWeapon != null) // 무기 장착 중이면
{
// 차라리 처음부터(WeaponData에서) 말고 장착한 시점(장착 메서드가 작동했을 때)에서 추가 스탯 계산을 하자
// WeaponData에 있는 무기 기본 스탯을 가져와 보너스 스탯에 저장
PlayerData.Instance.BonusAttack = EquippedWeapon.GetCurrentDamage();
PlayerData.Instance.BonusCritChance = EquippedWeapon.GetCurrentCritChance();
}
// 장착이 완료된 후 OnEquipmentChanged 이벤트를 발생
OnEquipmentChanged?.Invoke();
}
그래서 보너스 스탯 부분을 빼서 무기를 장착한 시점(장착 메서드)에서
계산하는 것이 나을 것 같다고 판단했다.
그렇게 수정하니 아이템을 장착하면 무기 스탯이 정상적으로 작동되었다.
무기 오브젝트가 4개인데 똑같은 스크립트를 넣어놨다.
그 스크립트에 이벤트가 있는데 장착하면 UI가 업데이트 되는 이벤트다.
예를들어, 내가 돌검을 장착해 그 이벤트가 시작되면 가만히 있던 다른 무기 오브젝트들에 있는
똑같은 스크립트에서 똑같은 이벤트가 자동 실행된다고 한다.
하이어라키 창 기준으로 위에서부터 아래로 그 이벤트가 발생하는 스크립트가 있는 오브젝트부터 발동한다.
그래서 소유 중인 모든 무기가 디버그 로그로 계속 찍혔던 것이다.
그래서 마지막 오브젝트인 나무검에서 이 이벤트가 발동해 무기 정보 표시하려고 하면서 무기 스탯 계산에 영향을 주던 것.
이건 몰랐던 사실이다.