내일배움캠프 47일차 TIL <Unity 2D 클리커 게임 만들기 - 2> 06/16

정광훈(Unity_9기)·2025년 6월 16일

TIL (Today I Learned)

목록 보기
57/110
post-thumbnail

<오늘 생긴 문제>

무기 구매만 하고 장착을 안 해야 그 무기의 스탯이 적용되고 있음.
장착하는 순간 나무검 스탯이 적용됨.

이 문제를 팀원분들과 함께 해결하려고 함.

웨폰데이터 스크립트에서 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가 업데이트 되는 이벤트다.

예를들어, 내가 돌검을 장착해 그 이벤트가 시작되면 가만히 있던 다른 무기 오브젝트들에 있는
똑같은 스크립트에서 똑같은 이벤트가 자동 실행된다고 한다.
하이어라키 창 기준으로 위에서부터 아래로 그 이벤트가 발생하는 스크립트가 있는 오브젝트부터 발동한다.
그래서 소유 중인 모든 무기가 디버그 로그로 계속 찍혔던 것이다.
그래서 마지막 오브젝트인 나무검에서 이 이벤트가 발동해 무기 정보 표시하려고 하면서 무기 스탯 계산에 영향을 주던 것.

이건 몰랐던 사실이다.

0개의 댓글