카테고리 없음

내일배움캠프 16일차 TIL Text RPG 팀 프로젝트 6

joseph2518 2024. 10. 4. 21:37

20241004 / Unity_6차   4주차 금요일

 

 

 

과제 발표를 완료했다. 피곤하기도 하고 적용할 피드백 만 적고 가겠다.

 

 

monsters = new Dictionary<MonsterCode, Monster>();

List<MonsterSkillCode> skillSet = new List<MonsterSkillCode>();

//                                                             name              type                level   exp      hp       attack  mattack   def      speed    criRate     skilllist
monsters.Add(MonsterCode.Comm_Slime,        new Monster(  "슬라임",       MonsterType.Common,          1,     5,      10,        1,       0,      0,        1,        5/*%*/,  new MonsterSkillCode[] { MonsterSkillCode.Basic_Slime })); // 튜토리얼 몬스터

monsters.Add(MonsterCode.Comm_Goblin,       new Monster(  "고블린",       MonsterType.Common,          3,    10,      20,        2,       0,      0,        3,        6/*%*/,  new MonsterSkillCode[] { MonsterSkillCode.Basic_Goblin })); // 초기 몬스터
monsters.Add(MonsterCode.Comm_Hobgoblin,    new Monster(  "홉 고블린",    MonsterType.Common,          4,    15,      25,        3,       0,      1,        4,        8/*%*/,  new MonsterSkillCode[] { MonsterSkillCode.Basic_Goblin, MonsterSkillCode.Melee_Goblin })); // 초기 몬스터
monsters.Add(MonsterCode.Spec_GoblinMage,   new Monster(  "고블린 법사",  MonsterType.Special,         5,    20,      15,        1,       8,      0,        3,       10/*%*/,  new MonsterSkillCode[] { MonsterSkillCode.Basic_GoblinMage, MonsterSkillCode.Magic_GoblinMage })); // 초기 특수 몬스터
monsters.Add(MonsterCode.Boss_GoblinLord,   new Monster(  "고블린 로드",  MonsterType.Boss,           10,    30,      50,        5,       5,      2,        4,       10/*%*/,  new MonsterSkillCode[] { MonsterSkillCode.Basic_GoblinLord, MonsterSkillCode.Magic_GoblinLord })); // 초기 보스 몬스터
                                                                                                                                                                                                        
monsters.Add(MonsterCode.Comm_Skeleton,     new Monster(  "스켈레톤",     MonsterType.Common,          7,    15,      30,        4,       0,      1,        2,       12/*%*/,  new MonsterSkillCode[] { MonsterSkillCode.Basic_Skeleton, MonsterSkillCode.Melee_Skeleton })); // 중반부 몬스터
monsters.Add(MonsterCode.Comm_Ghoul,        new Monster(  "구울",         MonsterType.Common,          9,    20,      40,        5,       0,      1,        3,       13/*%*/,  new MonsterSkillCode[] { MonsterSkillCode.Basic_Ghoul, MonsterSkillCode.Melee_Ghoul })); // 중반부 몬스터
monsters.Add(MonsterCode.Comm_DeathKnight,  new Monster(  "데스나이트",   MonsterType.Common,         10,    30,      50,        5,       0,      1,        2,       13/*%*/,  new MonsterSkillCode[] { MonsterSkillCode.Basic_DeathKnight, MonsterSkillCode.Melee_DeathKnight })); // 중반부 몬스터
monsters.Add(MonsterCode.Spec_Lich,         new Monster(  "리치",         MonsterType.Special,        13,    50,      30,        2,      17,      2,        5,       15/*%*/,  new MonsterSkillCode[] { MonsterSkillCode.Basic_Lich, MonsterSkillCode.Magic_Lich, MonsterSkillCode.Magic_Lich2 })); // 중반부 특수 몬스터
monsters.Add(MonsterCode.Boss_Necromancer,  new Monster(  "네크로맨서",   MonsterType.Boss,           20,   100,     100,        9,      10,      3,        7,       20/*%*/,  new MonsterSkillCode[] { MonsterSkillCode.Basic_Necromancer, MonsterSkillCode.Melee_Necromancer, MonsterSkillCode.Magic_Necromancer, MonsterSkillCode.Magic_Necromancer2, MonsterSkillCode.Magic_Necromancer3 })); // 중반부 보스 몬스터

