오늘의 학습 키워드
struct, StackOverFlow
공부한 내용
리팩토링 구상
리팩토링을 하기 전에 구조 부터 문제라는 생각이 들어 간단한 시스템 흐름도를 만들어 보았다.
아래 그림으로 보면 별 문제가 없어보이지만..
문제 1 : 너무 많은 gameState
모든 상태를 gameState에 넣어놓고 현재 gameState에 따라 함수로 진행하는 방법이다.
이러면 분기가 하나 늘어날 때마다 gameState가 많아질 것이며 코드의 복잡도가 더 증가할 것이라고 판단했다.
이것에 대한 내가 생각한 아이디어 중 하나는 다음 단계로 이동할 때 현재의 씬을 스택에 담는 것이다.
스택에 담는다면 나가기 버튼을 눌렀을 때도 이전 씬을 담으니까 그 씬을 돌려주면 된다.
// 현재 게임 상태
GameState gameState;
// UI랑 게임 플레이랑 나눌 필요성이 있어보임
// 문제점 : 게임 스테이트가 너무 많음
// 아이디어 1: 연결 되어있는 것이라면 Stack으로 씬을 담는 것
public enum GameState
{
Town,
State,
Inventory,
Equipment,
ItemSort,
Shop,
Purchase,
Sell,
Dungeon,
INN,
}
public void Start()
{
JsonUtility.Save(character.Info);
switch (gameState)
{
case GameState.Town:
EnterTown();
break;
case GameState.State:
ShowState();
break;
case GameState.Inventory:
ShowInventory();
break;
case GameState.Equipment:
ManageEquiment();
break;
case GameState.ItemSort:
ItemSort();
break;
case GameState.Shop:
ShowShop();
break;
case GameState.Purchase:
PurchaseItem();
break;
case GameState.Sell:
SellItem();
break;
case GameState.Dungeon:
EnterDungeon();
break;
case GameState.INN:
EnterINN();
break;
default:
break;
}
}
gameState를 메인에서 선택하는 5가지로 줄이니 우측 스크롤 바 쪽에 빨간줄을 여럿 볼 수 있다. ㅠㅠ
나의 과오니 내가 치워야지..
* 추가 : 어차피 맨 처음에 마을으로 가니까 gameState가 꼭 필요하지 않다고 판단해서 gameState 관련 로직을 제거하게 됐다.
gameState 관련 로직을 빼도 나가기가 잘 되는 모습
문제 1-1 : 호출 스택 문제 (스택 오버 플로우)
만들면서 뭔가 쎄한 느낌이 들어서 확인해보니 마을로 가지 않고서는 호출 스택을 탈출할 수 없다는 문제가 있었다.
'함수 호출으로 넘어가는 것이 문제인가?' 라는 생각이 들어 바로 적용해보기로 했다.
그럼 그렇지 내가 너무 복잡하게 생각해서 돌아가는 경우였다. 그냥 return 하면 되는 쉬운 방법이 있었다니!
함수에서 다른 함수로 이동할 때 다시 이전 함수로 돌아가는 경우라면 그냥 return을 쓰면 된다. 어렵게 생각하지 말자!
문제 2 : gameState와 맞물려 있는 안내 UI
일단 만들고 나중에 고치자고 생각했지만 만들면서도 계속 반복되는 게 많아 불편한 마음이 들었던 UI도 문제였다.
아래의 2개의 코드는 각각 마을과 아이템 장착 관리인데 비슷한 부분이 많아 변수를 넘겨주는 방식으로 통합하려 한다.
Console.Write
(
"스파르타 마을에 오신 여러분 환영합니다\n" +
"이곳에서 던전으로 들어가기 전 활동을 할 수 있습니다.\n\n" +
"1. 상태보기\n" +
"2. 인벤토리\n" +
"3. 상점\n" +
"4. 던전입장\n" +
"5. 휴식하기\n" +
"\n" +
"원하시는 행동을 입력해주세요.\n" +
">> "
);
Console.Write
(
titleStr +
"보유 중인 아이템을 관리할 수 있습니다.\n\n" +
"[아이템 목록]\n" +
itemListStr +
choiceStr +
"원하시는 행동을 입력해주세요.\n" +
">> "
);
형식이 비슷하니 하나에서 다 출력하도록 바꿨다.
void WriteUI(string title, string introduction, string result, string choice, string inputStr)
{
Console.WriteLine(title + introduction + result + choice + inputStr);
}
문제 3 : 너무 많은 아이템 클래스
이전엔 Item 클래스를 상속 받는 객체를 따로 생성하여 받는 방식으로 구현 하였는데 객체가 생길 때마다 생성 해야 되는 문제가 있었다.
이미 Item 클래스에 SetInfo라는 함수가 있으니 생성자로 접근하여 세팅하도록 바꾸려고 한다.
불필요한 객체 생성을 줄이고 생성자로 정보를 넘겼다.
public ItemShop()
{
ItemList.AddRange(new Item[]
{
new Item(ItemType.Armor, "수련자 갑옷", 0, 5, "수련에 도움을 주는 갑옷입니다.", 1000),
new Item(ItemType.Armor, "무쇠갑옷", 0, 5, "무쇠로 만들어져 튼튼한 갑옷입니다." , 600),
new Item(ItemType.Armor, "스파르타의 갑옷", 0, 15, "스파르타의 전사들이 사용했다는 전설의 갑옷입니다.", 3500),
new Item(ItemType.Weapon, "낡은 검", 2, 0, "쉽게 볼 수 있는 낡은 검입니다.", 600),
new Item(ItemType.Weapon, "청동 도끼", 5, 0, "어디선가 사용됐던 것 같은 도끼입니다.", 1500),
new Item(ItemType.Weapon, "스파르타의 창", 7, 0, "스파르타의 전사들이 사용했다는 전설의 창입니다.", 2400)
});
}
문제 4 : 변수 접근 제한
이전에 그냥 Get Set 프로퍼티로 접근했는데
데이터 저장을 위해 프로퍼티로 넘긴다고 하면 Set은 Private로 해주고 실수 방지를 위해 변수가 아닌 함수로만 통해 접근하는 것이 좋아 보였다.
구조체도 인터페이스 상속이 가능하다는 것을 이번에 튜터님께 질문 하면서 알게 되었다.
추가로 함수도 사용 가능하다.
public struct ItemInfo : IItem
{
public ItemType Type { get; private set; }
public string Name { get; private set; }
public int AttackModifier { get; private set; }
public int DefenseModifier { get; private set; }
public string Description { get; private set; }
public int Price { get; private set; }
public bool IsEquiped { get; private set; }
public void SetInfo(ItemType type, string name, int attack, int defense, string description, int price, bool isEquiped)
{
Type = type;
Name = name;
AttackModifier = attack;
DefenseModifier = defense;
Description = description;
Price = price;
IsEquiped = isEquiped;
}
public void Equip(bool isEquip)
{
IsEquiped = isEquip;
}
}
오늘의 회고
오늘은 리팩토링 하는 시간을 가졌다. 리팩토링을 끝내고 리드미 파일도 정리하고 시간이 남으면 알고리즘도 공부해보려 했는데 시간이 부족해 리팩토링도 다 하지 못했다. 아쉽지만 오히려 혼자 고민 해본 것과 튜터님께 질문 드린 것을 통해 배운 것이 많아서 아쉬울 건 없는 하루였던 것 같다.
내일은 리팩토링(데이터 저장, 상태 콜백, 클래스 나누기)를 하고 리드미 파일을 작성하려고 한다. 내일도 파이팅!
'스파르타 Unity 1기' 카테고리의 다른 글
내일배움캠프 15일차 TIL - TextRPG 팀 과제 (0) | 2023.08.28 |
---|---|
내일배움캠프 14일차 TIL - TextRPG 리팩토링 2 (0) | 2023.08.25 |
내일배움캠프 12일차 TIL - TextRPG 만들기 4 (0) | 2023.08.23 |
내일배움캠프 11일차 TIL - TextRPG 만들기 3 (0) | 2023.08.22 |
내일배움캠프 10일차 TIL - TextRPG 만들기 2 (0) | 2023.08.21 |