은행 ATM 시스템을 만들려고 하는데
초기에 TMP로 이렇게 세팅하고 51조가 들어간 계좌를 만들려고 한다.
그리고 게임매니저를 통해서 저 초기 세팅값의 숫자를 바꾸려고 했다.
그래서
using System.Collections;
using System.Collections.Generic;
using System.Data.SqlTypes;
using UnityEngine;
[System.Serializable]
public class UserData
{
public string Name;
public int Balance;
public int Cash;
public UserData(string name, int balance, int cash)
{
Name = name;
Balance = balance;
Cash = cash;
}
public bool Deposit (int money)
{
if (Cash < money)
return false;
Cash -= money;
Balance += money;
return true;
}
public bool Withdraw(int money)
{
if(Balance < money) return false;
Cash+= money;
Balance -= money;
return true;
}
}
이 코드를 이용해서
게임매니저에 유저 데이터를 입력받을 수 있는 창을 만들고
Name과 cash 만 조금 다르게 적었다.
Name은 끝에 ~ 추가
cash는 5만 추가
Balance는 그대로 51조
그런데?
플레이를 해보면 다른것은 다 적용이 되는데
Balance가 2147483647로 자동으로 고정이 되었다.
이게 뭘까 왜그럴까 생각해보다가 저 고정되는 숫자가 뭔가 특이한데? 왜 저 숫자로 고정되지? 아 가장 높은 숫자의 끝이 있나? 생각하다가
갑자기 떠오른 자료형!
그렇다 int의 가장큰 수는2147483647 였다.
그래서 내가 원하는 51조를 넣기위해서 코드에서 int로 받은녀석을 long으로 바꿔야 한다!
바꾼 코드
using System.Collections;
using System.Collections.Generic;
using System.Data.SqlTypes;
using UnityEngine;
[System.Serializable]
public class UserData
{
public string Name;
public long Balance;
public int Cash;
public UserData(string name, long balance, int cash)
{
Name = name;
Balance = balance;
Cash = cash;
}
public bool Deposit (int money)
{
if (Cash < money)
return false;
Cash -= money;
Balance += money;
return true;
}
public bool Withdraw(int money)
{
if(Balance < money) return false;
Cash+= money;
Balance -= money;
return true;
}
}
다음과 같이 잘 바뀌는 것을 확인 할 수 있다.
그런데 생각해 보니 Balance에서 몇십억 이상을 출금 할때
현금으로 나타나져 있는 부분에서 제대로 나오게 처리하려면 Balance, cash 모두 long으로 받아야 될것 같아서
using System.Collections;
using System.Collections.Generic;
using System.Data.SqlTypes;
using UnityEngine;
[System.Serializable]
public class UserData
{
public string Name;
public long Balance;
public long Cash;
public UserData(string name, long balance, long cash)
{
Name = name;
Balance = balance;
Cash = cash;
}
public bool Deposit (long money)
{
if (Cash < money)
return false;
Cash -= money;
Balance += money;
return true;
}
public bool Withdraw(long money)
{
if(Balance < money) return false;
Cash+= money;
Balance -= money;
return true;
}
}
long으로 변경
그런데
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;
using TMPro;
public class PopupBank : MonoBehaviour
{
[SerializeField] private TMP_Text userName;
[SerializeField] private TMP_Text balance;
[SerializeField] private TMP_Text cash;
[SerializeField] private GameObject PopupError;
private void Start()
{
GameManager.Instance.LoadUserData("I'm 신뢰에요~");
Refresh();
}
public void Deposit(int money)
{
if (!GameManager.Instance.User.Deposit(money))
{
PopupError.SetActive(true);
return;
}
GameManager.Instance.SaveUserData();
Refresh();
}
public void Withdraw(int money)
{
if (!GameManager.Instance.User.Withdraw(money))
{
PopupError.SetActive(true);
return;
}
GameManager.Instance.SaveUserData();
Refresh();
}
public void CustomDeposit(TMP_InputField inputField)
{
Deposit(int.Parse(inputField.text));
}
public void CustomWithdraw(TMP_InputField inputField)
{
Withdraw(int.Parse(inputField.text));
}
private void Refresh()
{
userName.text = GameManager.Instance.User.Name;
balance.text = GameManager.Instance.User.Balance.ToString();
cash.text = GameManager.Instance.User.Cash.ToString();
}
// 숫자를 쉼표로 구분된 형식으로 변환하는 함수
private string FormatNumber(long number)
{
return string.Format("{0:#,##0}", number);
}
}
여기에 있는 money를 int로 받으면 유니티에서 button이 작동을 안함.. 왜 안하나 봤더니 인스펙터 창에서 withdraw와 deposit을 받는 function이 나오질 않음.
왜 그런지 시간을 두면서 알아봐야 될듯..