[2025/07/09] TIL : TextRPG 개인프로젝트-2(상점, 인벤토리,스탯)

rain cloud·2025년 7월 10일
0

TIL

목록 보기
2/11
post-thumbnail

📌 프로젝트

  • 어제에 이어서 프로젝트를 계속 진행했음.

  • 상점, 아이템 구매, 구매 시 아이템 구매 표시

  • 구매한 아이템이 인벤토리에 보이게 하고 아이템을 장착, 해제 하는 기능

  • 스탯창에 장착한 아이템의 수치를 반영하는 기능을 제작하였음

  • 이러한 기능들을 구현하다가 생긴 문제점들을 작성하고 어떻게 해결하였는지를 작성할 예정


문제 1.

  • 문제

    • 상점-아이템 구매 창에서 아이템을 구매하면 구매한 아이템만큼 소유한 돈이 감소하고, 구매한 아이템은 인벤토리 아이템리스트에 추가하는 함수를 작성하는 중이었다.

    • BuyItem()으로 함수를 선언했고, 필요한 변수들을 매개변수로 추가해 주었다.

    • 처음엔 사진처럼 작성을 해주었다. 사진을 보면 foreach로 shopItem 객체를 받아와서 그 안의 아이템들을 하나씩 item에 저장해서 받아오는 형식을 사용했다.

    • BuyNumber로 입력값을 받으면, 인덱스로 사용해서 상점 화면에 원하는 아이템의 정보를 가져와서 인벤토리의 아이템 리스트에 추가할 수 있을거라는 생각으로 코드를 작성하였다.

    • 다만 막상 실행을 하니 빌드 과정에서 에러가 생겼다. 로그를 보니까 []을 사용하는 인덱싱을 "Item"형식의 식에 적용할 수 없다는 것이었다.

  • 이유
    • foreach로 받아왔기 때문에 리스트에서 하나씩 꺼냈다고 할 수 있다. 즉, Item item에서 item은 Item 클래스의 단일 객체로서 취급되었다는 것.
    • item.ItemPrice[BuyNumber] 이런 식의 사용은 배열이나 리스트, 문자열에서만 가능함.
    • 상점의 아이템인 shopItem이 리스트 형식이었고, 이를 Item.cs로 넘겨주는 방식으로 Item을 구성했었기 때문에 item도 리스트로서 사용해도 된다고 착각했던 것 같다.
    • 그냥 간단히 말해서 foreach의 구조를 잠시 잊었다.로 말해도 큰 문제는 없을 것 같다.
  • 해결
    • 구조 전체를 갈아엎었다.
    • 일단 TryParse를 사용해서 BunNumber의 입력값을 정수형으로 변경하였다.
    • 그리고 이번에는 리스트인 shopItem.ShopItems[index -1]; 을 해주어서 선택한 아이템을 item 객체에다 정보를 담아주었다.
      • index - 1을 해준 건. 아이템의 순서를 1 부터 시작할 생각이었어서 그럼. 인덱스는 0부터 시작인데 입력값은 1부터 할꺼라서.
    • 그리고 선택한 아이템의 정보를 가지고 있는 item 객체를 사용해서 각각의 Item클래스의 public 요소들을 사용해 코드를 작성해주었다.
    • 그리고 foreach의 반복을 대신하기 위해 이 함수를 작성한 ShopScene()함수에서 반복을 직접 해주어서, 각 아이템이 구매했는지 안했는지의 여부를 확인하고 배치되도록 해주었다.

문제 2.

  • 문제

    • 인벤토리에 추가한 아이템 리스트를 불러와서 입력한 값에 해당하는 아이템에 착용표시를 추가해서 다시 보여주는 작업을 진행중이었음
    • 선택한 값과 foreach 에서 아이템 하나씩 가져와서 보여줄 떄마다 index 값 하나씩 올려서 둘을 비교했을 때 같을 경우 착용 표시를 추가해주도록 할려고 했음
    • 실행했는데 문제는 2개의 아이템이 있을 때 하나를 장착하면 다른 하나가 장착해제되는 문제가 발생함.
  • 원인 :

    • 현재 상태가 착용 상태를 인벤토리 내에 저장하지 않고 그때그때 입력값과 인덱스를 비교해서만 표시했기 때문에 항상 마지막에 선택한 아이템만 착용표시가 됐음
    • 착용 상태를 기억할 수 있는 필드가 Item 클래스에 없기 때문인데, 사실 없는게 아니라 안쓴거였음. 로직 작성하느라 정신 팔려서 이때 사용할려고 만든 필드를 잊어버렸음
  • 해결 :

    • 해결방법은 위의 사진처럼 선택한 인벤토리 아이템에서 .으로 bool 필드에 true 값을 넘겨주고, foreach 문에서 삼항연산자로 true false일때의 값을 각각 설정해 주었다.
    • 이러면 착용 상태를 각 아이템마다 기억할 수 있기 때문에 중복 착용이 가능해진다.


