포트폴리오/팬게임
[Galaxy Wak] 등급별 확률 구현!
레인보우 마카롱
2023. 7. 27. 17:47
서론
팬게임의 로그라이크 상점 기능을 구현하던 중, 유물의 등급별로 차등을 나누어 구매 목록에 나타내야 하는 상황이 왔다.
구글 스프레드시트에 기획된 내용대로 아이템이 화면에 보이도록 구현해야 했다.
본론
우선 판매 칸을 만들어 보았다.
이제 시트에 맞게 유물이 배치되어야 하는데, 유물의 등급이 다음과 같이 3개로 나누어져 있었고
판매 칸 별로 유물의 등급이 다르기 때문에, 인스펙터 창에서 조절이 가능하도록 구현하였다.
[SerializeField, Range(0, 100)] internal int rarity1Per = 0;
[SerializeField, Range(0, 100)] internal int rarity2Per = 0;
[SerializeField, Range(0, 100)] internal int rarity3Per = 0;
이제 칸 별로 있는 확률에 맞게 등급이 나오도록 스크립트를 작성해보았다.
private List<UIShopItem> items = new List<UIShopItem>();
private void Awake()
{
items.AddRange(GetComponentsInChildren<UIShopItem>());
}
private void RefreshItems()
{
foreach (var item in items)
{
if(item is UIShopRelicItem relicItem)
{
float[] rarityProbabilities = new float[3];
rarityProbabilities[0] = relicItem.rarity1Per;
rarityProbabilities[1] = relicItem.rarity2Per;
rarityProbabilities[2] = relicItem.rarity3Per;
float r = Random.Range(0, 100);
float cumulativeProbability = 0;
for (int i = 0; i < rarityProbabilities.Length; i++)
{
cumulativeProbability += rarityProbabilities[i];
if (r <= cumulativeProbability)
{
Debug.Log($"{i}등급의 유물 획득!");
break;
}
}
}
}
}
스크립트를 정리해보자면
1. 각 아이템들의 등급별 확률을 받는다.
rarityProbabilities[0] = relicItem.rarity1Per;
rarityProbabilities[1] = relicItem.rarity2Per;
rarityProbabilities[2] = relicItem.rarity3Per;
2. 랜덤한 확률을 받는다.
float r = Random.Range(0, 100);
3. 반복문을 돌리며 등급별 확률을 누적확률에 더한다.
for (int i = 0; i < rarityProbabilities.Length; i++)
{
cumulativeProbability += rarityProbabilities[i];
}
4. 만약 i번째 까지 더한 누적확률이 랜덤한 확률인 r보다 크거나 같으면, 그게 유물의 등급이다.
if (r <= cumulativeProbability)
{
Debug.Log(i);
break;
}