단순하게 가자

 

오늘은 쉬려고 하니 할 일이 없어서 그냥 내일 할 작업을 조금 미리 해두려고 했다.

그러고 레벨 업 하는 부분을 개발하려고 UI부터 배치하니 너무 조잡해 보이는 것이었다.

유저들도 일일이 경험치를 계산하는 것을 귀찮아할 것이고 나도 굳이 이런 메커니즘으로 갈 필요는 없는 것 같아서

 

원 터치로 다음 레벨로 레벨업 하도록 UX를 수정하였다.

결정적으로 키우기 게임 레퍼런스로 사용하고 있는 세븐나이츠 키우기에서도 원 터치로 레벨 업 하는 걸 보니 이게 요즘 트렌드인 것 같았다.

전에 뱀서 라이크를 만들 때는 무조건 경험치를 얻어 레벨업 해야 했기 때문에 이번에도 같은 룰을 적용할 생각이었는데 생각해 보니 게임 장르에 따라 다른 룰을 도입하는 것은 당연한 것이다.

 

 

 

 

데이터 찾기

        public int FindEXP(Grade grade, Rank rank, Level level)
        {
            switch(grade)
            {
                case Grade.star1:
                    return EXPList.Find(o => o.Rank == rank && o.Level == level).Star1;
                case Grade.star2:
                    return EXPList.Find(o => o.Rank == rank && o.Level == level).Star2;
                case Grade.star3:
                    return EXPList.Find(o => o.Rank == rank && o.Level == level).Star3;
                case Grade.star4:
                    return EXPList.Find(o => o.Rank == rank && o.Level == level).Star4;
                case Grade.star5:
                    return EXPList.Find(o => o.Rank == rank && o.Level == level).Star5;
                case Grade.star6:
                    return EXPList.Find(o => o.Rank == rank && o.Level == level).Star6;
                default:
                    return 0;
            }
            
        }

 

현재 랭크, 레벨에 맞는 경험치를 간편하게 가져오기 위해 DataManager에 메서드를 추가했다.

수입 데이터를 가져오는 메서드도 이와 비슷하다.

좀 거추장스러워 보이는데 데이터테이블을 수정하느냐 이걸 그냥 두느냐의 문제인 것 같아서 일단 그대로 뒀다.

 

 

상세 정보 패널 세팅

private void SetSelectedEmployeePanel(Employee employee)
{
    view.SetSelectedEmployeePanel(view.StarSprites[(int)employee.Character.Grade], employee.Character.ProfileSprite
        , employee.Rank.ToString(), employee.Character.Name, ((int)employee.Limit).ToString(), employee.Character.Description
        , DataManager.instance.FindEXP(employee.Character.Grade, employee.Rank, employee.Level)
        );

    view.RankUpButton.gameObject.SetActive(false);
    view.SalaryButton.gameObject.SetActive(true);

    if (employee.Level == Level.master)
    {
        view.SalaryButton.gameObject.SetActive(false);
        switch (employee.Character.Grade)
        {
            case Grade.star1:
            case Grade.star2:
                break;
            case Grade.star3:
                if(employee.Rank == Rank.employee)
                    view.RankUpButton.gameObject.SetActive(true);
                break;
            case Grade.star4:
            case Grade.star5:
            case Grade.star6:
                if (employee.Rank == Rank.employee || employee.Rank == Rank.manager)
                    view.RankUpButton.gameObject.SetActive(true);
                break;
        }
    }
}

 

직원 레벨, 랭크, 등급에 따라 레벨 업 할 수 있는지, 랭크 업 할 수 있는지 판별하여 버튼을 활성화/비활성화시키는 로직도 추가하였다.

 

따라서 employee presenter에서는 판별 로직을 수행하지 않을 예정이다.

 

이 상세 정보 패널을 세팅해 주는 부분이 너무 복잡하다는 생각이 들기도 한다.

체크해 두고 나중에 리팩토링 할 때 다시 점검해 보기로 했다.

 

 

 

 

