Print Friendly and PDF

유니티/게임 제작

[디펜스 게임 제작] 강화 시스템

나는야 개발자 2025. 6. 23. 07:35
반응형

화면에 보이는 강화 버튼을 클릭하여 Status를 강화 시키는 시스템을 제작할 것입니다.

 

방법

- 1번 클릭당 1레벨업으로 하여 Manager클래스에 status레벨 저장

- 저장한 레벨을 최대 status값을 이용해 레벨당 얼마의 값을 넘겨줄 예정

- 넘겨준 값을 이용해 현재 유저의 Status값에 추가

 

UI_Btn_Status_Upgrade 클래스 제작

using System;
using TMPro;
using UnityEngine;

public class UI_Btn_Status_Upgrade : MonoBehaviour
{
    [SerializeField] ESTATUSUPGRADE _estatusupgradekind;

    [SerializeField] TextMeshProUGUI _level;

    [SerializeField] TextMeshProUGUI _statusvalue;

    public static event Action<ESTATUSUPGRADE> _statusupgrade_event;
    void Start()
    {
        LevelAndValueSetting();
    }

    public void Btn_StatusUpgrade()
    {
        _statusupgrade_event?.Invoke(_estatusupgradekind);
        LevelAndValueSetting();
    }

    void LevelAndValueSetting()
    {
        var statusresult = StatusUpgradeManager.instance.GetStatusUpgrade(_estatusupgradekind);
        _statusvalue.text = _estatusupgradekind + ": " + statusresult.values;
        _level.text = "Lv. " + statusresult.level.ToString();
    }


}

- 버튼을 클릭하면 이벤트에 있는 기능이 발동되도록 추가

- 현재 레벨과 값을 StatusUpgradeManager에서 가져오도록 추가 

 

 

StatusUpgradeManager 클래스 추가

using System.Collections.Generic;
using UnityEngine;

public class StatusUpgradeManager : MonoBehaviour
{
    public static StatusUpgradeManager instance;

    Dictionary<ESTATUSUPGRADE, int> _statusupgrade = new Dictionary<ESTATUSUPGRADE, int>();

    [SerializeField]
    List<float> _maxlevelvalue = new List<float>()
    {
        0,
        1000,//공격력 퍼센트
        1,   //크리티컬 퍼센트
        1,   //크리티컬 데미지 퍼센트
        1000,//보호 오브젝트 최대 HP 퍼센트
        100  //보호 오브젝트 최대 방어력(상수)
    };


    const int MAXCOINVALUE = 100000;//최대 강화 총 비용
    const int MAXLEVEL = 100;       //최대 레벨 

    void Awake()
    {
        instance = this;
    }

    void Start()
    {
        UI_Btn_Status_Upgrade._statusupgrade_event += StatusUpgrade;
    }

    public (int level, float values) GetStatusUpgrade(ESTATUSUPGRADE estatusupgrade)
    {
        if (_statusupgrade.ContainsKey(estatusupgrade) == false)
        {
            _statusupgrade.Add(estatusupgrade, 0);
        }
        var curlevel = _statusupgrade[estatusupgrade];

        if (curlevel <= 0)
        {
            return (0, 0);
        }

        //최대와 현재 레벨과 최대 상승값을 이용해 일정한 값이 오르도록 수식작성
        float percentPerLevel = _maxlevelvalue[(int)estatusupgrade] / (MAXLEVEL - 1);
        return (curlevel, percentPerLevel * (curlevel - 1));
    }

    void StatusUpgrade(ESTATUSUPGRADE estatusupgrade)
    {
        if (_statusupgrade.ContainsKey(estatusupgrade) == false)
        {
            _statusupgrade.Add(estatusupgrade, 0);
        }

        var nextlevel = _statusupgrade[estatusupgrade] + 1;
        if (UpgradeCointSetting(nextlevel) == false)
        {
            //TODO: 돈 없다는 팝업 띄우기
            return;
        }
        _statusupgrade[estatusupgrade]++;
    }

    //TODO: 추후 데이터 테이블을 이용해서 비용 할 수 있도록 개선 필요
    bool UpgradeCointSetting(int nextlevel)
    {
        var nextlevelcoinvalue = MAXCOINVALUE / MAXLEVEL;
        var currentupgradecoinvalue = nextlevelcoinvalue * nextlevel;

        //TODO: 유저 돈 가져와서 처리할 것 
        var usercoin = 0;
        if (currentupgradecoinvalue > usercoin)
        {
            return false;
        }

        usercoin -= currentupgradecoinvalue;
        return true;
    }
}

public enum ESTATUSUPGRADE
{
    NONE,
    ATTACKPER,
    CIRITICALPER,
    CIRITICALDAMAGE,
    PROTECTMAXHPPER,
    PROTECTARMOR
}

- 최대 레벨을 지정하여 수치가 비례하여 상승하도록 간단하게 구현

- 싱글톤을 이용해 레벨값을 알 수 있도록 구현

- StatuUpgade, UpgradeCointSetting함수를 이용해 비용 계산하여 업그레이드 할지 지정(추후 데이터로 할 수 있도록 해볼 예정)

 

결과


1차 7:00~7:30 : StatusUpgradeManager/UI_Btn_Status_Upgrade(추가)

2차 21:30~22:40 : StatusUpgradeManager/UI_Btn_Status_Upgrade(수정), UI 추가

반응형