[2025/07/11] TIL : TextRPG 개인프로젝트-3(세이브 , 로드 기능)

rain cloud·2025년 7월 11일
0

TIL

목록 보기
3/11
post-thumbnail

📕 정리 중점

  • 이번 TIL은 문제를 해결하고 그에 대한 해결 방법을 담은 TIL을 작성하지 않을 예정.
  • 이유는, 아이템 판매, 같은 계열의 아이템 중복 착용 금지, 레벨업, 던전 기능(전투X), 게임 저장하기를 오늘 하루 만에 모두 진행했다.
  • 다만, 특별한 기능을 사용해서 구현한 것도 아니고, 이전에 만들었었던 기능들을 응용해서 만든 것이기 때문에 큰 어려움은 없었다.
  • 생각보다 조금씩 조금씩 막혔어서 특정하게 어떤 부분을 회고할 만큼은 기억나지 않는다.
  • 세이브 로드 기능. 그리고 랜덤값을 활용한 던전 보상 지급 기능을 이번에는 다뤄보고자 한다.

1. 던전 보상 기능 (랜덤 값 활용)

  • 던전 보상 기능은 던전의 난이도가 나눠져 있을 때 던전의 난이도 별로 보상의 가치를 다르게 해서 플레이어에게 지급하는 형식이다.

  • 이번에는 easy, normal, hard의 3난이도에 대해서 보상을, 차등을 둬서 지급하도록 하였다.

  • 로직 작성 :

    • 방어력으로 던전 수행 여부를 나눴고, 권장 방어력을 넘지 못하면 일정확률 실패하도록 한다.
    • 실패하면 체력만 깍이도록 한다.
    • 권장 방어력 보다 높으면 무조건 클리어하게 하고, 권장 방어력의 차이 만큼 소모 체력량을 증/감 해준다.
    • 던전 클리어 했을 때 기본적으로 감소하는 체력량을 일정 범위의 랜덤값으로 진행한다.
    • 골드 보상은 공격력의 영향을 받도록 해준다.
  • 구현

    • 일단 , 순서대로 구현한 것은 아니지만, 제일 하위의 함수부터 살펴보고자 한다.

    • 일단 랜덤값을 중점으로 살펴보면, Random 클래스를 사용하기 위해 rand라는 객체를 생성해 주었다.

    • 주석에도 적어 놓았듯 1,101을 입력하여 100의 범위에서 랜덤값을 뽑게 했는데 그 이유는 % 즉, 백분율로 확률을 구해야 했기 때문

    • 왜냐면 0부터 100까지 뽑을 수 있는데 0부터 40까지만 뽑을 수 있다는 뜻이니까 40%확률로 실행되었단 뜻으로 볼 수 있기 때문.

    • NextDouble()의 초기값은 0~1 사이의 범위를 뜻하는데 거기에 (최댓값 - 최솟값)을 곱해주고 최솟값을 더해주면 최솟값~최댓값의 범위에서 랜덤값을 구할 수 있다.

    • 이 함수는 앞서 구현했던 difficultyReward 함수를 담고있는 상위 함수로서, 구현하였다.

    • 각 단계별로 difficultyReward 함수에 다른 값을 넣어 동일한 프레임으로 보상이 적용되면서 다른 수치만큼 보상을 반영하게 했다.

    • 빨간색 히트박스를 보면, out 함수를 사용했는 걸 볼 수 있다.

    • 이전 TIL을 보면 out 함수의 사용법을 알게 되었다고 했는데, 그걸 알고보니 생각보다 유용해서 사용하게 되었다.

    • 내가 메서드 안에 메서드를 사용하는걸 즐기다보니, 메서드 밖에서 선언된 값형 변수의 값을 메서드 안에서 구해서 그 값을 다시 밖의 변수에 그대로 전달하기 위해 out을 자주 사용하는 상황이 오게 된것 같다. PastHealth, PastMoney, isSuccess 도 그런 경우로 사용한 것.

    • 이게 씬을 구성하는 메서드, 즉 TextRPG의 UI를 담당하는 함수이며, 클래스 다음으로의 최상위 메서드라고 볼 수 있다.

    • 최상위 계층일 수록 간단하면서 간결하게 작성을 해야 유지 보수 측면에서 유용하기 때문에, 메서드건 클래스건 줄일 수 있으면 줄이는 방식을 택한 것 같다.

    • ReflectDungeonResult()에서 구한 PastHealth, PastMoney, isSuccess의 값을 이 함수 밖이면서 DungeonClearScene()함수 안에서 선언한 변수에 값을 저장하기 하기 위해 out 을 사용했다는 것을 확실히 알 수 있다.

    • 무사히 잘 구현 하였다.


2. 세이브, 로드 기능

  • 일단 처음 해보는 기능이라서 어떻게 해야할지 아예 감이 안잡혔다.

  • 이건 뭐 로직도 소용없어보이고, 그래서 그냥 AI와 Google 검색을 통해서 기능 구현하는 법을 알아 내고, 내 프로젝트 상황에 맞추어서 변형해서 구현하였다.

  • 구현

    1. 어떤 데이터 저장할지 결정해야 한다. 게임의 모든 구성요소를 저장하는게 아니라 플레이어 중심의 어떤 정보들을 저장해야 로드했을 때 이전과 같은 경험을 가지고 진행할 수 있을지 결정해야 한다.
    2. JSON 저장/ 불러오기 방식을 선택하였다. C#에선 Newtonsoft.JSON 라이브러리를 쉽게 설치할 수 있고, 이걸 이용해 객체를 JSON 문자열로 변환할 수 있어서, 파일로 저장/불러오기가 가능하다.
    3. 도구 -> NuGut 패키지 관리자 -> 솔루션용.. 클릭해서 Newtonsoft.Json을 원하는 프로젝트에 설치한다.
    4. 이렇게 SaveData.cs를 따로 생성해서 저장 코드를 작성해 주었다. 각 스트립트 마다 같은 클래스의 객체를 생성하면, 각 객체가 스크립트마다 다른 데이터를 가지게 된다.
    5. 그걸 알면서도 SaveData.cs에서 생성해준 이유는, 플레이한 정보의 객체 데이터를 "저장"을 하기 위해서 이다.
    6. SaveData data = new SaveData 코드를 보면, 스크립트에서 생성한 객체에 같은 클래스의 다른 객체를 받아와서 삽입해주는 코드다
    7. 이게 플레이 데이터이고 이것을 SaveData.cs의 스크립트에서 잠시 저장하는 것.
    • 이거 그 아래 코드인데, 로드를 하기 위한 메서드이다.
    • 위에서 플레이 데이터를 저장한 객체를 읽어와서 Json 문자열로 변환하여 data 객체를 반환한다.
    • 이 사진은 로드 기능을 씬 함수에서 실제로 구현한 것이다.
    • 로드 데이터가 존재한다면, 현 스크립트의 플레이어 객체에 SaveData.cs에서 가지고있던 저장된 플레이어 객체 정보를 넘겨주는 코드가 빨간 박스의 코드이다.
    • 이렇게 데이터를 주고 받으면서 세이브, 로드 기능을 구현한다.
    • 저장 기능을 씬함수에서 구현한 것.
    • 매개 변수로 현 스크립트의 player, inventory 객체를 넘겨주고 있다.
  • 실행

    • 저장 전.
    • 나가기, 던전 한 판 진행 후, 저장을 진행
    • 나갔다가 다시 들어와서 로드
    • 저장 후
  • 세이브, 로드 기능을 성공적으로 구현한 하였다.

profile
게임 개발, 기획

0개의 댓글