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

화면에 보시다시피 Title에는 ATM.
좌측에는 현금보유량.
우측에는 입금 및 출금 버튼을 구현했습니다.
- 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}를 써주었습니다.
트러블 슈팅
<문제발생>
게임 시작시 바로 튕기는 현상이 있었습니다.
게임내에 오류는 뜨지 않았으며 예기치 못한 종료라며 계속적으로 튕겼습니다.
<문제해결 방향>
새로운 프로젝트를 만들어서 똑같이 구현해봤습니다.
-> 똑같이 문제가 발생한다면 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(스택 오버플로우)가 발생이 됩니다.
아주 단순한 문제이지만 저거 하나로 오류도 없으며 굉장히 골머리를 앓았습ㄴ;다.
여러분도 대문자 소문자 잘 구별하시기를 바랍니다.