ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 2021/10/29 상점구현2
    개발일지/팀GC Defence 2021. 10. 29. 17:17

    새로 개발하는 디펜스 게임의 상점을 구현

     

    조건

    • 유저인포에 상점 무기 목록이 없다면 새로운 무기 목록을 취득
    • 스테이지가 바뀌면 새로운 무기 목록을 취득
    • 스테이지를 클리어하지 않으면 기존 무기 목록 취득

    작업 순서

    1. 유저 인포 클래스와 파싱클래스 무기 목록 리스트 추가(무기 코드를 저장)
    2. 로비 상점 부분에 무기 목록을 표시하는 로직 변경
    3. 유저 인포 클래스에 스테이지 클리어 로직 추가

     

    1. 유저 인포 클래스와 파싱클래스 무기 목록 리스트 추가

    UserInfo.cs

    JsonUserInfo.cs

     

     

    2. 로비 상점 부분에 무기 목록을 표시하는 로직 변경

    Lobby.cs

        public void ShopLoading()
        {
            var prefab = Resources.Load<GameObject>("Prefabs/shopItem");
    
            //유저 인포 shopWeaponRaws리스트에 상점 무기 목록이 들어있는지 확인
            if (UserInfo.GetInstance().shopWeaponRaws.Count == 0)
            {
                //스테이지 클리어 및 첫 시작일 경우 새로운 무기 목록 표시
                ShopNewRandomWeaponList(prefab);
                UserInfo.GetInstance().SaveUserInfo();
            } 
            else
            {
                //유저 인포의 무기 목록을 가져와 표시
                List<JsonWeapon> tmp = new List<JsonWeapon>();
                foreach(var x in UserInfo.GetInstance().shopWeaponRaws)
                {
                    tmp.Add(DataManager.Instance.GetData<JsonWeapon>(x));
                }
                CreateShowItemList<JsonWeapon>(prefab, shopWeapon, tmp);
            }
    
            CreateShowItemList<JsonUpgrade>(prefab, shopUpgrade, DataManager.Instance.GetDatas<JsonUpgrade>().ToList());
            CreateShowItemList<JsonDraw>(prefab, shopDraw, DataManager.Instance.GetDatas<JsonDraw>().ToList());
    
        }
    
        public void ShopNewRandomWeaponList(GameObject prefab)
        {
            var percentages = DataManager.Instance.GetDatas<JsonShopWeaponGradePercentage>();
            List<float> listPercentages = new List<float>();
            foreach (var per in percentages)
            {
                listPercentages.Add(per.percentage);
            }
    
            //6개 아이템만 표시
            for (int i = 0; i < 6; i++)
            {
                var go = Instantiate(prefab);
                var shopItem = go.GetComponent<ShopItem>();
                //데이터 매니저에서JsonWeapon타입만 취득
                var listWeaponItems = DataManager.Instance.GetDatas<JsonWeapon>();
                //shop_weapon_grade_percentage.json파일의 확률을 적용
                var grade = Choose(listPercentages.ToArray());
                //무기 종류가 5개이므로 동일한 확률로 랜덤 적용
                var weaponType = Random.Range(0, 5);
    
    
                foreach (var item in listWeaponItems)
                {
                    if (item.item_grade == grade && item.weapon_type == weaponType)
                    {
                        UserInfo.GetInstance().shopWeaponRaws.Add(item.raw);
                        shopItem.Init(item);
                        shopItem.transform.SetParent(shopWeapon.transform);
                        break;
                    }
                }
    
            }
        }
    
        public float Choose(float[] probs)
        {
    
            float total = 0;
    
            foreach (float elem in probs)
            {
                total += elem;
            }
    
            float randomPoint = Random.value * total;
    
            for (int i = 0; i < probs.Length; i++)
            {
                if (randomPoint < probs[i])
                {
                    return i;
                }
                else
                {
                    randomPoint -= probs[i];
                }
            }
            return probs.Length - 1;
        }
    
        public void CreateShowItemList<T>(GameObject prefab, GameObject tab, List<T> ts) where T : JsonItem
        {
            foreach (T item in ts)
            {
                var go = Instantiate(prefab);
                var shopItem = go.GetComponent<ShopItem>();
                shopItem.Init(item);
                shopItem.transform.SetParent(tab.transform);
                shopItem.btnBuy.onClick.AddListener(() =>
                {
                    if (shopItem.KindOfMoney == Item.KindOfMoney.Gold)
                    {
                        UserInfo.GetInstance().Gold = -shopItem.Price;
                    }
                    else if (shopItem.KindOfMoney == Item.KindOfMoney.RebirthGold)
                    {
                        UserInfo.GetInstance().RebirthGold = -shopItem.Price;
                    }
                    else if (shopItem.KindOfMoney == Item.KindOfMoney.ArtifactSculpture)
                    {
                        UserInfo.GetInstance().ArtifactSculpture = -shopItem.Price;
                    }
    
                    if(item.GetType() == typeof(JsonWeapon))
                    {
                        var weapon = new Weapon((JsonWeapon)(object)item);
                        UserInfo.GetInstance().inventory.Add(weapon);
                        UserInfo.GetInstance().SaveUserInfo();
                    }
                    else if(item.GetType() == typeof(JsonUpgrade))
                    {
    
                    }
                    else if(item.GetType() == typeof(JsonDraw))
                    {
    
                    }
                    ShowMoney();
                });
            }
        }
    
        public void ShowMoney()
        {
            txtGold.text = string.Format("Gold : {0}", UserInfo.GetInstance().Gold);
            txtArtifactSculpture.text = string.Format("ArtifactSculpturel : {0}", UserInfo.GetInstance().ArtifactSculpture);
            txtRebirthGold.text = string.Format("RebirthGold : {0}", UserInfo.GetInstance().RebirthGold);
        }

     

    3. 유저 인포 클래스에 스테이지 클리어 로직 추가

     

     

     

     

    일반적인 게임 재시작

     

    스테이지 클리어

    '개발일지 > 팀GC Defence' 카테고리의 다른 글

    2021/10/27 상점구현  (0) 2021.10.27
Designed by Tistory.