반응형
팀의 기획자가 "랜덤으로 스킬을 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;
}
결과

반응형
'[StarChaser] 로그라이크 게임 프로젝트' 카테고리의 다른 글
[유니티/C#] 퀘스트 시스템 만들기 (0) | 2023.06.09 |
---|---|
[유니티/C#] 데이터를 관리하는 클래스 만들기 (1) | 2023.06.06 |
[유니티/C#] DataTable의 모든 행 읽어오기 (0) | 2023.05.26 |
[유니티/C#] NavMeshAgent 와 NavMeshObstacle (0) | 2023.05.22 |
[유니티/C#] DataTable로 엑셀 csv파일 읽어오기 (0) | 2023.05.05 |