본문 바로가기
다이어리/내일배움 개발일지

게임개발캠프 - 개인과제(C) 5일차

by E.Clone 2024. 2. 7.

과정명 : 내일배움캠프 Unity 게임개발 3기

전체진행도 : 32일차

부분진행도 : Chapter4.1 - 5일차

작성일자 : 2024.02.07(수)

개발일지 목록 : 클릭


1. 진행중인 과정에 대해

11시간에 걸친 밤샘 개인 과제 작성을 마쳤다. 오전 10시까지 제출이었는데 기능구현을 마치고 마지막까지 README와 혹시 있을 버그를 열심히 손보았다.

내일부터는 약 일주일간 숙련주차의 팀 과제를 시작한다. 어떤 주제로 하게 될지는 아직 미지수.

어제 캠프내 새로 사귀게 된 분들과 얘기를 하며 구조화에 대한 시야도 넓히고, 강의를 추천받았는데 굉장히 듣고 싶은 내용이었다.

지금까지 내가 소화할 지 미지수인 것도 있고 유료라는 허들이 커서 유료강의는 거의 듣지 않았는데, 이번에 추천받은 Rookiss씨의 강의는 가격이 좀 나가도 내용이 무척 깊어 보여 엄청 듣고싶다고 생각하였다. 로드맵 강의를 따라가면 572,000원.

아, 그리고 이전 입문 주차에 소화하지 못한 강의와, 이번 숙련주차에 소화하지 못한 13/13강 마지막 강의가 있다. 이것도 공부해야 할 듯.

2. 오늘 학습에 대해

과제 도중 이슈

InputField의 값이 갱신되지 않는 버그

발단

public class Withdraw : MonoBehaviour
{
    [SerializeField] private int amount;

    public InputField amountInput;

    public GameObject[] goSuccess;
    public GameObject popupObject;
    public Text AlertText;

    public DisplayText displayTextManager;
    public void OnClickButton()
    {
        if (amount < 1)
            amount = int.Parse(amountInput.text);

        if (DataManager.Instance.Withdraw(amount))
        {
            displayTextManager.RenewDisplay();
            foreach (GameObject go in goSuccess)
                go.SetActive(!go.activeSelf);
            return;
        }

        AlertText.text = "계좌 잔금이 부족합니다.";
        popupObject.SetActive(!popupObject.activeSelf);
    }
}

값을 필드에 입력하고 출금 버튼을 클릭 시(OnClickButton()), 일정 금액이 출금된다.

다른 금액을 다시 넣어 시도 시, 처음에 넣었던 금액만큼의 처리가 계속되는 현상이 있다.

당장 코드만 보면 크게 문제가 없어 보였으나, 원인을 발견하였다.

코드와 원인에 대해

해당 메서드는, '10000원 버튼', '30000원 버튼', '50000원 버튼'을 누를 경우에도 대응되도록, 미리 설정된 amount가 1만, 3만, 5만이 아닐 경우(amount<1) InputField로부터 유저로부터 입력받은 값을 가져오도록 했다.

그래서, amount가 새로 설정되는 시점부터 그 이후는 amount값이 1보다 크기 때문에 갱신을 하지 않은 것이었다.

해결

조건 분기를 위해 새로운 변수를 추가했다. [SerializeField] private bool useAmountInput;

해당 변수는 에디터에서 체크를 할 수 있으며, InputField를 사용하여 유저가 직접 값을 입력하는 케이스에 체크 해 두도록 한다.

수정된 코드는 아래와 같다.

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;

public class Withdraw : MonoBehaviour
{
    [SerializeField] private int amount;
    [SerializeField] private bool useAmountInput; // 추가된 부분
    public InputField amountInput;

    public GameObject[] goSuccess;
    public GameObject popupObject;
    public Text AlertText;

    public DisplayText displayTextManager;
    public void OnClickButton()
    {
        if (useAmountInput) // 수정된 부분
            amount = int.Parse(amountInput.text);

        if (DataManager.Instance.Withdraw(amount))
        {
            displayTextManager.RenewDisplay();
            foreach (GameObject go in goSuccess)
                go.SetActive(!go.activeSelf);
            return;
        }

        AlertText.text = "계좌 잔금이 부족합니다.";
        popupObject.SetActive(!popupObject.activeSelf);
    }
}

출금에서 발견했지만, 입금도 같은 구조이기 때문에 같이 수정 해 주었다.

유니티의 json 등 파일 쓰기에 대해

실시간으로 세이브 및 로드를 하는 경우, 파일 쓰기를 할 수 있는 경로가 극히 제한된다는 것을 알았다.

Application.persistentDataPath을 데이터 저장 경로로 사용하는 케이스를 종종 볼 수 있다.

나는 프로젝트 파일 근처에서 json파일을 열심히 찾아보다 보이지 않아 구체적인 경로를 검색 해 보았는데,

C:\Users\[user name]\AppData\LocalLow\[company name]\[product name]

위와 같은 복잡한 경로에 존재한다고 한다. 이게 어째서인고 하니..

위 경로가 운영체제에서 앱이 사용할 수 있도록 허용한 경로라고 하여 유니티 실행 중 자유롭게 파일을 쓸 수 있는 경로인 것이다.

그 외 아래와 같은 경로도 있는데,

Application.dataPath
Application.streamingAssetsPath

각각 프로젝트 폴더 내부(Asset, StreamingAsset)를 반환하는데, 이러한 경로들은 파일을 수정하거나 작성 할 수 없다고 한다.

3. 과제에 대해

  • 내일부터 팀 과제 수행, 과연 무슨 내용이 주어질지
  • 입문주차 및 숙련주차 주어졌던 강의 학습 및 복습

4. 참고자료

5. 듣고싶은 강의

반응형