스파르타 게임개발종합반(Unity)/사전캠프 공부 기록

[Unity/2D] 랜덤 정렬 - OrderBy, OrderByDescending, ToArray, Random.Range

테크러너 2024. 4. 8.

이전편 참고하고 와주세요!

2024.04.05 - [Unity/2D] - [Unity/2D] 코드로 간격있게 카드 배치하기

 

 

이전편에서 카드를 배치했었죠?

이번에는 카드가 랜덤으로 배치되게 코드를 작성해보겠습니다.

        int[] arr = { 0, 0, 1, 1, 2, 2, 3, 3, 4, 4, 5, 5, 6, 6, 7, 7 };
        arr = arr.OrderBy(x => Random.Range(0f, 7f)).ToArray();

16장의 카드가 있었는데요, 같은 카드 2장 고르기 게임을 만들거라서 arr 안에 같은 숫자 2개가 들어있습니다.

arr 안의 숫자들을 랜덤하게 섞어줄거에요. 섞인 숫자대로 카드가 배치될겁니다.

arr을 랜덤하게 정렬하기 위해서 OrderBy라는 기능을 사용할 것입니다.

 

arr = arr.OrderBy(x => Random.Range(0f, 7f)).ToArray();

위의 코드를 하나하나 뜯어보겠습니다.

 

OrderBy오름차순 정렬이고, 정렬 기준 지정은 람다식을 활용합니다.

x => Random.Range(0f, 7f)

이게 람다식입니다.

OrderByDescending도 있는데 이건 내림차순 정렬입니다.

 

Random.Range(0f, 7f)를 통해 나온 랜덤값이 x로 지정되는데요.

arr 안의 각 숫자마다 우선순위를 지정해주는데, 이 우선순위값이 x값입니다.

즉, 랜덤한 우선순위는 Random.Range(0f, 7f)에서 생성되며, 각 요소마다 랜덤한 우선순위가 부여됩니다.

 

OrderBy(x => Random.Range(0f, 7f))

 

그래서 이 의미는 랜덤하게 지정된 우선순위에 따라 배열 안의 요소들이 정렬되어 새로운 배열이 생성된다는 것입니다.

 

arr = arr.OrderBy(x => Random.Range(0f, 7f)).ToArray();

그런데 OrderBy 타입이 배열이 아니라서 .ToArry()를 통해 배열로 바꿔준것입니다.

결국 랜덤하게 정렬된 배열을 기존의  arr 배열에 대입해주었습니다.

 

    void Start()
    {
        int[] arr = { 0, 0, 1, 1, 2, 2, 3, 3, 4, 4, 5, 5, 6, 6, 7, 7 };
        arr = arr.OrderBy(x => Random.Range(0f, 7f)).ToArray(); 

        for (int i = 0; i < 16; i++)
        {
            GameObject go = Instantiate(card, this.transform); // 임시 변수

            float x = (i % 4) * 1.4f - 2.1f; // 나머지 * 카드 간격
            float y = (i / 4) * 1.4f - 3.0f; // 몫 * 카드 간격

            go.transform.position = new Vector2(x, y); // 카드 배치
            Debug.Log(arr[i]);
        }
    }

이제 이 코드를 실행해보면

 

이렇게 배열 안의 값이 랜덤하게 정렬된 것이 확인됩니다.

 

 

다음편에서는 이 숫자값을 카드에 넣어보는 작업을 해보겠습니다!

2024.04.08 - [Unity/2D] - [Unity/2D] 랜덤 정렬한 값을 카드에 넣어주기 - GetComponent

반응형

댓글