ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [TIL] Text RPG (Team Project) 4
    게임 기획/내일배움캠프 2025. 4. 25. 17:54
    questList 호출오류
     for (int i = 0; i < GameManager.Instance.questManager.questList.Count; i++)
     {
         Quest q = GameManager.Instance.questManager.questList[i];
    
         Utils.ColoredText($"{i + 1}", ConsoleColor.Yellow);
         Console.WriteLine($"{q.title}\n");
     }


    GameManager.Instance.questManager.questList.Count
    여기서 오류 발생

    questManager에 오류 하나,
    GameManager.Instance.questManager가 아직 생성되지 않았거나 초기화되지 않아서 null 상태
    그걸 .questList.Count 하려고 하니 오류가 발생했다. 

    GameManager, QuestManager 에서 다 호출 해줬다고 생각했는데 실행이 안 됐다.

    수정과정에서 GamaManager에 public Quest quest는 호출해줬는데
    public QuestManager questManager 호출이 누락되어 있었다. 

    새로 호출해주고 시도했는데 questManager도 호출은 고쳐졌지만 두번째 오류는 해결되지 않았다. 
    QuestManager에서 리스트를 Init 해줘놓고 GameManager에서 Init 호출을 따로 해주지 않았었다.... 
    Init 호출 하면서 공부 해놓고 정작 게임매니저에서 불러오질 않았으니 실행이 안 될 수밖에,, 
     internal class GameManager
     {
        public Quest quest;
        public QuestManager questManager;
     
        public void Initialize()
        {
     		quest = new Quest();
    		questManager = new QuestManager();
    	
    		questManager.InitQuests();
    	}
    }​

    정상적으로 호출을 해주니 다시 실행되었다!

     

    퀘스트 중복적용 안 되게 하기
    오늘 하루를 다 쏟아부은,, 퀘스트 ..... 
    분명 어제 마무리를 한 줄 알았는데 역시 디버깅을 안 하고 작업을 했더니 무수한 오류가 쏟아졌다.
    다 수정했는데 막상 디버깅을 돌리니 만족스럽지 않아서 퀘스트를 한 번만 수락가능하게끔 수정하고 싶었다.
    for (int i = 0; i < GameManager.Instance.questManager.questList.Count; i++)
    {
        Quest q = GameManager.Instance.questManager.questList[i];
    
        if (q.isCompleted)
        {
            Utils.ColoredText("[완료] ", ConsoleColor.Gray);
            Console.WriteLine($"{q.title}\n");
        }
        else
        {
            Utils.ColoredText($"[{i + 1}]", ConsoleColor.Yellow);
            Console.WriteLine($"{q.title}\n");
        }
    }​


    Quest.cs에서 완료 표시를 만들어주고

    if (int.TryParse(input, out selection) &&
        selection >= 1 && selection <= GameManager.Instance.questManager.questList.Count)
    {
        Quest selected = GameManager.Instance.questManager.questList[selection - 1];
    
        if (selected.isCompleted)
        {
            Utils.ColoredText("\n이미 완료된 퀘스트입니다.\n", ConsoleColor.Gray);
            Console.ReadKey();
            continue;
        }
    
        ShowQuestDetail(selection - 1);
        break;
    }


    퀘스트 조건이 충족되면 퀘스트 수락이 불가능하도록 수정했다.

    다만 이렇게 했더니 보상도 받기전에 퀘스트 완료화면만 보이게 되었다,.,. 😂🤨
    보상을 받고 나서 완료 화면이 출력되도록 수정해야했다.



    보상을 받았는지 확인해주는 변수를 추가하면 해결이 가능할 것 같았다.
    public bool isAccepted = false; // 퀘스트 수락 여부
    public bool isCompleted; // 퀘스트 완료 여부
    public bool isRewarded = false; // 보상 수령 여부
    if (q.isCompleted && q.isRewarded)
    {
        Utils.ColoredText("[완료] ", ConsoleColor.DarkGray);
        Console.WriteLine($"{q.title}\n");
    }
    else
    {
        Utils.ColoredText($"{i + 1}. ", ConsoleColor.Yellow);
        Console.WriteLine($"{q.title}\n");
    }​
    if (q.isCompleted && !q.isRewarded)
    {
        Console.WriteLine($"\n{q.rewardItem}을(를) 받았습니다!");
        Console.WriteLine($"{q.rewardGold} G를 획득했습니다.");
        GameManager.Instance.player.gold += q.rewardGold;
        q.isRewarded = true;
    }

     

    이렇게 퀘스트 창과 보상받기 창을 나눠 q.isReward를 통해 구분해줬다! 
    이 방법으로 퀘스트 완료 후 보상을 받으면 [완료]로 출력되고 선택이 불가능하게 되었다.

    이렇게 멀고도 험했던 QuestSystem 구현 끝,, 
    문제없이 잘 돌아가는 것 까지 확인했다!!! 

    '게임 기획 > 내일배움캠프' 카테고리의 다른 글

    [TIL] Unity 입문 3  (1) 2025.05.01
    [TIL] Unity 입문 1  (2) 2025.04.29
    [TIL] C# 개념정리  (2) 2025.04.23
    [TIL] Text RPG (Team Project) 2  (0) 2025.04.22
    [TIL] Text RPG (Team Project) 1  (2) 2025.04.21
Designed by Tistory.