카테고리 없음

20170714_임의의 플레이 요소 추가

Beabletoet 2017. 7. 14. 21:05

★임의의 플레이 요소 추가


1. 배열에서 임의의 항목 선택하기


임의의 정수를 0부터 배열의 최대 인덱스 값까지 중에서 선택하는 것. (c에서 rand함수%정수 쓰는 격)


1
var element = myArray[Random.Range(0, myArray.Length)];

cs



2. 확률을 가진 아이템 선택


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
    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;
    }
cs

이런 식으로 한다는데..

그냥 Random.Range(0,max) 값 이용해서 나온거 if로 가르면 안되려나..?



3. 커브를 이용해 가중치 하는 방식..?

1
2
3
4
float CurveWeightedRandom(AnimationCurve curve) 
{
    return curve.Evaluate(Random.value);
}
cs

..잘은 모르겠다.



4. 리스트 셔플

알려진 아이템 셋에서 선택하되, 임의의 순서로 찾는 것.

1
2
3
4
5
6
7
8
9
10
void Shuffle (int[] deck) 
{
    for (int i = 0; i < deck.Length; i++
    {
        int temp = deck[i];
        int randomIndex = Random.Range(0, deck.Length);
        deck[i] = deck[randomIndex];
        deck[randomIndex] = temp;
    }
}
cs


5. 반복없이 항목의 집합에서 선택

항목을 집합에서 무작위로 선택해 반복하여 같은 것을 여러 번 선택하지 않도록 하는 것.


ex)일정 수의 NPC를 임의의 위치에 생성해도 한 NPC만이 어떤 위치에 생성되게 하고픈 경우.


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
Transform[] spawnPoints;
Transform[] ChooseSet (int numRequired) 
{
    Transform[] result = new Transform[numRequired];
    int numToChoose = numRequired;
    for (int numLeft = spawnPoints.Length; numLeft > 0; numLeft--
    {
        float prob = (float)numToChoose/(float)numLeft;
        if (Random.value <= prob) 
        {
            numToChoose--;
            result[numToChoose] = spawnPoints[numLeft - 1];
            if (numToChoose == 0
            {
                break;
            }
        }
    }
    return result;
}
cs

※선택이 무작위임에도 선택된 셋의 항목은 첫 배열과 같은 순서임을 명심. 만약 배열이 순차적으로 한 번 쓰일 경우 배열을 사용하기 전에 셔플할 필요가 있음.



6. 공간의 임의의 지점

입방체의 체적에 있어서 임의의 점은 Vector3의 각 컴포넌트를 Random.Value로 반환시키는 값으로 선택 가능.

1
 var randVec = Vector3(Random.value, Random.value, Random.value);
cs

체적이 구인 경우는 Random.insideUnitSphere에 원하는 반경을 곱함

1
2
3
 var randWithinRadius = Random.insideUnitSphere * radius;
 
 var randWithinCircle = Random.insideUnitCircle * radius;
cs


만약 임의의 점을 지상에서 선택해야 하는 경우 X,Z는 임의 선택하고 Y는 0으로 설정. 그럼 임의의 점을 제대로 얻는 것은 불가능해 짐. 점은 확실히 랜덤이고 반경은 원하는 범위 내지만 확률이 원주에 가까워질수록 크게 치우치고 불균등하게 나열됨. 그런 상황엔 아래를 사용.