코딩의 신 37

김동관·2025년 11월 24일

오늘 한 일

오늘은 ATM기를 구현하기 위해 Unity로 코드를 작성해보았습니다.

  1. ATM 화면 구성


화면에 보시다시피 Title에는 ATM.
좌측에는 현금보유량.
우측에는 입금 및 출금 버튼을 구현했습니다.

  1. UserData관리

ATM기기라서 사용자의 데이터가 필요합니다.
그에 맞는 코드를 작성해봅시다.
필요한 내용

  • 유저 이름
  • 현금
  • 통장 잔액
[System.Serializable]
public class UserData
{
    [SerializeField] private string name;
    [SerializeField] private int cash;
    [SerializeField] private int balance;
    public string Name { get { return name; } }
    public int Cash { get { return cash; } }
    public int Balance { get { return balance; } }

    public UserData(string name, int cash, int balance)
    {
        this.name = name;
        this.cash = cash;
        this.balance = balance;
    }
}
//UserData.cs입니다 제일 상단에 [System.Serializable] 를 추가해서 
GameManager 인스펙터에서 해당 변수의 정보를 볼 수 있게 해주었습니다.

using UnityEngine;

public class GameManager : MonoBehaviour
{
    public static GameManager Instance { get; private set; }
    [SerializeField] private UserData userdata;
    public UserData UserData { get { return userdata; } }
    private void Awake()
    {
        if (Instance != null && Instance != this)
        {
            Destroy(gameObject); // 
            return;
        }
        Instance = this;
        DontDestroyOnLoad(gameObject);
    }
    public void MakeUserData()
    {
        userdata = new UserData("AAA", 900000, 30000);
    }
}
//GameManager.cs 입니다. 어디서든 접근이 가능하게 싱글톤 구조로 해주었으며 데이터를 초기화 해주었습니다.

using TMPro;
using UnityEngine;

public class UIManager : MonoBehaviour
{
    public TextMeshProUGUI nameText;
    public TextMeshProUGUI cashText;
    public TextMeshProUGUI balanceText;
    void Start()
    { 
        GameManager.Instance.MakeUserData();
        Refresh(GameManager.Instance.UserData);  
    }
    public void Refresh(UserData userdata)
    {
        nameText.text = userdata.Name;
        cashText.text = "Cash " + string.Format("{0:N0}", userdata.Cash);
        balanceText.text = "Balance - " + string.Format("{0:N0}", userdata.Balance);
    }
}
// UIManager.cs입니다. TextMeshProUGUI를 사용하고 제일 하단에는 천 단위로 끊어서
콤마를 표시해주기위해 string.Format{0:N0}를 써주었습니다.
  • Canvas에 UIManager를 달아서 변수를 넣어줍니다
  • GameManager Object를 만들어서 GameManager 스크립트를 넣어줍니다.
  • 이렇게 되면 값도 초기화가 되며 잘 작동하는걸 볼 수 있지만 다른 버튼의
    기능은 구현이 되지 않았습니다.
    다음에 계속 이어서 알려드리겠습니다.

    트러블 슈팅

<문제발생>
게임 시작시 바로 튕기는 현상이 있었습니다.
게임내에 오류는 뜨지 않았으며 예기치 못한 종료라며 계속적으로 튕겼습니다.

<문제해결 방향>
새로운 프로젝트를 만들어서 똑같이 구현해봤습니다.
-> 똑같이 문제가 발생한다면 Unity를 삭제했다 다시 만들 생각.
다른 프로젝트들은 잘 작동하나 테스트 해봤습니다.
-> 다른 프로젝트가 작동이 된다면 코드 문제?

<문제해결>
새로운 프로젝트를 만들어 똑같이 구현했지만 똑같이 튕김 현상 발생.
But 다른 프로젝트는 잘 작동이 됨.
-> 코드 문제라고 더 유추가 가능해짐.
하지만 반복문은 없는 코드인데?

using UnityEngine;

[System.Serializable]
public class UserData
{
    [SerializeField] private string name;
    [SerializeField] private int cash;
    [SerializeField] private int balance;
    public string Name { get { return name; } }
    public int Cash { get { return Cash; } }
    public int Balance { get { return balance; } }

    public UserData(string name, int cash, int balance)
    {
        this.name = name;
        this.cash = cash;
        this.balance = balance;
    }
}
//전 코드입니다.
using UnityEngine;

[System.Serializable]
public class UserData
{
    [SerializeField] private string name;
    [SerializeField] private int cash;
    [SerializeField] private int balance;
    public string Name { get { return name; } }
    public int Cash { get { return cash; } }
    public int Balance { get { return balance; } }

    public UserData(string name, int cash, int balance)
    {
        this.name = name;
        this.cash = cash;
        this.balance = balance;
    }
}
//수정 후 코드입니다.

문제가 보이시나요?
public int Cash { get { return Cash; } }
여기를 보시면 return값에 Cash가 들어가 있었습니다.
그러므로 Cash는 Cash값을 리턴받는 StackOverflow(스택 오버플로우)가 발생이 됩니다.
아주 단순한 문제이지만 저거 하나로 오류도 없으며 굉장히 골머리를 앓았습ㄴ;다.
여러분도 대문자 소문자 잘 구별하시기를 바랍니다.

profile
아이디어 뱅크

0개의 댓글