게임 개발_HISTORY

내배캠_TIL251016 [팀 프로젝트 TextRPG 도전과제 구현(1)] 본문

Development In Unity/내일배움캠프_Unity 12기

내배캠_TIL251016 [팀 프로젝트 TextRPG 도전과제 구현(1)]

EVANJ 2025. 10. 16. 12:34

⏰ 일정

  • 종일 팀 프로젝트 제작

📝 학습 요약

  • 레벨 업, 성장 및 보상 시스템 구현
  • 전투씬 매끄럽게 자동 넘기기 구현
  • Scene Images 구현
  • PPT 기본틀 구성하기

🧩 활동 내용

✔️ LEVEL UP, 성장 및 보상 시스템 구현

이미 다른 팀원들이 기본적인 요소들을 모두 구현해 놓아서 보상 시스템을 구현하기 수월했다.

Monster 클래스에 경험치와 골드 필드를 추가했다.

        public Monster(Monster monster)
        {
            this.ExpReward = monster.ExpReward;
            this.GoldReward = monster.GoldReward;
        }

그리고 몬스터 List에 각 몬스터로부터 얻을 수 있는 경험치와 골드의 양을 상수로 입력했다.

        public static Monster[] monsters = new Monster[]
        {
            new Monster(2,"미니언",15,10,2,20,0.8),
            new Monster(5,"대포 미니언",25,15,5,50, 0.7),
            new Monster(3,"공허충",10,8,3,30,0.6),
            new Monster(7,"드래곤",30,18,7,70, 0.5)
        };

이미 구현되어 있는 expTable을 이용하여 경험치를 특정 값가지 오르면 레벨이 증가하는 시스템을 구현했다.

        public int GetNextLevelExp()
        {
            int[] expTable = { 10, 35, 65, 100 };

            // 최고 레벨이면 0 반환
            if (Level - 1 >= expTable.Length)
                return 0;
            return expTable[Level - 1];
        }

 

✔️ 전투 씬 매끄럽게 자동 넘기기 구현

Console.WriteLine($"{PlayerRef.Name} 의 공격!");
var critTxt = r.IsCritical ? "-치명타!!" : "";
Console.WriteLine($"Lv.{r.MonsterLevel} {r.MonsterName} 을(를) 맞췄습니다. [데미지 : {r.Damage}]{critTxt}");
Console.WriteLine();
Console.WriteLine($"Lv.{r.MonsterLevel} {r.MonsterName}");
string right = r.HpAfter > 0 ? $"{r.HpAfter}" : "Dead";
Console.WriteLine($"HP {r.HpBefore} -> {right}");
System.Threading.Thread.Sleep(2000);

 

전투 씬에서 전투 중 공격을 하고 공격을 받는 과정에서
TimeNext();
코드가 흐름을 멈춰 자연스러운 진행이 되지 않아
System.Threading.Thread.Sleep(2000);
코드를 사용해서 2초 정도 정보를 노출 후 자동으로 넘어가는 구조를 구현했다.

 

✔️ Scene Images 해상도 높이기

이미지를 생성하기 까지는 성공하였지만 이미지 크기고 원하는 만큼 작게해서 UI 사이즈로는 구현할 수 없었다.

해당 코드의 구조처럼 픽셀이 4개까지만 쪼개져 표현이 되는 구조였기 때문이다.

        static char QuadCharFromMask(int m)
        {
            // 비트: 1=UL, 2=UR, 4=LL, 8=LR
            // 매핑 표(대표 조합)
            return m switch
            {
                0 => ' ',         // none
                1 => '▘',         // UL
                2 => '▝',         // UR
                3 => '▀',         // UL+UR
                4 => '▖',         // LL
                5 => '▌',         // UL+LL
                6 => '▞',         // UR+LL
                7 => '▛',         // UL+UR+LL
                8 => '▗',         // LR
                9 => '▚',         // UL+LR
                10 => '▐',         // UR+LR
                11 => '▜',         // UL+UR+LR
                12 => '▄',         // LL+LR
                13 => '▙',         // UL+LL+LR
                14 => '▟',         // UR+LL+LR
                15 => '█',         // all
                _ => ' '
            };
        }

이미지를 작게하면 해상도의 한계로 너무 많이 깨져 형체를 알아보기 힘들었고, 해상도를 높이려면 이미지 크기를 키울 수 밖에 없었는데 텍스트에 비해 과도하게 커서 UI 기능으로는 과한 크기였다.

 

