왜.... 오셨나요?

부끄러워요

유니티개발 TIL

3주차 1일 TIL_TextRPG심화(던전메이커)

와피했는데 2025. 7. 14. 16:26

들어가기 앞서

바로 이전글에서 텍스트 RPG를 제작했었는데 여기서 도전과제로 던전기능이 있었다

내용은 던전은 요구능력치별 레벨이 있어서 요구치를 충족하면 클리어 아니면 실패로 구현되게 주어젔는데 나는 여기서 

던전의 기능하면 직접 탐험하는 재미와 몬스터와 전투의 재미가 있어야 된다고 생각하게 되어

이번 기능 구현은 던전탐험과 몬스터 전투가 되겠다


게임 구상 단계


우선 던전에 요구하는 기능은 다음과 같다

  • 3가지 선택지로 왼쪽, 위쪽, 오른쪽으로 3개중 하나 선택하여 탐험진행
  • 여기서 처음 시작할때는 선택지 4번이 존재함 (마을로 돌아가기 가능)
  • 던전은 플레이어의 레벨로 3단계 구간으로 나눔
  • 던전클리어의 조건은 플레이어가 탐험한 횟수(걸음수)
  • 몬스터 출현확률


게임 구현 단계


<몬스터 출현 확률 연산식>

우선 게임에서 생각할 수 있는 확률계산식은 '난수'가 핵심이 된다 

난수는 우리가 항상 써오던 'Random' 클래스를 사용하면 된다 그럼 어떻게 확률 연산을 시킨지 아래 구현 해두겠다.

 double monsterChance = 0.3f; // 몬스터 등장 확률 (30%)
 Random rand1 = new Random();
 if (rand1.NextDouble() < monsterChance) // 몬스터 등장 확률에 따라 몬스터 소환
 {
     Console.WriteLine("\ninfo : 몬스터가 나타났습니다!");
 }
 else
 {
     Console.WriteLine("\ninfo : 아무 일도 일어나지 않았습니다.");
 }

 

해당 방식은 던전의 몬스터 등장확률을 간단하게 계산한 값이다

 

여기서 외부적 변수가 생긴다면? 예를들어

- 던전 클리어 조건에 따라 퍼센트가 변동됨

- 던전 걸음수에 따라 퍼센트가 변동됨

- 몬스터 처치수에 따라 퍼센트가 변동됨

○ ○ ○

등등 다양한 변수가 존재하게 되면 계산이 조금 복잡해질 가능성도 있다

 

여기서 이번 프로젝트에 어떤 변수가 있을지 이미 정해저 있다 그래서 그 변수만 적용해서 계산식을 세우겠다

 

<요소>

- 던전클리어는 최대 걸음수에 도달하면 클리어한다

- 걸음수++ 될때마다 확률 계산을 한다

경우 두가지 경우로 구현이 가능하다

1. 던전을 몇 걸음을 걷던지 최종 활률이 % 인경우

2. 걸음마다 확률이 % 인경우

 

2번의 경우 바로 위에 써진 식을 적용하면 걸음 이벤트가 발생시 마다 함수를 업데이트 해주면된다


<던전 클리어 조건 및 클리어 카운터 초기화>

해당 게임의 던전 클리어 조건은 임의로 설정한 수치(int)이다 

그렇다면 해당 수치에 도달 하거나 0이 될때 클리어를 해주면 된다

그래서 아래와 같이 구현을 해줬다

int walkCount = 0; // 이동 횟수
int dungeonClearCount = 2; // 던전 클리어 횟수
        
void DungeonEvent()
{
    if (walkCount < dungeonClearCount)
    {
        walkCount++; // 이동 횟수 증가
        SpawnMonster();
        return;
    }
    else
    {
        Console.WriteLine("\ninfo : 던전을 클리어했습니다.");
        Console.WriteLine("\ninfo : 마을로 돌아갑니다");
        gameManager.SwitchScene(SceneID.Village);
        Thread.Sleep(1000);
        walkCount = 0;// 이동 횟수 초기화
        return;
    }
}

 

● 해당 방식은 (걸음수 == 던전클리어수)에 도달하면 던전 클리어로 판단되게 기능되어있다

  - 고민 : 1.클리어수에 도달했을때 바로 마을로 이동할지(ex. 15==15 이동) vs 2.도달하고 한번더 이동하면 마을로 이동할지(i>15 이동) 

  => 결론 : 플레이어가 몇 걸음 걸어왔고 클리어 횟수가 몇인지 마지막에 확인을 위해 2번의 방식을 채택하여 구현함


<화면구성>

 public override void Render()
 {
     Print("◎던전◎", ConsoleColor.Red);
     Print("3가지 선택지를 보고 길을 선택해주세요\n");
     Print("이동횟수 : ", walkCount, ConsoleColor.DarkGreen);
     Print("\n");
     Print(1, "왼쪽길", ConsoleColor.DarkCyan);
     Print(2, "앞으로", ConsoleColor.DarkCyan);
     Print(3, "오른쪽길", ConsoleColor.DarkCyan);

     Print("원하시는 행동을 입력해주세요");
     Console.Write(">>");
 }

결과물


 

콘솔창 화면

 

<기능 순서 다이어그램>