문제3.

  • 문제 :

    • 인벤토리 아이템을 장착하면 그 수치만큼 스테이터스에 반영하는 기능을 구현 중에 있었음
    • 구현 하다보니, 아이템을 끼고 있을 때 상태 보기 창을 여러번 들어가면 들어갈 때마다 수치가 반영되는 문제가 있었음.
    • 심지어 추가 스탯을 표시하는 (+)는 보이지도 않는 문제가 같이 발생했음

  • 원인

    • 짧게 파악했는데 간단히 말해서는 그냥 스테이터스 반영 함수인 ReflectItemvalue의 함수 구조가 매번 더하고 빼는 구조였기 때문.
    • 또 아이템에 의한 스탯은 추가 스탯으로서, 기본 스탯에 영향을 줘서는 안되는데, 기본 스탯 자체의 값을 변화시켰기 때문에 계속 값이 변경되버리는 것.

    • 추가 스탯 표시하는 (+)가 안보인 이유는 이 수치를 표시하는데 사용했던 변수들이 함수에서의 변경값을 제대로 못 가져왔음.
    • 왜냐면 string 자료형을 사용했기 때문임. string 자료형은 값 타입이라서, 함수 밖에서 변수가 반영이 안됨.
  • 해결

    • 기본 플레이어 스탯값을 건들면 안되니까 추가 스탯에만 영향을 끼칠 수 있도록 Player.cs에서 기본 스탯에 대한 공격력, 방어력 필드를 각각 생성해줌

    • 기존의 공격력, 방어력 값은 총 공경력, 방어력으로 주석 달아줌

    • 리플렉트 함수에서 추가 수치에 대한 변수를 각각 생성함

    • 그리고 (+숫자) 를 표현 할 수 있게 하기 위해 plusStatA, plusStatB를 생성해주고 ""; 로 초기화 함

    • 각 케이스에 value를 추가 수치에 더할 수 있도록 변경해주고, 앞서 빈문자열로 초기화 해준 변수들도 각각 케이스에 맞게 추가 수치를 문자열로 받도록 함.

    • 최종 능력치는 기본 능력치 + 장착 아이템 추가 수치로 반영되도록 하였음

    • 그리고 그리고 추가 수치를 ShowPlayerStatus에 반영하기 위해 out으로 매개변수를 선언해줌.
      이러면 함수에서 얻은 변수 값을 함수 밖으로 가져갈 수 있음!

    • plusStatA, plusStatP는 out 파라미터로 선언해야 함수 내에서 값을 바꿔도 호출한 쪽에서 반영됨


배운점

  • 일단 각 키워드 들이 정확히 어떤 역할을 하고 어떤 구조로 작동되는지를 좀 더 자세히 공부해야할 필요를 느꼈다.

  • 그리고 여전히 로직의 중요성을 체감하고 있다. 로직이라고 해도 되는진 모르겠는데, 어떤 식으로 기능을 구성하고 코드를 만들면 되겠다. 싶은 정도로는 메모장으로 계속 작성하면서 설계를 하고 시작하는데, 이러면 막히던 것도 풀리게 되서 좋은 것 같다.

  • out 함수를 어떤 경우에 쓰는지를 깨닫게 되지 않았나 싶다.

    • 보통 값형은 함수 밖에서 선언하고 함수 안에서 값을 할당해줬을 때 다시 함수 밖으로 빠져나오면 그 값이 저장이 안된다.
    • 그 이유는 값형의 경우 값을 복사해서 건네주기 때문에 독립적으로 작용한다.
    • 그래서 값을 수정해도 함수 밖의 변수에는 수정사항이 영향이 없는것.
    • 그런데 out을 사용해주면 메서드에서의 반환 값을 매개변수로 사용할 수 있게 되는데, 이 과정에서 함수 밖의 같은 변수에도 영향을 주게 되어 수정 사항이 반영이 된 것.
profile
게임 개발, 기획

0개의 댓글