내일배움캠프 Unity 18일차 TIL - 팀 조랑말 - 보상 씬 구현 / 제출 후기

Wooooo·2023년 11월 22일
0

내일배움캠프Unity

목록 보기
20/94

오늘의 키워드

오늘은 던전 클리어 이후 보상을 보여줄 보상 씬을 만들고, 제출 준비 전 버그를 대거 찾아서 고치는 작업을 했다. 팀원들끼리 서로 어느 부분에 버그가 있다 알려주고, 해당 파트를 담당해주신 분은 순식간에 원인을 찾아서 고쳐주시기도 하고, 서로 해결방법을 찾기도 했다. 재밌는 경험이었다.

오늘 하루만에 많에 추가된 것 같다.
비주얼적인 아스키 아트도 생겼고, BGM도 넣어주셨다.
씬 매니저와 씬에 대한 인풋 시스템도 리팩토링됐고,
배틀 씬도 마무리되고 스킬도 생겨났다.
나도 보상창을 만들었다 ㅇㅅㅇ;


Stage Reward Scene

처음 딱 보상 관련 작업을 맡았을 때, 과제 구현 사항에 있는 것처럼 텍스트만 나열하는 것보다는
씬을 하나 새로 만들어서 비주얼 적으로 경험치 바가 천천히 차오르고, 돈도 촤르륵 올라가는 연출을 보여주고 싶었다.

1. 전역 구조체 CurrentStageReward

현재 스테이지의 보상은 배틀 씬에서 결정된다. 당연히 배틀 씬을 빠져나오면 배틀 씬에 있던 정보들은 휘발되므로 전역 객체인 Game 클래스에 보상 리스트를 받아올 구조체인 CurrentStageReward를 정의해서 전역 필드로 선언해줬다.
배틀이 끝나면 이 구조체에 보상 정보를 담아서 StageRewardScene으로 씬을 넘긴다.

    public struct CurrentStageReward
    {
        public bool isClear;
        public int stageNumber;
        public List<Item> items;
        public int exp;
        public int gold;
    }

    public static CurrentStageReward currentStageReward = new CurrentStageReward();

2. StageRewardScene

화면 구성

구성은 간단하게 짜봤다. 어차피 보여줄 정보도 복잡하지 않아서 중앙 정렬로 필요한 정보만 딱 딱 그려줬다.

  • 이번 스테이지가 몇 스테이지인지
  • 이번 스테이지를 클리어했는지 실패했는지
  • 레벨이 몇인지
  • 경험치가 얼마나 올랐는지
  • 골드를 얼마나 벌었는지

그리고 경험치는 경험치 바가 쭈욱 올라가는 식으로, 골드는 숫자가 촤르륵 바뀌는 식으로 연출하기 위해 Thread.Sleep()을 이용했다.

또, 수치가 너무 크면 연출 시간이 너무 길어질 수도 있으므로 스킵 기능도 넣기로 했다.
스킵 시에는 while문을 빠져나와서 while문에서 처리못한 보상들을 한번에 더해주는 식으로 처리해서 연출이 너무 이상해 보이지 않게 해봤다.

    public override void NextScene()
    {
        while (Game.currentStageReward.exp > 0 || Game.currentStageReward.gold > 0)
        {
            if (Game.currentStageReward.exp > 0)
            {
                Game.Player.TotalExp++;
                Game.currentStageReward.exp--;
                if (Game.Player.TotalExp >= Game.Player.NextLevelExp)
                    Game.Player.ChangeExp(0);
            }

            if (Game.currentStageReward.gold > 7)
            {
                Game.Player.Gold += 7;
                Game.currentStageReward.gold -= 7;
            }
            else
            {
                Game.Player.Gold += Game.currentStageReward.gold;
                Game.currentStageReward.gold = 0;
            }
            DrawScene();
            Thread.Sleep(10);
            if (Skip())
                break;
        }

        // 스킵했을 경우 남아있는 수치를 한번에 합침
        Game.Player.TotalExp += Game.currentStageReward.exp;
        Game.currentStageReward.exp = 0;
        if (Game.Player.TotalExp >= Game.Player.NextLevelExp)
            Game.Player.ChangeExp(0);
        Game.Player.Gold += Game.currentStageReward.gold;
        Game.currentStageReward.gold = 0;

        DrawScene();
        Managers.Game.SaveGame();
        GetInput();
        Managers.Scene.EnterScene<DungeonGateScene>();
    }

테스트 화면. 스킵도 잘 작동하고 연출도 생각한 대로 작동하는 것 같다.


마치며

부트캠프 들어오고 첫 프로젝트였는데, 다들 잘하시고 열심히 하셔서 많이 자극 받고 재밌게 작업했던 것 같다.
예전에 유니티로 프로젝트 진행할 때는 안써봤던 기능, 문법들도 많이 써보고, 나는 자주 안쓰던 기능들도 다른 분들 코드에서 많이 배웠다.
팀 프로젝트 시작 할 때, 팀원 한 분이 잘하는 사람 코드를 보는 것 만큼 좋은 공부가 없다고 하셨는데, 이번에 정말 많이 실감했다.

profile
game developer

0개의 댓글