내일배움캠프 65일차 TIL : 층 선택 입장 및 저장 시스템 구현

woollim·2024년 12월 24일
0

내일배움캠프TIL

목록 보기
58/65

■ 개요

○ 오늘 계획

  • 층 선택 입장 및 저장 시스템 구현
  • 일반 에너미들 공격 코루틴 제거


■ 작업일지

○ 개요

  • 무조건 하층부터 올라가게 하면 유저들이 빠르게 질릴 것같음. 층 저장시스템이 있으면 좋을거 같다고 생각함
  • 하지만, 기획단계에서 어느정도 로그라이크를 참고했고, 아직 보상 지급 부분에서 그 잔재가 남아있기 때문에 모든 층을 접근가능하게 하는 것은 안좋을거 같음
  • 10층마다 있는 수문장 보스를 클리어하면, 그 다음층 부터 입장가능하게끔 층 저장시스템을 만들기로 했음
  • 결론적으로 1, 11, 21, 31... 이런식으로 입장할 수 있음. 물론 수문장을 클리어해야만 갈 수 있음.
  • 근데 생각해보니 지금은 1, 10, 20 이런식으로 되어있다. 먼저 수정하고 마저 작성해야겠다.

○ UI

using TMPro;
using UnityEngine;
using UnityEngine.UI;
using System;

public class UIFloorChallengeController : UIPopUp
{
    [SerializeField] private TextMeshProUGUI floorNumber;
    [SerializeField] private Button downButton;
    [SerializeField] private Button upButton;
    [SerializeField] private Button enterButton;

    private int seletedFloor;

    protected override void Awake()
    {
        base.Awake();

        downButton.onClick.AddListener(OnDownButton);
        upButton.onClick.AddListener(OnUpButton);
        enterButton.onClick.AddListener(OnEnterButton);
    }

    private void Start()
    {
        floorNumber.text = Managers.Character.Player.saveData.MaxFloorReached.ToString();
        SelectedFloor();
        UpDownButtonCheck();
    }

    public override void Hide()
    {
        base.Hide();
        Managers.UI.Hide<UIFloorChallengeController>();
    }

    public void OnDownButton()
    {
        SelectedFloor();

        seletedFloor -= 10;

        if (seletedFloor >= 0)
        {
            floorNumber.text = seletedFloor.ToString();
            UpDownButtonCheck();
        }
    }

    public void OnUpButton()
    {
        SelectedFloor();

        seletedFloor += 10;

        if (seletedFloor <= Managers.Character.Player.saveData.MaxFloorReached) // 최고 도달층 보다 작거나 같으면
        {
            floorNumber.text = seletedFloor.ToString();
            UpDownButtonCheck();
        }
    }

    public void OnEnterButton()
    {
        Hide();
        Managers.Game.InitChallengeFloor(seletedFloor);
        Managers.Stage.CreateStage();
    }

    public void SelectedFloor() // 층 텍스트 변수에 저장
    {
        seletedFloor = int.Parse(floorNumber.text);
    }

    public void UpDownButtonCheck() // 층 업다운 버튼 활성화 검사
    {
        if (seletedFloor - 10 < 0)
            downButton.interactable = false;
        else
            downButton.interactable = true;

        if(seletedFloor + 10 > Managers.Character.Player.saveData.MaxFloorReached)
            upButton.interactable = false;
        else
            upButton.interactable = true;
    }
}

○ 층 저장

  • GameManager의 StageClear() 함수내에서 현재층이 10으로 나뉘어떨어지는지 확인하고 호출하도록 한다
  • 개요에서 말한 문제는 수정되어 1, 11, 21.. 로 저장된다
  • 저장 갱신 트리거 코드
/// <summary>
/// 스테이지 클리어했을때 호출되는 함수입니다.
/// 층수를 올리고 정비소로 씬 이동합니다.
/// </summary>
private void StageClear(Vector3 enemyPosition)
{
    // 3배수
    TopGold = (int)TopReputeScore * 3;
    Instantiate(stageRewardBox, enemyPosition, Quaternion.identity);

    if(TopCurFloor % 10 == 0)
    {
        AddRecordStartFloor();
    }
}

/// <summary>
/// 도달한 최고층 기록을 바꿔주는 함수 입니다.
/// </summary>
private void AddRecordStartFloor()
{
    int RecordStartFloor = TopCurFloor + 1;
    // 고층 기록 리스트에 포함되지 않았다면
    if (!Managers.Data.PlayerDataBase.PlayerDatas[0]._RecordStartFloor.Contains(RecordStartFloor))
    {
        // 기록 리스트의 어떤 값 보다 크다면
        if (Managers.Data.PlayerDataBase.PlayerDatas[0]._RecordStartFloor.Any(n => n < RecordStartFloor))
        {
            // 현재층을 최고층 기록에 추가
            Managers.Data.PlayerDataBase.PlayerDatas[0]._RecordStartFloor.Add(RecordStartFloor);
            // 플레이어의 도달 최고층 바꾸기
            Managers.Character.Player.saveData.UpMaxRecordStartFloor(RecordStartFloor);
        }
    }
}
  • 저장 변수는 플레이어가 들고있다.
  • UpMaxRecordStartFloor함수를 통해서만 수정 가능
public class PlayerSaveData : MonoBehaviour
{
    #region Properties
    public int Gold { get; private set; }
    public int Reputation { get; private set; }
    public int MaxRecordStartFloor { get; private set; }
    
    public void UpMaxRecordStartFloor(int floor)
	{
    	MaxRecordStartFloor = floor;
	}
}

○ 후기

  • 지금은 업적처럼 자동 저장인데 포탈이나 석상등 특정 물체가 나와서 인터렉션 후 저장되는 시스템도 재밌을거 같다. 스토리에 개연성을 부여하려면 확실히 만드는 쪽이 좋을듯 하다

0개의 댓글