이미 프로퍼티를 통해 유저의 현금/계좌금액이 변동되면 자동으로 UI가 갱신되도록 만들어 둔 상태였기 때문에 입/출금 UI와 해당 버튼에 연결해줄 스크립트만 작성하는 되는 상황이었음.
버튼에 붙여준 스크립트는 다음과 같다:
public void Withdraw(int money) { if(GameManager.Instance.Balance < money) { ErrorPopup(); return; } GameManager.Instance.Balance -= money; GameManager.Instance.Cash += money; } public void Deposit(int money) { if (GameManager.Instance.Cash < money) { ErrorPopup(); return; } GameManager.Instance.Balance += money; GameManager.Instance.Cash -= money; } public void CustomWithdraw(InputField inputText) { if(int.TryParse(inputText.text, out int money)) { Withdraw(money); inputText.text = ""; } } public void CustomDeposit(InputField inputText) { if (int.TryParse(inputText.text, out int money)) { Deposit(money); inputText.text = ""; } }
직렬화 특강에서 배웠던 방식을 이용했다. (아직 제대로 정리하지 못해서 TIL로 올리진 못했지만 추후 올리게 되면 링크를 달아두겠음.)
내가 작성한 코드:
using UnityEngine; using System.IO; // 파일 입출력을 위한 네임스페이스 public static class DataManager { public static void Save(UserData data) { // 저장 폴더가 존재하지 않으면 생성 if (!Directory.Exists(Application.persistentDataPath + $"/UserData")) { Directory.CreateDirectory(Application.persistentDataPath + $"/UserData"); } // saveDataf JSON 문자열로 변환 string saveData = JsonUtility.ToJson(data, true); // true: 보기 좋은 포맷(줄 바꿈 포함) // JSON 문자열을 파일로 저장 File.WriteAllText(Application.persistentDataPath + $"/UserData/{data.userName}.txt", saveData); Debug.Log("데이터 저장됨"); Debug.Log(Application.persistentDataPath); } public static UserData Load(string userName) { //사용자 데이터가 없으면 기본 데이터를 들려 보내줌 if (!File.Exists(Application.persistentDataPath + $"/UserData/{userName}.txt")) { Debug.Log($"사용자 {userName}의 데이터가 없습니다! 기본 데이터를 생성합니다."); return new UserData("윤혜진", 100000, 50000); } string loadData = File.ReadAllText(Application.persistentDataPath + $"/UserData/{userName}.txt"); Debug.Log($"사용자 {userName} 데이터 로드됨"); return JsonUtility.FromJson<UserData>(loadData); } }
처음에는 아래 코드처럼 1,3,5만원 입/출금 버튼에 붙일 메서드들을 일일이 하나씩 만들어주었음.
아래는 수정 전 코드:
public void OnClickDeposit_10000() { Deposit(10000); } public void OnClickDeposit_30000() { Deposit(30000); } public void OnClickDeposit_50000() { Deposit(50000); } public void OnClickWithdraw_10000() { Withdraw(10000); } public void OnClickWithdraw_30000() { Withdraw(30000); } public void OnClickWithdraw_50000() { Withdraw(50000); } public void Withdraw(int money) { if(GameManager.Instance.Balance < money) { ErrorPopup(); return; } GameManager.Instance.Balance -= money; GameManager.Instance.Cash += money; } public void Deposit(int money) { if (GameManager.Instance.Cash < money) { ErrorPopup(); return; } GameManager.Instance.Balance += money; GameManager.Instance.Cash -= money; }
하지만 입출금 버튼을 위해 총 8개의 메서드를 만들어주어야 한다는 것이 굉장히 비효율 적으로 느껴졌기 때문에 다른 방법을 강구해보기로 함
이 문제로 주변에 도움을 구했을 때는 버튼 컴포넌트를 받아온 뒤 AddListener를 통해 연결하라는 조언을 받았는데, 두 가지가 마음에 걸려 후순위로 미뤄두었다.
다른 방법을 고민하던 중, 문득 버튼에 연결하는 메서드도 매개변수를 받아올 수 있을까? 하는 의문을 가지게 됨
실험 결과 매개변수가 있는 메서드를 넣으면 다음과 같이 인스펙터 창에 값을 입력할 수 있는 란이 생기는 것을 확인할 수 있었다:

생각보다 간단한 방법으로 해결하게 되었지만, 나처럼 몰랐던 사람도 분명히 있었을 것 같아서 기록해둔다.
아자아자!!
저도 굉장히 잘 잊어버리는 편이라 모든 걸 다 기록해두는데 역시 기록만한게 없더라고요.
그렇게 제 인수인계 파일은 10페이지가 되었답니다.