C# 콘솔에서 이미지를 구현하는 방법들이 있는데 다음과 같다.

  1. Draw (일반 ASCII 매핑, 1×1)
  2. DrawHiRes (상·하 반블록 ▀/▄ 등, 1×2)
  3. DrawQuad (사분면 블록 U+2596~259F, 2×2) ≈ DrawPixelArtQuad (동일한 2×2 해상도, 픽셀아트 보존용 튜닝)
  4. DrawBraille(점) (점자 패턴 U+2800~, 2×4)

즉, Draw < DrawHiRes < DrawQuad ≈ DrawPixelArtQuad < DrawBraille 가 해상도 순이다.

여기서 나는 DrawQuad 방식이 가장 적합하다고 판단했다.
이유는 DrawBraile는 점자 방식이라 약간 지저분한 느낌이 있었고 전체적으로 분위기가 어두워지고 적합한 아트 스타일은 아니였다. DrawPixelArtQuad 는 이미지를 작게 사이즈를 줄이면 아래와 같이 이미지가 짤리는 이슈가 생겨 사용할 수 없었다.

이 중 가장 해상도가 높고 사이즈 조절이 그나마 자유로운 DrawQuad여서 선택하게 되었다.

 

DrawQuad을 사용해서 살짝 선명도와 또렷하게 출력되도록 하는 코드를 찾아서 작성했다.

img.Mutate(x => x.Resize(w, h, KnownResamplers.Lanczos3).GaussianSharpen(0.6f));


해상도가 아쉽지만 그래도 시도한 이미지들 중에서 가장 퀄리티가 좋은것 같다.

이제 필요한 부분들을 찾아 이미지를 추가하면 된다.

✔️ PPT 기본 구성 계획하기

우선적으로 기본 구성을 계획을 팀원들과 논의하며 정했다.

1. 우선적으로 TextRPG의 구성요소들을 나열 및 소개한다.

2. 각 팀원들의 작업 분배 및 역할을 소개하고 작업 과정을 소개한다.
3. 미리 촬영 및 편집한 플레이 영상을 공개한다.
4. 필수기능 및 도전 기능을 짧게 구현 내용 소개를 한다.
5. 추가적으로 우리 팀만의 특별한 기능을 소개한다.

6. 작업을 진행하며 모든 팀원들의 대표적인 트러블 슈팅 사례들을 공유한다.

 

이런 구성으로 짜보았고 각 팀원들이 공유한 트러블 슈팅 내용을 선별해
PPT에 포함할 것을 의논해 볼 계획이다.

 

✔️ Pull Request 에 대해서

pull request는 깃허브 협업의 핵심 기능이며, 변경 사항을 메인 코드에 바로 적용하는 대신, 별도의 브랜치에서 작업한 뒤 메인 브랜치에 병합(merge) 해달라고 요청하는 과정이다.

나는 Push해서 별도로 머지 하는 과정과 헷갈렸다.

개념 설명 주 사용 상황
push 내가 local에서 수정한 코드를 깃허브(remote) 저장소에 업로드 하는 명령 혼자 작업하거나, 내 브랜치에 내 코드를 올릴 때
pull request (PR) 내가 올린 코드를 다른 브랜치(보통 'main')에 병합(merge) 해달라고 요청하는 절차 협업 시 팀원에게 내 코드 리뷰하고 병합을 요청할 때

 

요약하자면, pull request는 메인코드에 병합하는 요청이며 리뷰, 토론, 승인 과정이 필요하다.

😭 구현 실패한 시도

아래의 코드로 콘솔창의 크기를 마음대로 조절하고 싶었다. 출력되는 코드에 비해 가로로 넓어서 빈 여백이 많아 코드 내용에 이목을 집중 시키기 어려웠다. 하지만 윈도우와 비주얼스튜디오 프로그램으로 크기 설정값이 고정되어 있는 듯 했다.

Console.SetWindowSize(int width, int height) 콘솔에 표시되는 실제 창의 크기를 설정
Console.SetBufferSize(int width, int height) 스크롤 가능한 내부 버퍼 크기를 설정
Console.WindowWidth, Console.WindowHeight 현재 콘솔창의 실제 크기를 가져옴
Console.BufferWidth, Console.BufferHeight 현재 버퍼의 크기를 가져옴

 

콘솔 창을 의도하는 크기에 맞도록 수정하려 많은 시도를 해보았으나
배웠던 학습내용 밖의 내용이며 방법을 찾으려면 계속 검색과 서칭을 해야하나 시간관계상 크게 중요한 부분은 아니라고 판단해 구현을 중단하게 되었다.

🚀 내일 할 일 (To-do)

  • 팀프로젝트 추가적인 도전기능 구현
  • C# 배치고사