출처: https://github.com/AnnulusGames/LucidRandom/blob/main/README_JP.md

유니티용으로 만든 라이브러리로 https://github.com/AnnulusGames/LucidRandom/tree/main/Assets/LucidRandom/Runtime 에 있는 코드를 수정하면 보통의 닷넷코어 환경에서도 사용 가능하다.

개요

Lucid Random는 Unity의 Random 클래스를 확장하여 재현 가능한 난수나 가중치 있는 추첨 등 많은 기능을 추가했다.

특징

셋업

중요

설치

  1. Window > Package Manager 에서 Package Manager을 연다
  2. 「+」버튼 > Add package from git URL
  3. 아래를 입력한다

혹은 Packages/manifest.json을 열고, dependencies 블럭에 아래를 추가

{

    "dependencies": {

        "com.annulusgames.lucid-random": "https://github.com/AnnulusGames/LucidRandom.git?path=/Assets/LucidRandom"

    }

}

Namespace

Lucid Random을 이용하는 경우는 파일 선두에 아래 1행을 추가한다.

using AnnulusGames.LucidTools.RandomKit;

기본적인 사용법

기본적으로는 Unity.Random 클래스와 같은 방법으로 사용할 수 있다.

//0.0f 에서 10.0f 까지의 값을 랜덤하게 취득
float value = LucidRandom.Range(0f, 10f);

//랜덤한 색을 취득
Color color = LucidRandom.ColorHSV();

시드 값을 설정하고 싶으면 InitState을 이용한다.

int seed = (int)System.DateTime.Now.Ticks;
//시드 값을 지정
LucidRandom.InitState(seed);

랜덤한 bool 값을 얻고 싶은 경우는 valueBool을 이용한다

//true 혹은 false를 랜덤하게 반환
if (LucidRandom.valueBool)
{
   Debug.Log(
"Hello!");
}

Vector2 나 Vector3도 Range의 인수로 지정할 수 있다

//(0, 0) 에서 (1, 1)까지의 랜덤함 Vector2를 반환
Vector2 vector2 = LucidRandom.Range(Vector2.zero, Vector2.one);

//(0, 0, 0) 에서 (1, 1, 1)까지의 랜덤함 Vector3을 반환
Vector3 vector3 = LucidRandom.Range(Vector3.zero, Vector3.one);

onUnitCube 나 insideUnitSquare 등도 이용할 수 있다.

//단위입방형의 표면 좌표를 랜덤하게 얻는다
Vector3 p1 = LucidRandom.onUnitCube;

//단위입방형 내부의 좌표를 랜덤하게 얻는다
Vector2 p2 = LucidRandom.insideUnitSquare;

확률에 의한 게산을 하는 경우는 GetChance를 이용한다.

//15% 확률로 true를 반환
if (LucidRandom.GetChance(0.15f))
{
   Debug.Log(
"Lucky!");
}

주사위를 던지는 경우는 RollDice를 이용한다/

//6면 다이스를 던질 때 나올 수 얻기
int valueD6 = LucidRandom.RollDice(DiceType.D6);

//10면 다이스를 2번 던질 때 나올 총합값 얻기
int value2D10 = LucidRandom.RollDice(2, DiceType.D10);

배열이나 List의 랜덤한 요소를 얻고 싶은 경우는 RandomElement을 이용한다.

int[] array = { 1, 2, 3, 4, 5, 6 };
//배열의 랜던함 요소를 얻는다
int a = LucidRandom.RandomElement(array);


//가변 길이 인수에 의한 지정도 가능
int b = LucidRandom.RandomElement(1, 2, 3, 4, 5, 6);

배열이나 리스트의 순번을 랜덤하게 교체하고 싶은 경우는 Shuffle을 이용한다/

int[] array = { 1, 2, 3, 4, 5, 6 };
//순번을 셔플
array = LucidRandom.Shuffle(array).ToArray();

Gradient 중에서 랜덤한 색을 얻고 싶은 경우는RandomColor를 이용한다.

Color color = LucidRandom.RandomColor(gradient);

확장 메소드

RandomElement, Shuffle, RandomColor는 각각 확장 메소드로 준비 되었다

//배열의 랜덤한 요소를 얻기
int[] array = { 1, 2, 3, 4, 5, 6 };
int a = array.RandomElement();

