본문 바로가기
Unity/TIL

배열 랜덤 섞기

by 김차루 2024. 4. 16.
스파르타 내배캠 2일차 TIL
👊 c1조_시작이 반이다! 

 

 

TIL 수정

  아주 작은 실수로 하루를 날려버릴 수 있다는 것을 오랜만에 느끼는 하루였다😂

  깃허브에 관한 것이라서 어제 TIL에 추가로 수정해서 올렸다.

  https://rollingball-coding.tistory.com/19

 

깃과 깃허브, 유니티 협업

스파르타 내배캠 1일차 TIL 👊 c1조_시작이 반이다! 협업에 있어 가장 필요한 것이 무엇일까? 하면 대부분은 소통이라고 생각할 것이다. 하지만 개발자의 입장에서 생각한다면 소통 이외에 중요

rollingball-coding.tistory.com

 

c1조_프로젝트

  내배캠 첫 주는 미니 프로젝트를 통해 사전캠프 때 배웠던 내용을 복습하고 팀원들과 협업에 대해 배우는 주간이다. 프로젝트는 목요일까지 제출해야 하고 금요일에 5분 정도 발표 시작이 준비되어 있다. 

  현재 작업하고 있는 게임은 카드 뒤집기 게임이다. 사전캠프 때 스파르타에서 제공하였던 강의 중 마지막 주차의 내용이었다. 그래서 우리는 기능을 세세하게 나누어 각자 개발 후 합치기로 하였다.

  나는 그 중에 가장 기본이 되는 카드 배치와 추가 기능인 카드 색 변경, 씬 매지징, 인트로 화면을 맡아 진행하였다.

 

카드 배치

더보기
void Start()
{
    int[] arr = { 0, 0, 1, 1, 2, 2, 3, 3, 4, 4, 5, 5 };
    // 카드 섞기
    arr = arr.OrderBy(x => Random.Range(0, arr.Length)).ToArray();

    for (int i = 0; i < 12; i++)
    {
        GameObject go = Instantiate(card, this.transform);

        float x = (i % 3) * 1.4f - 2.1f;
        float y = (i / 3) * 1.4f - 3.0f;

        go.transform.position = new Vector2(x, y);
        go.GetComponent<Card>().Setting(arr[i]);
     }
}

 

  위에 있는 코드는 강의를 참고하여 작성한 코드이다. 배치할 카드를 한 쌍으로 생각하고 배열에 임의로 인덱스를 지정한다. 그리고 0부터 배열 길이 중 랜덤한 숫자를 이용하여 배열을 정렬한다. 강의와 다르게 3x4 카드 배열을 위해 x, y 좌표를 3으로 나눠 1.4f만큼의 간격으로 위치를 지정한다. 

  하지만 새로운 미니 프로젝트인 만큼 주요 코드를 변경하는 것이 의미가 있을 것 같아 이 부분을 수정했다.

더보기
void InitBoard()
    {
        int[] arr = { 0, 0, 1, 1, 2, 2, 3, 3, 4, 4, 5, 5};

        // 카드 섞기 로직2
        for (int i = 0; i < arr.Length; i++)
        {
            //배열 섞기
            int j = Random.Range(i, arr.Length);
            if (i != j)
            {
                int temp = arr[i];
                arr[i] = arr[j];
                arr[j] = temp;
            }
            // 카드 프리팹 생성
            GameObject go = Instantiate(card, this.transform);
            // 프리팹 위치 지정
            float x = (i % 3) * 1.6f - 1.6f;
            float y = (i / 3) * 1.6f - 3.5f;

            go.transform.position = new Vector2(x, y);
            go.GetComponent<Card>().Setting(arr[i]);
        }

        GameManager.instance.cardCount = arr.Length;

    }

  첫번째 코드와 크게 다르지 않다. OrderBy를 사용하지 않고 하드 코딩을 했다고 표현할 수 있다. 대표적인 Sort 알고리즘인데 랜덤 숫자가 for문 인덱스와 다를 때 해당되는 인덱스의 값을 변경하는 것이다. 결국 위와 같이, 랜덤으로 정렬하는 것이다. 의도는 같지만 쓰는 로직이 다른 예시가 될 것 같다. 

 

카드 색상 변경

더보기
void CloseCardInvoke()
{
    anim.SetBool("isOpen_1", false);
    front.SetActive(false);
    back.SetActive(true);
    anim.SetBool("isOpen", false);
    //카드 색 변경
    backImage.color = new Color(backImage.color.r - 0.1f, backImage.color.g - 0.1f, backImage.color.b - 0.1f);
}

  카드를 뒤집을 때마다 색상이 변경되어 눌러본 카드인지 확인할 수 있다. 코드는 아주 간단했다. 두 장의 카드를 뒤집어 같은 카드가 아니라면 카드가 닫힌다. 이때, 색상의 r, g, b를 0.1f씩 줄인다. 그러면 흰색인 카드가 맞추기를 실패했을 때마다 어두워진다.

 

씬 매니징

더보기
using UnityEngine.SceneManagement;

public class LoadSceneManager : MonoBehaviour
{
    public void StartGame()
    {
        SceneManager.LoadScene("MainScene");
    }

    public void ExitGame()
    {
        SceneManager.LoadScene("StartScene");
    }
   
}

  이 기능도 아주 간단하다. (왜이렇게간단한코드만진행했지..?) SceneManagement 패키지의 SceneManager를 사용하여 씬을 불러온다. 

 

스타트 화면(인트로, 로비)

 

  씬 매니징을 하면서 팀만의 특별한 인트로가 있으면 좋을 것 같아 작업하였다. 주먹과 팀명이 적힌 로고는 ChatGPT의 DEll.e를 이용하여 생성하였다. 유료 버전에 이미지 생성 기능이 있다는 얘기를 듣고 오늘 처음 결제하여 작업 해보았다. 만족스러운 결과물을 만들려면 깊이있게 요구해야 했던 것 같다.  

 

마무리하며 

  팀장을 맡은 내가 기능을 종류 별로 나누어 가지게 했다면 발표 때 자기가 맡은 부분은 확실히 어필할 수 있을 거라는 생각을 너무 늦게 해버려 아쉬움이 남는다. 하지만 이것 또한 협업의 첫 단계라고 생각하고 앞으로 기능을 맡을 때 그 부분까지 생각해서 나누려고 한다. 아쉬운 점이 많은 하루였지만 개발자는 삽질하며 크는 거라고 생각하기 때문에 후회는 없다.

 

 

'Unity > TIL' 카테고리의 다른 글

2주차 시작 +error  (1) 2024.04.22
시작이 반이다! 팀의 최종 마무리  (1) 2024.04.19
내용 없는 TIL  (1) 2024.04.18
간단한 게임 레벨, 해금 시스템  (0) 2024.04.17
깃과 깃허브, 유니티 협업  (0) 2024.04.15