https://docs.unity3d.com/kr/2019.4/Manual/RandomNumbers.html
유니티에서 제공해 주는 확률 코드를 이용한 뽑기 및 기타 등등 여러 곳에서 사용할 수 있는 랜덤 확률 코드에 대해 알아보겠습니다.
코드만 복사 붙여 넣기 해서 사용하는 것보단 내용을 알고 사용하는 게 더 도움이 되겠죠?
public class RandomTest : MonoBehaviour {
[Header("확률 설정")]
public float[] pr;
void Start() {
float value = Choose(pr);
print(value);
}
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;
}
}
[Header("확률 설정")]
public float[] pr;
float [] pr ->을 이용해서 확률의 값을 입력합니다.
아래 이미지처럼 아이템이 나올 확률 값을 넣어 주시면 됩니다.
% 확률 값을 1 부터 50까지 낮은 값에서 높은 값으로 넣었지만 순서는 상관 없습니다. %
foreach (float elem in probs) {
total += elem;
}
pr의 값을 모두 더한 값을 total에 저장해 둡니다. 위 이미지의 처럼 입력했다면 total의 값은 76이 들어가게 됩니다.
float randomPoint = Random.value * total;
Random.value -> 0 ~ 1 사이의 랜덤 값을 하나 생성합니다.
예로 Random.value의 값이 0.7951384로 나왔다면 randomPoint의 값은 76 * 0.7951384 = 60.43052 가 됩니다.
for (int i= 0; i < probs.Length; i++) {
if (randomPoint < probs[i]) {
return i;
} else {
randomPoint -= probs[i];
}
}
이제 pr의 값을 for문으로 돌리면서 randomPoint의 값보다 적은 값이 있나 찾아냅니다.
현재 randomPoint의 값은 60.43052입니다.
pr에 입력된 값들은 [1 , 5, 20, 50]입니다. 값들은 잘 확인하세요.
for문이 0부터 돌아가면서 값을 비교할 때 첫 번째 값 1 이 조건과 맞지 않아 else 문을 실행합니다.
randomPoint -= probs [i]; => 60.43052 - 1 = 59.43052
첫 번째 확인에서 맞는 조건이 없어 randomPoint의 값이 59.43052 변했습니다.
두 번째 for 문이 돌았지만 역시 맞는 값이 없어 else 쪽이 실행됩니다.
randomPoint -= probs [i]; => 59.43052 - 5 = 54.43052
세 번째 for문이 돌지만 역시 입력된 확률보다 높아 맞는 값이 없네요 역시 else 쪽이 실행됩니다.
randomPoint -= probs [i]; => 54.43052 - 20 = 34.43052
네 번째 for문이 돌면서 마지막 값과 randomPoint의 값이 조건에 맞아 i의 값을 return 했습니다.
만약 for문을 다 돌리고도 맞는 값이 없다면
return probs.Length - 1;
마지막 확률의 값을 return 합니다.
뽑기에서 꽝이 있다면 꽝 처리를 하지만 꽝이 없다면 마지막 확률의 값으로 뽑기를 마무리하면 되겠죠
마지막으로 위에서 입력된 값들의 결과입니다.
이상 뽑기뿐 아니라 여러 곳에 사용될 수 있는 랜덤 확률에 대해 알아봤습니다.
'Unity' 카테고리의 다른 글
유니티 - CustomEditor 활용 (Inspector 꾸미기) (0) | 2024.07.09 |
---|---|
유니티 (Unity) - 게임에 다중 언어 (Localization) 적용하기 (4) | 2024.07.09 |
유니티(Unity) - 클릭 이벤트 (1) | 2024.05.31 |
유니티(Unity) - 글자 타이핑 효과(Typing) (0) | 2022.09.07 |
유니티(Unity) - 인스펙트 리스트 오류 (Inspector) (0) | 2022.06.25 |