monsters.Add(MonsterCode.Comm_Hatchling,    new Monster(  "해츨링",       MonsterType.Common,         15,    70,      70,       11,       0,      2,       10,       20/*%*/,  new MonsterSkillCode[] { MonsterSkillCode.Basic_Hatchling, MonsterSkillCode.Melee_Hatchling })); // 후반부 몬스터
monsters.Add(MonsterCode.Comm_Wyvern,       new Monster(  "성룡",         MonsterType.Common,         20,   100,      90,        8,       8,      3,       12,       20/*%*/,  new MonsterSkillCode[] { MonsterSkillCode.Basic_Wyvern, MonsterSkillCode.Melee_Wyvern, MonsterSkillCode.Magic_Wyvern })); // 후반부 몬스터
monsters.Add(MonsterCode.Spec_Dragon,       new Monster(  "고룡",         MonsterType.Common,         22,   120,     110,       10,      15,      3,       15,       20/*%*/,  new MonsterSkillCode[] { MonsterSkillCode.Basic_Dragon, MonsterSkillCode.Melee_Dragon, MonsterSkillCode.Magic_Dragon, MonsterSkillCode.Magic_Dragon2 })); // 후반부 특수 몬스터
monsters.Add(MonsterCode.Boss_AncientDragon,new Monster("에인션트 드래곤",MonsterType.Common,         30,   250,     300,       15,      17,      4,       20,       30/*%*/,  new MonsterSkillCode[] { MonsterSkillCode.Basic_AncientDragon, MonsterSkillCode.Melee_AncientDragon, MonsterSkillCode.Magic_AncientDragon, MonsterSkillCode.Magic_AncientDragon2, MonsterSkillCode.Magic_AncientDragon3 })); // 후반부 특수 몬스터

monsters.Add(MonsterCode.Comm_HellHound,    new Monster(  "헬 하운드",    MonsterType.Common,         30,   200,     220,       12,      12,      4,       15,       30/*%*/,  new MonsterSkillCode[] { })); // 최종 일반 몬스터
monsters.Add(MonsterCode.Comm_Demon1,       new Monster(  "하급 마족",    MonsterType.Common,         32,   250,     300,       15,      15,      5,       20,       30/*%*/,  new MonsterSkillCode[] { })); // 최종 일반 몬스터
monsters.Add(MonsterCode.Comm_Demon2,       new Monster(  "중급 마족",    MonsterType.Common,         35,   300,     330,       19,      18,      5,       20,       30/*%*/,  new MonsterSkillCode[] { })); // 최종 일반 몬스터
monsters.Add(MonsterCode.Comm_Demon3,       new Monster(  "상급 마족",    MonsterType.Common,         40,   350,     370,       24,      26,      6,       20,       30/*%*/,  new MonsterSkillCode[] { })); // 최종 일반 몬스터
monsters.Add(MonsterCode.Spec_Cerberus,     new Monster(  "켈베로스",     MonsterType.Special,        45,   400,     500,       30,      33,      8,       20,       35/*%*/,  new MonsterSkillCode[] { })); // 최종 특수 몬스터
monsters.Add(MonsterCode.Boss_Diablo,       new Monster(  "마왕 ",        MonsterType.Boss,           50,  1000,    1000,       50,      60,     10,       25,       40/*%*/,  new MonsterSkillCode[] { })); // 최종 보스 몬스터

대충 읽기전용 Dictionary 형 데이터베이스 변수다.

이렇게 할거면 차라리 외부 파일(.xlsx 등)을 불러오는 식으로 하는게 좋다.

 

 

