본문 바로가기

Unity

유니티 (Unity) - 확률 뽑기(생성)

반응형

 

https://docs.unity3d.com/kr/2019.4/Manual/RandomNumbers.html

 

랜덤 게임플레이 요소 추가 - Unity 매뉴얼

여러 게임에서 임의로 선택되는 항목 및 값은 중요합니다. 이 섹션에서는 Unity에 내장된 랜덤 함수를 사용하여 일반적인 게임 역학을 구현하는 방법에 대해 알아봅니다.

docs.unity3d.com

 

유니티에서 제공해 주는 확률 코드를 이용한 뽑기 및 기타 등등 여러 곳에서 사용할 수 있는 랜덤 확률 코드에 대해 알아보겠습니다.

코드만 복사 붙여 넣기 해서 사용하는 것보단 내용을 알고 사용하는 게 더 도움이 되겠죠?

 

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 합니다.

뽑기에서 꽝이 있다면 꽝 처리를 하지만 꽝이 없다면 마지막 확률의 값으로 뽑기를 마무리하면 되겠죠

 

마지막으로 위에서 입력된 값들의 결과입니다.

 

 

이상 뽑기뿐 아니라 여러 곳에 사용될 수 있는 랜덤 확률에 대해 알아봤습니다.

 

반응형