ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 2024.3.5
    TIL 2024. 3. 5. 20:39

    팀프로젝트가 끝났습니다.

     

    한동안 TIL을 적지 않았는데요..

    사실 뭘 적어야할지 모르겠어서.. 그렇습니다..

     

    굉장히 굉장히 작업이 늦어지면서 주말도 일을 하게 되었는데요.

    거기다가 월요일 오후 9시 제출인데 8시에 마무리되어서 더 힘들었던 것 같습니다.

    심지어 제출하기 전 7시 반쯤에 발표자로 선정되면서 더 할일이 생기면서 바빴던 것 같습니다.

     

    오늘 발표 끝냈기 때문에 작업한 것들 정리하는 겸 TIL 적어보도록 하겠습니다.

     


     

    1. Quest

    만들기 가장 힘들었던 Quest 부분입니다.

     

    저번에 적은 것과 조금 구조가 달라졌습니다.

     

    QuestInfo -> QuestInstant -> QuestManager

    퀘스트 정보를 가지고 그것들 불러오는 Instant, 그리고 퀘스트 생성을 하는 QuestManager

    였는데요.

     


     

    QuestInfoSO : 퀘스트 정보가 들어있지만 외부에서 변경되어야하는 정보는 들어있지 않습니다.

    public QuestType questTypes;
    public int ID;
    public string title;
    public string description;
    public int reward;

    보상은 간단하게 코인을 지급하도록 했습니다.

    코인 외 다른 아이템이 필요할 경우에는 빼고 다른 곳에 같이 넣어줘야합니다.

    QuestType은 사용되지 않았지만, 몬스터 처치 뿐만 아니라 어떠한 행동을 하는 퀘스트도 만들어보고 싶어서 넣어둔 것입니다.

     


     

    Quest : QuestInfoSO를 가지고 있으며, Quest에서 변할 수 있는 부분(퀘스트 클리어 여부, 퀘스트 상태 등)과 퀘스트 클리어 목표를 넣어주었습니다.

    public QuestInfoSO questInfoSO;
    public readonly int goal_count;
    
    //서버에서 받아오는 것 -> 따로 존재해야함
    public int kill_count;
    public QuestClearState state;
    public bool clear;
    
    public Quest(int index)
    {
        questInfoSO = Resources.Load<QuestInfoSO>($"QuestSO/Quest{index}");
        goal_count = QuestGoal(questInfoSO.ID);
        kill_count = 0;
        state = QuestClearState.NotAccepted;
        clear = false;
    }
    
    public int QuestGoal(int id)
    {
        int count = 0;
        switch (id)
        {
            case 0:
                count = 5;
                break;
            case 1:
                count = 3;
                break;
        }
        return count;
    }

    퀘스트마다 목표하는 값이 다르기 때문에 SO에 있는 ID를 이용해서 목표값을 설정해주었습니다.

    목표값은 변하면 안되기 때문에 readonly를 사용해주었습니다.

     

    그 외에 변해도 되는 변수들을 설정해서 퀘스트를 완성해주었습니다.

     


     

    QuestManager : 퀘스트 생성 및 생성된 퀘스트 관리 등 퀘스트와 외부가 연결되도록 만들어줍니다.

    public Quest[] Quests;
    public Dictionary<int, Quest> DicAcceptedQuests = new Dictionary<int, Quest>();

    퀘스트를 생성해서 배열에 넣어줍니다.

    배열을 이용한 이유는 생성되어서 플레이어에게 제공되는 퀘스트의 갯수가 정해져있기 때문입니다.

    길이가 가변적이지는 않으나, 관리하기에는 더 쉬울 것 같아서 선택했습니다.

     

    딕셔너리는 플레이어가 퀘스트를 수락할 경우에 수락된 퀘스트가 저장되는 곳입니다.

    key와 value로 이루어져 있어서 key를 배열의 인덱스로 저장하게 된다면 UI에서 수락한 퀘스트를 가져오는 것이 편할 것이라는 생각으로 사용해주었습니다.

     

    그렇기 때문에 인덱스가 고정되어있는(크기가 변하지 않는) 배열과 연결하여 사용하기 좋을 것 같았습니다.

     

    이렇게 구성되어있는 퀘스트를 사용해주기 위해서

    UI에서 선택하면 Quest의 상태가 수락 상태이면서 Dictionary에 저장되게 하는 함수,

    몬스터 처치 시 Dictionary에 있는 함수의 kill_count가 증가하는 함수,

    퀘스트 클리어 시 플레이어에게 보상을 주는 함수

     

    다른 객체들과 연결하는 함수들을 만들어서 퀘스트를 관리해주었습니다.

     


     

    전반적으로 맡은 부분에서 아쉬웠던 점은

    퀘스트에서는 더 다양한 퀘스트를 만들지 못했다는 점과 퀘스트 클리어 시 안내 팝업을 생성 안한 것. 그리고 퀘스트 수락하게 되면 따로 UI로 띄워주지 않은 점이 있습니다.

     

    팝업UI에서는 PopupUIManager을 만들어서 Resources.Load를 통해 UI를 가져오는 것은 잘 했으나, 가져온 UI를 따로 관리하지 않은 점. 즉, PopupUIManager을 통해 생성된 UI들은 생성한 cs에서 관리하게 두었습니다. 추후에 Dictionary를 통해서 관리를 해볼까했는데.. 팝업UI 뿐만 아니라 다른 UI요소들도 생성하는 것으로 사용해버려서.. PopupUIManager에서 관리하기가 어려워졌습니다..

     

    또한, 팝업UI 생성할 때 다른 분께서 조준점을 만드신다고 GUI가 아니라 따로 Canvas 작업을 하시면서 팝업UI에서 선택이 불가하게되는 현상이 일어났습니다.

    해결 방법은 조준점처럼 선택되면 안되는 UI의 경우 Raycast Target = false 해주거나

    팝업 UI Canvas의 Sort Order를 증가시켜주면 됩니다.

    (이건 트러블 슈팅에 쓸만한데.. 까먹고 있다가 지금 적네여 ㅎㅎ)

    GameObject pop = new GameObject();
    pop.GetComponent<Canvas>().sortingOrder = 10;

     

    'TIL' 카테고리의 다른 글

    2024.3.7  (1) 2024.03.07
    2024.3.6  (3) 2024.03.06
    2024.2.28  (0) 2024.02.28
    2024.2.27  (0) 2024.02.27
    2024.2.26 - UIManager  (1) 2024.02.26
Designed by Tistory.