티스토리 뷰
# 어제에 이어 데이터 연동 부분들을 수정 중이다. 난이도 상승에 따른 재화 수급은 수정했으나
아이탬 수급에 문제가 있었다.
아이템 데이터 테이블 먼저 수정했다.
난이도(difficulty)에 따른 드랍되는 아이템 수를 data로 정의하고 어제 만들어 놓은 DataManager에서
반환 받는 로직으로 수정했다.
enum 타입으로 아이템의 등급과 타입을 정해준 후 itemCounts 딕셔너리에 넣어줬다
* private Dictionary<eDropItemGrade, int> itemCounts = new Dictionary<eDropItemGrade, int>();
MakeItemForChest 메서드에서 인자로 들어온 chestName은 두가지로 분류하면 된다
1.Wood,Iron,Gold (Gold,Ether,Equipment 드랍)
2.Diamond(Gold,Ehter,Equipment,Relic,Weapon 드랍)
MakeChest 메서드에서 정해진 stage,step 필드를 기준으로 chest_data의 difficulty에 접근 후
나올 수 있는 아이템 등급의 갯수를 변수에 담아줬다
var WoodCount=DataManager.Instance.GetReturnChestDicValue(stepNum).Wood;
var IronCount = DataManager.Instance.GetReturnChestDicValue(stepNum).Iron;
var GoldCount = DataManager.Instance.GetReturnChestDicValue(stepNum).Gold;
var DiamondCount = DataManager.Instance.GetReturnChestDicValue(stepNum).Diamond;
만들어 둔 딕셔너리에 등급은 key, 해당 아이템 갯수들은 value에 담아주었다 (디버그 창에서 확인 할 수 있도록 디버그도 철저하게 해야했다)
var WoodCount=DataManager.Instance.GetReturnChestDicValue(stepNum).Wood;
var IronCount = DataManager.Instance.GetReturnChestDicValue(stepNum).Iron;
var GoldCount = DataManager.Instance.GetReturnChestDicValue(stepNum).Gold;
var DiamondCount = DataManager.Instance.GetReturnChestDicValue(stepNum).Diamond;
Debug.LogFormat("Wood:{0},Iron:{1},Gold:{2},Dia:{3}",WoodCount,IronCount,GoldCount,DiamondCount);
이제 잘 담겨진 data들을 foreach문을 반복하며 instantaite 해주었다
아이템의 위치를 잡는 로직과 스프라이트를 교체해주는 로직도 담아줬다
foreach (var itemCount in this.itemCounts)
{
eDropItemGrade grade = itemCount.Key;
int count = itemCount.Value;
for (int i = 0; i < count; i++) //ex) Wood 3, Iron 1
{
var dropItemGo = Instantiate(this.dropItem, callPosition);
Vector3 playerPosition = callPosition.position;
float radius = 2f;
Vector3 randomPosition = playerPosition + Random.insideUnitSphere * radius;
dropItemGo.transform.position = randomPosition;
var ranTypeNum = Random.Range(0, 4);
var ranType = (eDropItemType)ranTypeNum;
dropItemGo.name = grade + "_" + ranType;
var resultSp=AtlasManager.instance.GetAtlasByName("UIEquipmentIcon").GetSprite(dropItemGo.name);
Debug.LogFormat("{0}",resultSp);
dropItemGo.GetComponent<SpriteRenderer>().sprite=resultSp;
}
}
DiamondChest는 다른 경우였다. step(난이도)를 그대로 인자로 넘겨준다면 key를 찾지못한다(어제 재화 수급 버그와 같은문제다)
데이터 테이블에서 보스들은 100,200,300,400으로 정의하고 코드에서는 해당 stage의 *100을 해주고 찾아줬다
var stage = InfoManager.instance.dungeonInfo.CurrentStageInfo;
var data = DataManager.Instance.GetReturnChestDicValue(stage * 100); //100,200,300,400
var bossStage = data.difficulty;
*아이템 생성 전체코드
private void MakeItemForChest(Transform callPosition, string chestName) //Wood,Iron,Gold or Diamond
{
this.MakeCoinInDungeon(callPosition);
this.MakeEtherInDungeon(callPosition);
if (chestName == "Wood_Chest"||chestName=="Iron_Chest"||chestName=="Gold_Chest")
{
//difficulty
var stepNum = this.go.GetComponent<NPCController>().stepNum;
Debug.LogFormat("<color=red>ItemStep:{0}</color>",stepNum);
//GradeCount 등급별 갯수
var WoodCount=DataManager.Instance.GetReturnChestDicValue(stepNum).Wood;
var IronCount = DataManager.Instance.GetReturnChestDicValue(stepNum).Iron;
var GoldCount = DataManager.Instance.GetReturnChestDicValue(stepNum).Gold;
var DiamondCount = DataManager.Instance.GetReturnChestDicValue(stepNum).Diamond;
Debug.LogFormat("Wood:{0},Iron:{1},Gold:{2},Dia:{3}",WoodCount,IronCount,GoldCount,DiamondCount);
this.itemCounts.Clear();
this.itemCounts.Add(eDropItemGrade.Wood, WoodCount);
this.itemCounts.Add(eDropItemGrade.Iron, IronCount);
this.itemCounts.Add(eDropItemGrade.Gold, GoldCount);
this.itemCounts.Add(eDropItemGrade.Diamond, DiamondCount);
foreach (var itemCount in this.itemCounts)
{
eDropItemGrade grade = itemCount.Key;
int count = itemCount.Value;
for (int i = 0; i < count; i++) //ex) Wood 3, Iron 1
{
var dropItemGo = Instantiate(this.dropItem, callPosition);
Vector3 playerPosition = callPosition.position;
float radius = 2f;
Vector3 randomPosition = playerPosition + Random.insideUnitSphere * radius;
dropItemGo.transform.position = randomPosition;
var ranTypeNum = Random.Range(0, 4);
var ranType = (eDropItemType)ranTypeNum;
dropItemGo.name = grade + "_" + ranType;
var resultSp=AtlasManager.instance.GetAtlasByName("UIEquipmentIcon").GetSprite(dropItemGo.name);
Debug.LogFormat("{0}",resultSp);
dropItemGo.GetComponent<SpriteRenderer>().sprite=resultSp;
}
}
}
if (chestName == "Diamond_Chest") //BOSSCHSET
{
this.MakeWeaponInDungeon(callPosition);
this.MakeRelicInDungeon(callPosition);
var stage = InfoManager.instance.dungeonInfo.CurrentStageInfo;
var data = DataManager.Instance.GetReturnChestDicValue(stage * 100); //100,200,300,400
var bossStage = data.difficulty;
Debug.LogFormat("{0}", bossStage);
var WoodCount = DataManager.Instance.GetReturnChestDicValue(bossStage).Wood;
var IronCount = DataManager.Instance.GetReturnChestDicValue(bossStage).Iron;
var GoldCount = DataManager.Instance.GetReturnChestDicValue(bossStage).Gold;
var DiamondCount = DataManager.Instance.GetReturnChestDicValue(bossStage).Diamond;
Debug.LogFormat("Wood:{0},Iron:{1},Gold:{2},Dia:{3}", WoodCount, IronCount, GoldCount, DiamondCount);
this.itemCounts.Clear();
this.itemCounts.Add(eDropItemGrade.Wood, WoodCount);
this.itemCounts.Add(eDropItemGrade.Iron, IronCount);
this.itemCounts.Add(eDropItemGrade.Gold, GoldCount);
this.itemCounts.Add(eDropItemGrade.Diamond, DiamondCount);
foreach (var itemCount in this.itemCounts)
{
eDropItemGrade grade = itemCount.Key;
int count = itemCount.Value;
for (int i = 0; i < count; i++) //ex) Wood 3, Iron 1
{
var dropItemGo = Instantiate(this.dropItem, callPosition);
Vector3 playerPosition = callPosition.position;
float radius = 2f;
Vector3 randomPosition = playerPosition + Random.insideUnitSphere * radius;
dropItemGo.transform.position = randomPosition;
var ranTypeNum = Random.Range(0, 4);
var ranType = (eDropItemType)ranTypeNum;
dropItemGo.name = grade + "_" + ranType;
var resultSp = AtlasManager.instance.GetAtlasByName("UIEquipmentIcon").GetSprite(dropItemGo.name);
Debug.LogFormat("{0}", resultSp);
dropItemGo.GetComponent<SpriteRenderer>().sprite = resultSp;
}
}
}
}
*Test (1Stage 1Step~1Stage Boss)
1Stage 1Step(Wood *2)
1Stage 2Step(Wood *3, Iron*1)
1Stage Boss(Wood *4, Iron *2)
*기존에 만들어놓은 factory pattern이 문제가 됐었다. 매우 비효율 적인 방법으로 구현을 하고있었다.
처음 만들때가 가장 중요함을 많이 느끼고 있다.
코드의 유지보수가 아주 중요함도 많이 배웠다.
팀원들과 소통이 어렵지 않으려면 코드의 가독성이 좋아야한다. 기존에 만들어 놓았던 코드를 보니 만든 나도
다시 해석하며 읽어야하는 경우가 많이 생기고있다. 코드를 써내려가기 전 어떻게 동작하고 어떻게 유지보수 할지
좀 더 신중하게 생각 하고 코드를 써야겠다.
'게임클라이언트 프로그래밍 > Guns N Rachel's' 카테고리의 다른 글
Inventory에서 Item 버리기 버그 수정 (0) | 2023.05.21 |
---|---|
UIShop Cell 생성 로직 변경, 일정 확률로 소모아이템 획득 추가, 히든룸 재화+아이템 획득 버그 수정 (0) | 2023.05.19 |
히든룸 HiddenChest - Gold,Ether 수급 버그 수정 (0) | 2023.05.17 |
스테이지 진행에 따른 재화 수급량 (0) | 2023.05.16 |
아이템 생성(플레이어 인벤토리 버리기) 버그 수정 (0) | 2023.05.15 |