ppoyami
ppoyami
ppoyami
전체 방문자
오늘
어제
  • 분류 전체보기 (5)
    • Unity Scripts (1)
    • Unity Engine (2)
    • Unity Core (0)
    • Unity Settings (0)
    • Unity Errors (2)
    • C# (0)
    • Algorithms (0)

블로그 메뉴

  • 홈
  • 태그
  • 방명록

공지사항

인기 글

태그

  • C#
  • Collection was modified
  • random
  • spine
  • collider2d
  • Collision
  • C# List
  • OverlapCircleAll
  • Unity List
  • Unity Error
  • Rigidbody2D
  • Unity

최근 댓글

최근 글

티스토리

hELLO · Designed By 정상우.
ppoyami

ppoyami

Unity Scripts

[Unity-C#] 랜덤 플레이 관련 스크립트 모음

2022. 10. 14. 23:48

다른 확률을 가진 아이템을 선택하기

  • 서로 다른 확률을 가진 행동을 paper strip으로 생각해볼 수 있다.
    • 50%의 확률로 반겨주기
    • 25% 확률로 도주
    • 20% 확률로 갑작스러운 공격
    • 5% 확률로 돈을 선물

인자: probs 각 항목에 대한 다른 확률을 배열로 가지고 있음

  • probs ⇒ [0.5, 0.25, 0.2, 0.05]

randomPoint : 위의 스트렙에서의 위치 값

  • Random.Value → 0.8 이면, 20% 확률로 갑작스러운 공격에 해당하는 행동을 한다.
float Choose (float[] probs) {

        float total = 0;

        foreach (float elem in probs) {
            total += elem; // 각 확률의 총합
        }
				// Random.value 0 ~ 1 사이의 숫자
        float randomPoint = Random.value * total; 

        for (int i= 0; i < probs.Length; i++) {
            if (randomPoint < probs[i]) { // i번째 확률에 들어 왔는가
                return i; // probs의 인덱스를 반환
            }
            else {
                randomPoint -= probs[i]; // probs[i]는 개별행동의 확률만 있기 때문
            }
        }
        return probs.Length - 1; // 해당 되지 않는다면 마지막 행동에 해당하는 인덱스
    }

배열 셔플

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;
        }
    }

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

10개의 스폰 포인터에 5명의 Npc를 랜덤으로 배치하기

첫번 째 Npc 배치 완료(5 / 10 == 0.5) → 두번째 Npc가 선택될 확률은 4 / 9 == 0.44 이다.

    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; // 선택할 수 / 남은 수 => 해당 Npc가 선택될 확률

            if (Random.value <= prob) { // 확률 안으로 들어오면
                numToChoose--; // 선택할 수 빼주고
                result[numToChoose] = spawnPoints[numLeft - 1]; // result에 할당함 (4-3-2-1-0 순으로 담김)

                if (numToChoose == 0) { // 다 선택 했으면 나가기
                    break;
                }
            }
        }
        return result;
    }

공간의 임의의 지점

var randVec = Vector3(Random.value, Random.value, Random.value); // Random.value 는 0 ~ 1 의 값이다.
randVec * scaleValue // 길이가 1 단위인 큐브안의 공간에 scaleValue 스칼라를 곱해 스케일 업 할 수 있다.

// 정리 필요함
var randWithinRadius = Random.insideUnitSphere * radius; // 구체의 경우(즉 원점의 주어진 반경 안에 있는 랜덤 포인트를 원하는 경우) Random.insideUnitSphere를 원하는 반지름으로 곱하면 됩니다.
var randWithinCircle = Random.insideUnitCircle * radius; // ??
 
 
 
 
    ppoyami
    ppoyami

    티스토리툴바