XR플밍 - 12. UnityEngine3D Reactive 프로그래밍 - 기업협약 프로젝트 32일차 (9/30)

이형원·4일 전
0

XR플밍

목록 보기
211/215

1. 금일 한 업무 정리

  • 캐릭터 해금에 신화석 사용 불가 조건 추가
  • 신화석을 포함하여 레벨업을 진행할 때, 다음과 같은 점을 확인함
    • 신화석을 포함해도 레벨업에 필요한 조각을 충족하지 않을 때, 바로 조각이 부족하다고 출력
    • 신화석을 포함하여 레벨업이 가능할 시, 한 번 더 팝업으로 사용 여부 확인 후 진행.

2. 문제의 발생과 해결 과정

레벨업의 진행 과정을 다음과 같이 수정하였다.

  • UpgradeUnitData
public async Task<bool> LevelUpWithPiecesOnly()
{
    if (CurrentUpgradeData.UpgradeLevel >= 10) return false;

    if (CurrentUpgradeData.UpgradeLevel <= 0)
    {
        if (CurrentUpgradeData.CurrentPieces >= 10)
        {
            CurrentUpgradeData.CurrentPieces -= 10;
            CurrentUpgradeData.UpgradeLevel += 1;
            return true;
        }
        else
        {
            if(PopupManager.Instance != null)
            {
                PopupManager.instance.ShowPopup("조각이 부족합니다.");
            }
            return false;
        }
    }
    else if (CurrentUpgradeData.UpgradeLevel >= 1)
    {
        int requiredPiece = GetRequiredPiece();
        int requiredGold = GetRequiredGold();

        // 골드, 조각 체크
        string uid = FirebaseManager.Auth.CurrentUser.UserId;
        var goldRef = FirebaseManager.DataReference.Child("UserData").Child(uid).Child("Gold");
        DataSnapshot snapshot = await goldRef.GetValueAsync();
        int currentGold = snapshot.Exists ? Convert.ToInt32(snapshot.Value) : 0;

        if (CurrentUpgradeData.CurrentPieces >= requiredPiece && currentGold >= requiredGold)
        {
            CurrentUpgradeData.CurrentPieces -= requiredPiece;
            CurrentUpgradeData.UpgradeLevel += 1;

            await DBManager.Instance.SubtractGoldAsync(requiredGold);
            OnLevelUp?.Invoke();
            return true;
        }
    }
    return false;
}

public async Task<bool> CanLevelUpWithMythStone()
{
    if (CurrentUpgradeData.UpgradeLevel >= 10) return false;

    int requiredPiece = GetRequiredPiece();
    int requiredGold = GetRequiredGold();

    string uid = FirebaseManager.Auth.CurrentUser.UserId;
    var goldRef = FirebaseManager.DataReference.Child("UserData").Child(uid).Child("Gold");
    var mythStoneRef = FirebaseManager.DataReference.Child("UserData").Child(uid).Child("MythStone");

    DataSnapshot goldSnap = await goldRef.GetValueAsync();
    DataSnapshot mythSnap = await mythStoneRef.GetValueAsync();

    int currentGold = goldSnap.Exists ? Convert.ToInt32(goldSnap.Value) : 0;
    int currentMythStone = mythSnap.Exists ? Convert.ToInt32(mythSnap.Value) : 0;

    int ratio = MythStonePieceRatio(_grade);
    int conversedMythstone = currentMythStone / ratio;

    return (CurrentUpgradeData.CurrentPieces + conversedMythstone >= requiredPiece
        && currentGold >= requiredGold);
}

public async Task LevelUpWithMythStone()
{
    int requiredPiece = GetRequiredPiece();
    int requiredGold = GetRequiredGold();
    int ratio = MythStonePieceRatio(_grade);

    int neededFromMythStone = requiredPiece - CurrentUpgradeData.CurrentPieces;
    if (neededFromMythStone > 0)
        await DBManager.Instance.SubtractMythStoneAsync(neededFromMythStone * ratio);

    CurrentUpgradeData.CurrentPieces = 0;
    CurrentUpgradeData.UpgradeLevel += 1;
    await DBManager.Instance.SubtractGoldAsync(requiredGold);

    OnLevelUp?.Invoke();
}

private int MythStonePieceRatio(Grade grade)
{
    int pieceRatio = 0;

    switch (grade)
    {
        case Grade.NORMAL: pieceRatio = 2; break;
        case Grade.RARE: pieceRatio = 4; break;
        case Grade.UNIQUE: pieceRatio = 6; break;
        case Grade.LEGEND: pieceRatio = 9; break;
    }

    return pieceRatio;
}
  • UpgradeCharacterPopupUI
private async void LevelUp()
{
    if (_currentCharUnit.Status.Data.UpgradeData.CurrentUpgradeData.UpgradeLevel >= 10)
    {
        if (PopupManager.Instance != null)
        {
            PopupManager.instance.ShowPopup("이미 최대 레벨입니다.");
            return;
        }
    }

    bool success = await _currentCharUnit.Status.Data.UpgradeData.LevelUpWithPiecesOnly();

    if (!success && _currentCharUnit.Status.Data.UpgradeData.CurrentUpgradeData.UpgradeLevel >= 1)
    {
        bool canUseMyth = await _currentCharUnit.Status.Data.UpgradeData.CanLevelUpWithMythStone();

        if (!canUseMyth)
        {
            if (PopupManager.Instance != null)
            {
                PopupManager.instance.ShowPopup("조각이 부족합니다.");
                return;
            }
        }

        if (PopupManager.Instance != null)
        {
            PopupManager.instance.ShowConfirmationPopup(
                "조각이 부족합니다. 신화석을 사용해서 레벨업 하시겠습니까?",
                async () =>
                {
                    await _currentCharUnit.Status.Data.UpgradeData.LevelUpWithMythStone();
                    await DBManager.Instance.charDB.SaveCharacterUpgradeData(_currentCharUnit.Status.Data);
                    OnCharacterStatusChanged?.Invoke();

                },
                () =>
                {
                    PopupManager.instance.ShowPopup("레벨업이 취소되었습니다.");
                }
            );
        }
    }
    else
    {
        await DBManager.Instance.charDB.SaveCharacterUpgradeData(_currentCharUnit.Status.Data);
        OnCharacterStatusChanged?.Invoke();
    }
}

3. 개선점 및 과제

3.1 신화석 가챠 표기 방법 및 신화석 개수 표기 UI

3.2 마법석 가챠, 마법석 강화 추가

3.3 UI폴리싱

3.4 리팩토링

profile
게임 만들러 코딩 공부중

0개의 댓글