Unity/Unity Study

[Unity] 개인과제, ATM 만들기 - 입금, 송금

Jee-U 2025. 3. 25. 19:51

 

일단 순서는 메인화면 구성(현금, 사용자 정보, 잔액, 입출금), 유저데이터 클래스 작성, 게임매니저 생성, UI와 데이터 연동으로 하여 본격적으로 입출금 기능을 만들고 마지막에 저장기능까지 만들어줬다.

[System.Serializable]
public class UserData
{
    public string UserName;
    public int Balance;
    public int Cash;

    public UserData(string username, int balance, int cash)
    {
        UserName = username;    // 이름
        Cash = cash;            // 현금
        Balance = balance;      // 잔고
    }
}

UserData는 MonoBehaviour를 상속하지 않고 순수 데이터 저장용 클래스로 설계했으며 GameManager에서 유저 정보를 쉽게 가져올 수 있도록 구성하였다.

public class GameManager : MonoBehaviour
{
    public static GameManager Instance;

    public UserData userData;

    private void Awake()
    {
        if (Instance == null)
        {
            Instance = this;
        }

        userData = new UserData("JeeU", 100000, 50000);
    }
}

GameManager는 싱글톤 처리를 해주었으며 userData에서 유저 정보를 관리, Awake()에서 기본값(내가 설정해둔 값)으로 초기화한다.

실행하면 UserData에 넣어놓은 [System.Serializable]로 인해 GameManager에 현재 유저 정보가 나타나게 된다.

public class PopupBank : MonoBehaviour
{
    public GameObject BankMenu;     // 입출금
    public GameObject Deposit;      // 입금
    public GameObject Withdraw;     // 출금

    public void OnDepositBtn()
    {
        Deposit.SetActive(true);
        BankMenu.SetActive(false);
    }

    public void OnWithdrawtBtn()
    {
        Withdraw.SetActive(true);
        BankMenu.SetActive(false);
    }

    public void OnBankMenuBtn()
    {
        BankMenu.SetActive(true);
        Withdraw.SetActive(false);
        Deposit.SetActive(false);
    }
}

입출금 버튼은 단순하게 활성화/비활성화로 해주었으며 입출금 버튼 안의 뒤로가기 버튼을 누르면 원래 메뉴가 비활성화되고 입출금 버튼이 활성화 되게 해주었다.

입금 및 출금 화면 버튼은 위와 같으며 입/출금을 원하는 금액을 클릭하거나 InputField에 원하는 금액을 입력 후 입/출금 버튼을 눌러주면 된다.

public class PopupBank : MonoBehaviour
{
    public TextUI textUI;
    public InputField inputDeposit;
    public InputField inputWithdrawt;
    
    public GameObject PopupError;   // 잔액부족창

    public void DepositMoney(int amount)
    {
        // 입금금액이 0보다 커야함, 현금(Cash)이 입금금액보다 많거나 같은지
        if (amount > 0 && GameManager.Instance.userData.Cash >= amount)
        {
            GameManager.Instance.userData.Cash -= amount;
            GameManager.Instance.userData.Balance += amount;
        }
        else 
        {
            PopupError.SetActive(true);
        }
        textUI.Refresh();
    }

    public void DepositInputMoney()
    {
        string inputText = inputDeposit.text.Trim();

        // TryParse : 문자열을 지정된 숫자형식으로 반환
        // (inputText, 정수로 변환 가능시 amount에 저장)
        if (int.TryParse(inputText, out int amount))
        {
            if (amount > 0 && GameManager.Instance.userData.Cash >= amount)
            {
                GameManager.Instance.userData.Cash -= amount;
                GameManager.Instance.userData.Balance += amount;
            }
            else
            {
                PopupError.SetActive(true);
            }
        }
        textUI.Refresh();
    }
}

버튼의 경우 이벤트를 DepositMoney(int amount)로 하여 각 버튼에 입력된 금액을 입금할 수 있도록 설정하였고

10,000원 버튼

원하는 값의 경우 InputField의 값에 입력한 숫자를 DepositInputMoney()를 통하여 입금할 수 있게 해주었다.

출금의 경우 Deposit에서 Withdraw로 바꾸어주었고 Cash(현금)과 Balance(잔액)의 계산법을 반대로 해주면 끝.

 

이렇게 하면 실행 하였을때 저장된 유저의 정보가 불러와지며 자유롭게 입출 금이 가능하게 된다.