switch (currentScene)
{
    //Main Scene : 메인 메뉴
    case Scenes.Main_Menu:
        loop = MainScene.MainMenu(out next, keyController);
        break;
    case Scenes.Main_Load:
        loop = MainScene.MainLoad(out next, keyController);
        break;

    //Start Scene : 프롤로그, 튜토리얼 후
    case Scenes.Start_Prolog:
        loop = StartScene.Prolog(out next, keyController);
        break;
    case Scenes.Start_PrologEnd:
        loop = StartScene.PrologEnd(out next, keyController);
        break;

    //Battle Scene : 튜토리얼 배틀, 배틀 프리셋
    case Scenes.Battle_Tutorial:
        loop = BattleScene.LoadTutorialBattle(out next, keyController);
        break;

    //Town Scene : 마을, 장비 상점, 소모품 상점
    case Scenes.Town_Default:
        loop = Town.Default(out next, keyController);
        break;

    //Shop Scene
    case Scenes.Shop_Default:
        loop = ShopScene.Shop(out next, keyController);
        break;
    case Scenes.Shop_BuyPotion:
        loop = ShopScene.BuyPotion(out next, keyController);
        break;
    case Scenes.Shop_SellPotion:
        loop = ShopScene.SellPotion(out next, keyController);
        break;
    case Scenes.Shop_BuyGear:
        loop = ShopScene.BuyGear(out next, keyController);
        break;
    case Scenes.Shop_SellGear:
        loop = ShopScene.SellGear(out next, keyController);
        break;

    //Guild Scene
    case Scenes.Guild_Hall:
        loop = GuildScene.GuildHall(out next, keyController);
        break;
    case Scenes.Guild_Quest:
        loop = GuildScene.GuildQuest(out next, keyController);
        break;
    case Scenes.Guild_Mercenary:
        loop = GuildScene.GuildMercenary(out next, keyController);
        break;
    case Scenes.Guild_Inn:
        loop = GuildScene.GuildInn(out next, keyController);
        break;

    //PlayerMenu Scene : 상태창, 인벤토리, 장비, 스킬, 저장
    case Scenes.PlayerMenu_Menu:
        loop = PlayerMenuScene.GameMenu(out next, keyController);
        break;
    case Scenes.PlayerMenu_SaveData:
        loop = PlayerMenuScene.DataSaveScene(out next, keyController);
        break;

    //Dungeon Scene : 던전 스테이지 분기
    case Scenes.Dungeon_Default:
        if (DungeonScene.CanIntoDungeon(keyController))
        {
            loop = DungeonScene.ChallengeToDungeon(out next, keyController);
        }
        else
        {
            loop = true;
            next = Scenes.Town_Default;
        }
        break;

    //Game Over Scene
    case Scenes.Gameover_Default:
        loop = GameoverScene.GAMEOVER(out next, keyController);
        break;


    default:
        return false; //유효하지 않은 씬
}

씬 매니저에서 씬을 불러오는 부분이다.

 

이것도 next Scene(enum Scenes)을 받을 게 아니라 델리게이트를 활용하여 대리자를 직접 참조한다면

저 무한정 길어질 수밖에 없는 switch문을 안써도 된다.

 

물론 나는 씬 별 호출을 한번에 확인할 수 있는 저것도 마냥 나쁘지만은 않다고 본다.

 

 

 

 

또 아이템이나 스킬, 스테이지 셀렉 창 등 리스트 UI를 띄울 일이 많았는데

각자 입력에 대한 처리가 조금씩 다르다고 코드를 전부 따로 작성한 것도 아쉬웠다.

 

어차피 배우려고 하는 건데 기를 쓰고라도 함수 형식으로 만들어서 재활용했어야 했다.

 

 

 

 

 

사실 아직까지도 공을 많이 들인 개인과제를 쳐내고 처음부터 다시 만든게 마음엔 들지 않는다.

 

하지만 개인과제에 비해 놀라울 정도로 코드가 깔끔해 졌고

튜터님 피드백을 수용 안한 게 더 많다고 하더라도 이전보다 개선된 점이 한눈에 보인다.

 

개인과제를 이어서 했다면 또 기능구현이 먼저라고 리팩터링 전혀 안했겠지.

 

 

 

 

 

다른 조의 발표를 보면서 UML 다이어그램의 중요성을 인식하게 됐다.

 

당장 내가 클래스간 간섭을 최소화하고 간결하게 짰더라도 그 관계를 한눈에 확인할 수는 없다.

 

그럴 때 UML 다이어그램이 있다추상적인 아이디어와 소프트웨어 시스템을 쉽게 시각화할 수 있다.

 

그건 심지어 생판 남이 보더라도 구조가 한눈에 들어온다는 장점이 있다.

 

 

 

 

다음 프로텍트에서는 이런 피드백을 확실히 적용해 보아야 겠다.