■ 개요
○ 오늘 계획
- 층 선택 입장 및 저장 시스템 구현
- 일반 에너미들 공격 코루틴 제거
■ 작업일지
○ 개요
- 무조건 하층부터 올라가게 하면 유저들이 빠르게 질릴 것같음. 층 저장시스템이 있으면 좋을거 같다고 생각함
- 하지만, 기획단계에서 어느정도 로그라이크를 참고했고, 아직 보상 지급 부분에서 그 잔재가 남아있기 때문에 모든 층을 접근가능하게 하는 것은 안좋을거 같음
- 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;
}
}
○ 후기
- 지금은 업적처럼 자동 저장인데 포탈이나 석상등 특정 물체가 나와서 인터렉션 후 저장되는 시스템도 재밌을거 같다. 스토리에 개연성을 부여하려면 확실히 만드는 쪽이 좋을듯 하다