재산 매니저

 

번역기가 재산이 프로퍼티래서 프로퍼티로 클래스 이름을 지었는데...

뭔가 다른 이름이 있으면 좋을 것 같다...

 

 

public class Property
{
    public BigInteger Money {get; set;}
    public int Fame {get; set;}
}

public class PropertyManager: MonoBehaviour
{
    #region Variable
    public static PropertyManager instance;

    public Property Property;
    #endregion

    #region Life Cycle

    private void Awake()
    {
        if (instance != null)
            Destroy(gameObject);
        instance = this;
        DontDestroyOnLoad(gameObject);
    }

    #endregion
    
}

 

어쨌든 이제 사람을 키우려면 돈이 필요하기 때문에 재산을 관리할 클래스를 만들었다.

일단 돈은 제한 없이 벌 수 있도록 BigInteger 변수로 만들었다.

int나 long에 비해 속도가 느리기 때문에 그다지 쓰고 싶지는 않는데 계산량이 얼마나 될지 아직 감이 안오기 때문에 이 또한 나중으로 미뤘다. (맨날 미룬다;)

 

 

 

 

 

결과 UI

 

돈이 부족해 레벨 업/랭크 업 실패 시 띄울 팝업과 성공 결과 패널도 만들었다.

 

 

 

 

레벨 업 로직

        private void LevelUp(Employee employee)
        {
            int needExp = DataManager.instance.FindEXP(employee.Character.Grade, employee.Rank, employee.Level);

            if(PropertyManager.instance.Property.Money >= needExp)
            {
                PropertyManager.instance.Property.Money -= needExp;
                employee.SetLevel(employee.Level + 1);
                uIPresenter.ShowLevelUpResultPanel(true, employee);

            }
            else
            {
                uIPresenter.ShowFailPanel(true);
            }
        }

 

레벨 업 버튼을 누르면 employee presenter로 콜백이 넘어간다는 것은 저번에 얘기했다.

매개 변수는 employee 정보를 받는 것으로 변경하였다.

다음 레벨로 가기 위한 EXP가 얼마인지 찾아서 돈이 그보다 많으면 레벨업 하고 다시 ui프레젠터로 넘어가 결과창을 띄우고, 아니면 실패 창을 띄우는 간단한 로직이다.

 

 

직원 정보를 전달하는 로직은 이전 상세 정보를 띄우는 로직과 별 다를 것 없다.

잘은 되는데 문제점을 발견했다.

랭크와 레벨을 한국어로 표시하고 싶은데 지금은 그냥 enum을 그대로 사용하고 있다는 뜻이다.

그리고 상세 정보도 그냥 랭크만 표시하고 있어서 레벨업을 했는지 안했는지 잘 보이지 않는다.

 

        public string RankToKorean(Rank rank)
        {
            switch (rank) 
            {
                case Rank.employee:
                    return "직원";
                case Rank.manager:
                    return "매니저";
                case Rank.owner:
                    return "점장";
                default:
                    return "정체불명";
            }
        }

        public string LevelToKorean(Level level)
        {
            switch (level)
            {
                case Level.newcomer:
                    return "신입";
                case Level.beginner:
                    return "초보";
                case Level.faithful:
                    return "성실한";
                case Level.expert:
                    return "숙련된";
                case Level.excellent:
                    return "우수한";
                case Level.elite:
                    return "엘리트";
                case Level.master:
                    return "마스터";
                default:
                    return "정체불명";
            }
        }

 

그래서 데이터 매니저에 한글로 변환 해주는 메서드를 추가했다.

 

 

 

 

오늘의 회고

오늘은 원래 쉬는 날이었기 때문에 적당히 한 것 같다.

랭크 업 하는 부분도 오늘과 별 다를 건 없는데 랭크 업에 드는 급여 테이블을 또 만들 필요가 있어서 내일로 미뤘다.

많이 걸리지 않을 것이기 때문에 예정인 점포 UI 개발과 함께 해야겠다.

+ Recent posts