[StarChaser] 로그라이크 게임 프로젝트

[유니티/C#] 클래스에서 원하는 조건의 랜덤 항목 뽑아오기

진서박 2023. 5. 29. 02:48
반응형

팀의 기획자가 "랜덤으로 스킬을 3가지 뽑아달라" 고 요청했다. 

기획자가 써준 플로우 차트

이런 흐름으로, 원하는 조건에 맞는 스킬을 뽑아올 수 있어야 했다.

 

이전에 작성한 글에서 csv파일을 읽어와 Skill 클래스에 저장했으니, 저장한 Skill들을 바탕으로 정보를 비교해 가져오기만 하면 된다.

 

.

.

.

.

하지만 생각보다 로직을 짜기 힘들어서 고생 깨나 했다.

 

public List<Skill> GetRandomSkills(Dictionary<int, int> friendshipDic, List<Skill> skillList, int count)
    {
    	// 랜덤으로 선택된 스킬을 임시 저장할 리스트
        List<Skill> chosenSkills = new List<Skill>();
		
        // count 개수만큼 스킬을 선택할 때까지 반복
        while (chosenSkills.Count < count)
        {
            // skillList에서 랜덤하게 하나의 스킬을 선택하여 할당
            Skill chosenSkill = skillList[Random.Range(0, skillList.Count)];

            // 이미 선택된 스킬들 중에서 SkillGroupID가 중복되는 스킬이 있는 경우 스킬 다시 선택
            if (chosenSkills.Any(skill => skill.SkillGroupID == chosenSkill.SkillGroupID))
            {
                continue; // 중복된 경우 다시 스킬 선택
            }

            // 선택된 스킬의 SkillLevel이 해당 GodID의 호감도보다 큰 경우, 호감도 확인
            if (chosenSkill.SkillLevel > friendshipDic[chosenSkill.GodID])
            {
                // 호감도가 충족되는 스킬들 중에서 SkillGroupID가 일치하는 스킬들을 선택하여 validSkills 리스트에 저장
                List<Skill> validSkills = skillList
                    .Where(skill => skill.SkillGroupID == chosenSkill.SkillGroupID &&
                                    skill.SkillLevel == friendshipDic[chosenSkill.GodID])
                    .ToList();
                    // 호감도가 충족되는 스킬이 있는 경우, 추가적인 조건을 검사
                if (validSkills.Count > 0)
                {
                // 선행스킬 여부 확인
                // 선택된 스킬들 중에서 Skill_ID가 PriorSkillID와 일치하고,
                // PriorSkillID가 9999가 아닌 스킬들을 선택하여 priorSkills 리스트에 저장
                    List<Skill> priorSkills = chosenSkills
                        .Where(skill => skill.Skill_ID == chosenSkill.PriorSkillID && skill.PriorSkillID != 9999)
                        .ToList();
                        
                    // 선행 스킬이 있는 경우, 호감도를 충족하는 스킬들 중에서 랜덤하게 하나의 스킬을 선택
                    if (priorSkills.Count > 0)
                    {
                        chosenSkill = validSkills[Random.Range(0, validSkills.Count)];
                    }
                    else
                    {
                        continue; // PriorSkillID 에 해당하는 스킬이 없는 경우 다시 스킬 선택
                    }
                }
                else
                {
                    continue; // 호감도가 SkillLevel 보다 낮은 경우 다시 스킬 선택
                }
            }

            chosenSkills.Add(chosenSkill);
        }

        return chosenSkills;
    }

 

 

결과

 

랜덤으로 뜬다!

 

반응형