2025.03.21 (금)

윤혜진·2025년 3월 21일

📍오늘의 학습 키워드

  • ATM 만들기 (2)

    • 입/출금 기능 구현
    • json을 이용한 이용자 정보 저장

📍학습 내용

  • 입/출금 기능 구현

    • 이미 프로퍼티를 통해 유저의 현금/계좌금액이 변동되면 자동으로 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 = "";
             }
         }
  • json을 이용한 이용자 정보 저장

    • 직렬화 특강에서 배웠던 방식을 이용했다. (아직 제대로 정리하지 못해서 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를 통해 연결하라는 조언을 받았는데, 두 가지가 마음에 걸려 후순위로 미뤄두었다.

      1. 스크립트 내에서 버튼의 이벤트를 연결하면 해당 버튼에 어떤 메서드가 연결되어있는지 인스펙터 창에서 직관적으로 확인할 수 없게되므로 디버깅이 어려워질 수도 있다던 튜터님의 말씀이 생각나서 (사실 이 부분은 취향차이일 수 있지만 나 또한 공감하는 바가 있었으므로 최대한 지키고 싶었다.)
      2. 메서드 수는 줄일 수 있겠지만 결국 스크립트에 버튼 6개를 연결해주어야 해서 (6개나 손수 할당해주기 싫었다)
    • 다른 방법을 고민하던 중, 문득 버튼에 연결하는 메서드도 매개변수를 받아올 수 있을까? 하는 의문을 가지게 됨

    • 실험 결과 매개변수가 있는 메서드를 넣으면 다음과 같이 인스펙터 창에 값을 입력할 수 있는 란이 생기는 것을 확인할 수 있었다:

    • 생각보다 간단한 방법으로 해결하게 되었지만, 나처럼 몰랐던 사람도 분명히 있었을 것 같아서 기록해둔다.

📍회고 및 반성

  • 최근들어 과제를 빨리 완성하고 싶다는 조바심 때문인지, TIL을 작성하는 중에도 내가 온전히 집중하지 못하고 있다는 기분이 든다.
  • 그러다보니 시간은 더 오래 걸리고, 오래 걸리는 만큼 TIL을 쓰는 것이 거추장스럽게 느껴지고...
  • 하지만 TIL은 잘 잊는 나를 위해 그날 무엇을 했는지 정리하고, 후에 되새길 수 있도록 기록하는 행위임을 잊지 말자!
  • 하나의 프로젝트를 진행하고 완성하는 것도 중요하지만, 그 경험을 기억하지 못하고 흘려보낸다면 의미가 없으니 TIL에 소홀해지지 말 것!
  • 느린건 익숙해지는 만큼 빨라질 수 있고, 오늘의 기록은 내 미래의 헛발질을 줄여줄테니까😊 아자아자!!

1개의 댓글

comment-user-thumbnail
2025년 4월 11일

아자아자!!
저도 굉장히 잘 잊어버리는 편이라 모든 걸 다 기록해두는데 역시 기록만한게 없더라고요.
그렇게 제 인수인계 파일은 10페이지가 되었답니다.

답글 달기