1인 개발/나홀로 성 지키기

나홀로 성 지키기 개인 프로젝트 11일차

잼잼재미 2024. 4. 1. 17:00

구현 기능


1. 스킬 장착 구현

 

Slot을 클릭하면 정보 UI가 생성되고, 장착을 클릭하면 장착 스킬이 변경 되도록 구현

 

 

https://kkln2486.tistory.com/183

 

인벤토리 만들기

인벤토리 만들기 1. 인벤토리 스크롤 만들기 https://kkln2486.tistory.com/180 인벤토리 스크롤 설정 (Scroll View, Grid Layout Group) Scroll View : 스크롤 기능 Grid Layout Group : 자식 오브젝트들을 일정하게 정렬 설

kkln2486.tistory.com

 

 

2. 스킬 뽑기 구현


 

  • Coin으로 스킬 뽑기를 구매
  • 가지고 있는 구매 횟수로 스킬을 뽑을 수 있음
  • 가지고 있는 스킬일 경우, CurrentUpgradeConut에 +1을 해서 MaxUpgradeCount가 되면 자동 강화

 

public void SkillIInfoButton()
    {
        if(GameManager.I.DataManager.GameDataSO.SkillDrawCount < 1)
        {
            GameManager.I.SoundManager.StartSFX("ButtonClickMiss");
            return;
        }

        GameManager.I.SoundManager.StartSFX("GetSkill");
        GameManager.I.DataManager.GameDataSO.SkillDrawCount--;
        UpdateSkillDrawCount();
        int random1 = Random.Range(0, 4); // Skill Type
        int random2 = Random.Range(1, 101); // Rank
       
        if(random1 == 0) // Melee
        {
            int length = _meleeSkillData.Length;

            while (true)
            {
                int random3 = Random.Range(0, length);

                if(_meleeSkillData[random3].Rank == SkillSO.SkillRank.S)
                {
                    if (random2 >= 1 && random2 <= 10)
                    {
                        _getSkillSO = _meleeSkillData[random3];
                        break;
                    }
                    else continue;
                }
                else if(_meleeSkillData[random3].Rank == SkillSO.SkillRank.A)
                {
                    if (random2 >= 11 && random2 <= 37) // A
                    {
                        _getSkillSO = _meleeSkillData[random3];
                        break;
                    }
                    else continue;
                }
                else
                {
                    if (random2 >= 38 && random2 <= 100) // A
                    {
                        _getSkillSO = _meleeSkillData[random3];
                        break;
                    }
                    else continue;
                }
            }
        }
        else if(random1 == 1) // Ranged
        {
            int length = _rangedSkillData.Length;

            while (true)
            {
                int random3 = Random.Range(0, length);

                if (_rangedSkillData[random3].Rank == SkillSO.SkillRank.S)
                {
                    if (random2 >= 1 && random2 <= 10)
                    {
                        _getSkillSO = _rangedSkillData[random3];
                        break;
                    }
                    else continue;
                }
                else if (_rangedSkillData[random3].Rank == SkillSO.SkillRank.A)
                {
                    if (random2 >= 11 && random2 <= 37) // A
                    {
                        _getSkillSO = _rangedSkillData[random3];
                        break;
                    }
                    else continue;
                }
                else
                {
                    if (random2 >= 38 && random2 <= 100) // A
                    {
                        _getSkillSO = _rangedSkillData[random3];
                        break;
                    }
                    else continue;
                }
            }
        }
        else // Area
        {
            int length = _areaSkillData.Length;

            while (true)
            {
                int random3 = Random.Range(0, length);

                if (_areaSkillData[random3].Rank == SkillSO.SkillRank.S)
                {
                    if (random2 >= 1 && random2 <= 10)
                    {
                        _getSkillSO = _areaSkillData[random3];
                        break;
                    }
                    else continue;
                }
                else if (_areaSkillData[random3].Rank == SkillSO.SkillRank.A)
                {
                    if (random2 >= 11 && random2 <= 37) // A
                    {
                        _getSkillSO = _areaSkillData[random3];
                        break;
                    }
                    else continue;
                }
                else
                {
                    if (random2 >= 38 && random2 <= 100) // A
                    {
                        _getSkillSO = _areaSkillData[random3];
                        break;
                    }
                    else continue;
                }
            }
        }

        _getSkillSO.CurrentUpgradeCount++;
        _getSkillTagText.text = _getSkillSO.Tag;
        _getSkillImage.sprite = _getSkillSO.Icon;

        if (_getSkillSO.Rank == SkillSO.SkillRank.B)
        {
            _getSkillRankText.color = new Color(25 / 255f, 144 / 255f, 0 / 255f, 255 / 255f);
        }
        else if (_getSkillSO.Rank == SkillSO.SkillRank.A)
        {
            _getSkillRankText.color = new Color(255 / 255f, 16 / 255f, 0 / 255f, 255 / 255f);
        }
        else
        {
            _getSkillRankText.color = new Color(244 / 255f, 255 / 255f, 40 / 255f, 255 / 255f);
        }
        _getSkillRankText.text = _getSkillSO.Rank.ToString();

        _getSkillDescriptionText.text = _getSkillSO.Description;
        if(!_getSkillSO.IsGet)
        {
            _playerSO.SkillInventroy.Add(_getSkillSO);
            _getSkillSO.IsGet = true;
            _text1.text = "새로운 스킬을 뽑았습니다.";
            _text2.text = "";
        }
        else
        {
            if(_getSkillSO.CurrentUpgradeCount < _getSkillSO.MaxUpgradeCount)
            {
                _text1.text = "이미 획득한 스킬을 뽑았습니다.";
                _text2.text = "같은 스킬을 " + (_getSkillSO.MaxUpgradeCount - _getSkillSO.CurrentUpgradeCount).ToString() + "번 더 뽑으면 자동 강화합니다.";
            }
            else
            {
                _getSkillSO.CurrentUpgradeCount = _getSkillSO.CurrentUpgradeCount - _getSkillSO.MaxUpgradeCount + 1;
                _getSkillSO.MaxUpgradeCount *= 2;
                _getSkillSO.Level++;
                _text1.text = "이미 획득한 스킬을 뽑았습니다.";
                _text2.text = "스킬을 자동 강화했습니다.";
                UpgradeSkill();
            }
        }

        _skillInfoPanel.SetActive(true);
    }

 

  • 랜덤 함수를 사용해서 1 ~ 100의 자연수 중, 랜덤하게 가지고와서 랭크에 따라 뽑기 확률을 설정
  • 랜덤 함수를 사용해서 0 ~2 의 자연수 중, 랜덤하게 가지고와서 Melee, Ranged, Area 스킬을 결정
  • while문을 사용해서 결정된 랭크가 나올때까지 반복하도록 구현

 

 

회고


인벤토리를 구현하는 것이 생각보다 많이 어려웠다. 예전에 강의를 듣고 구현해서 블로그에 정리한 적이 있었는데, 인벤토리 부분은 개발하는 게임마다 구현 방법이 많이 다르기 때문에 어려웠다. 그래서 이번 기회에 수정하여 정리했다. 그리고 원래 기획 했던 인벤토리는 동일한 아이템이 있어도 각각 Slot을 차지하고, 3개의 동일한 레벨의 같은 아이템이 있다면 강화를 할 수 있도록 하는 것이다. 하지만 인벤토리를 SkillSO의 List로 만들어서 데이터를 공유하기 때문에 같은 아이템이라면 모든 정보가 같을 수 밖에 없었다. 초반부터 스킬을 SO로 관리했기 때문에 수정이 어려워서 강화 시스템을 바꾸도록 결정했다. 인벤토리에는  각각 스킬이 최대 1개만 존재 가능하며, 동일한 스킬을 얻었을 경우, 경험치처럼 UpgradeCount를 얻게해서 자동으로 강화가 되는 시스템으로 변경했다.