반응형
화면에 보이는 강화 버튼을 클릭하여 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 추가
반응형
'유니티 > 게임 제작' 카테고리의 다른 글
[디펜스 게임 제작] 일시정지 (0) | 2025.06.24 |
---|---|
[디펜스 게임 제작] 골드추가 (0) | 2025.06.23 |
[디펜스 게임 제작] 플레이어, 몬스터 게임 실행 매니저 추가 (1) | 2025.06.19 |
[디펜스 게임 제작] 캐릭터 제작 (0) | 2025.06.19 |
[디펜스 게임 제작] 공격 처리 (0) | 2025.06.18 |