//순번을 셔플
array = array.Shuffle().ToArray();

//랜덤한 색을 얻기
Color color = gradient.RandomCo
lor();

난수 재현

Unity의 Random 클래스는 인스턴스화 할 수 없으므로 재현 가능한 난수를 생성하는 것에 알맞지 않다. Lucid Random 에서는 RandomGenerator 클래스를 이용하여 난수의 재현을 간단하게 할 수 있다.

int seed = 0;
//인수로 시드 값을 지정한다
RandomGenerator rand =
new RandomGenerator(seed);

//LucidRandom 클래스와 같은 메소드나 프로퍼티를 이용 가능
float value1 = rand.value;
float value2 = rand.value;
float value3 = rand.value;

또는 AddGenerator・GetGenerator을 이용하여 RandomGenerator을 등록해둘 수 있다. 이것은 복수의 클래스로 같은 난수를 재 사용하고 싶을 때 편리하다.

int seed = 0;
//새로운 RandomGenerator를 등록
LucidRandom.AddGenerator(
"Key", seed);

//Key를 지정하여 RandomGenerator를 얻는다
float value1 = LucidRandom.GetGenerator("Key").value;
float value2 = LucidRandom.GetGenerator("Key").value;
float value3 = LucidRandom.GetGenerator("Key").value;

MinMaxValue

Lucid Random에서는 최소값과 최대값을 다루는 구조체가 정의되어 있다.

//0을 최소, 100을 최대로 하는 float
MinMaxFloat mmFloat =
new MinMaxFloat(0f, 100f);

//최소값을 얻는다
float minValue = mmFloat.min;
//최대값을 얻는다
float minValue = mmFloat.max;
//최소값~최대값을 범위로 하는 난수를 얻는다
float randomValue = mmFloat.random;

//값의 범위 길이를 얻는다(int, float 만)
float length = mmFloat.length;

//최소값~최대값의 Lerp를 이용 가능
float value = mmFloat.Lerp(0.2f);

이것은 Range의 인수로서도 이용 가능하다.

MinMaxFloat mmFloat = new MinMaxFloat(0f, 100f);

//0.0f 에서 100.0f 까지의 값을 랜덤하게 얻는다
float value = LucidRandom.Range(mmFloat);

또 이 값은 Inspector 상에서 편집 가능하다

대응하고 있는 타입은 아래와 같다.

WeightedList

게임 내에서 추첨을 하는 경우 일정 확률이 아닌 어느 정도 가중치가 붙은 추첨을 해야하는 경우가 있다. Lucid Random 에서는 WeightedList를 이용하여 가중치 붙은 추첨을 간단하게 구현할 수 있다.

WeightedList는 보통의 List 처름 이용할 수 있다.

WeightedList<string> weightedList = new WeightedList<string>();

//값을 추가
weightedList.Add(
"Hello!");
weightedList.Add(
"How are you?");

//값을 편집
weightedList[1].
value = "I'm good.";

//값을 삭제
weightedList.Remove(
"Hello!");
weightedList.RemoveAt(0);

요소에 가중치를 붙이고 싶은 경우는 요소를 추가할 때 지정하거나 요소가 가진 weight 값을 변경한다. 지정이 없는 경우 weight는 1로 설정된다.

WeightedList<string> weightedList = new WeightedList<string>();

//가중치가 있는 요소를 추가
weightedList.Add(
"Legendary", 0.5f);
weightedList.Add(
"Epic", 2.5f);
weightedList.Add(
"Rare", 12f);
weightedList.Add(
"Uncommon", 25f);
weightedList.Add(
"Common", 60f);

//가중치를 편집
weightedList[4].weight = 50f;
weightedList[
"Uncommon"] = 35f;

//추첨을 한다
string rarity = weightedList.RandomElement();

WeightedList는 추가된 요소를 WeightedListItem 으로 다룬다. WeightedListItem는 value와 weight 2개의 값을 가지고 있다.

WeightedList<string> weightedList = new WeightedList<string>();

WeightedListItem<
string> item = new WeightedListItem<string>("Value", 10f);
weightesList.Add(item);

WeightedList는 Inspector 상에서 편집 가능하다