본문 바로가기

Unity/제로부터 구현

짝 맞추기 카드 만들기, 카드 섞기, 리소스를 사용한 스프라이트 설정

728x90

오늘의 구현

짝 맞추기 카드 만들기

카드 섞기

스프라이트 설정하기.

 

 

1. 짝 맞추기 카드 만들기

  • 보드판의 크기 만큼의 카드를 만들고, 0,0(정중앙) 을 기준으로 카드를 만들 것 입니다.
  • 0,0 을 기준으로 카드를 배열할 것이기 때문에 가장 첫번째 카드는 정중앙으로부터 -보드판/2 만큼 떨어져 있습니다. 만들어진 게임오브젝트의 중심점이 보드의 왼쪽 아래 모서리의 위치해 있기 때문에  만들어진 게임오브젝트 또한 중심점을 정중앙으로 만들기 위해 0.5를 더해줍니다.
  • 카드들을 보기 쉽게 서로 간격을 두고 만들기 위해 , outLinePercent(0~1 사이)라는 변수를 받고 게임 오브젝트의 크기를 1로 고정 한 다음 1에서 퍼센트를 뺀값을 곱해주고, 게임 오브젝트의 크기를 곱해줍니다.
public void SetBoard()
    {
        prefebIdxs = new int[boardSize * boardSize];
        Shuffle();

     for(int i = 0; i< boardSize; i++)
        {
            for(int j = 0; j< boardSize; j++)
            {
                CreateNewCard(i, j);
            }
        }

    }

    GameObject CreateNewCard(int _x,int _y)
    {
        int idx = queue.Dequeue();
        float x = -boardSize / 2f + _x + 0.5f;
        float y = -boardSize / 2f + _y + 0.5f;
        GameObject newCard = Instantiate(card[idx], new Vector3(x,y,0), Quaternion.identity);      
        newCard.GetComponent<Card>().SetCoord(_x, _y);
        newCard.transform.localScale = Vector3.one * (1 - outLinePercent) * 1.3f;
        newCard.transform.parent = board;

        return newCard;
    }

 

2. 카드섞기

  • 짝 맞추기 카드는 카드들이 서로 짝을 이뤄야 하기 때문에 배열을 {0,0,1,1,2,2,3,3,4,4} 이런식으로 배열을 만든뒤 배열을 섞고 카드를 만들때 섞은 배열을 이용해 카드를 만들 것 입니다.
  • spriteMaxCount 는 만들어 놓은 스프라이트 이미지 갯수 입니다. 배열 숫자가 만들어 놓은 스프라이트 개수를 넘어가지 않게 % 해줍니다.
  • System.Linq; 를 추가하고 prefebIdxs = prefebIdxs.OrderBy(item => Random.Range(-1.0f, 1.0f)).ToArray(); 코드를 사용하면 아주 쉽게 배열을 랜덤하게 정렬 시킬 수 있습니다. prefebIdxs의 배열을 Random.Range(-1.0f, 1.0f) 기준으로 정렬 시킨후 ToArray() 로 반환합니다.
  void Shuffle()
    {
        for(int i = 0; i< boardSize * boardSize; i++)
        {
            prefebIdxs[i] = (i / 2) % spriteMaxCount;
        }
        //prefebIdxs = prefebIdxs.OrderBy(item => Random.Range(-1.0f, 1.0f)).ToArray();
        for (int i = 0; i < boardSize * boardSize; i++)
        {
            int randomIdx = Random.Range(i, boardSize * boardSize);
            int term = prefebIdxs[randomIdx];
            prefebIdxs[randomIdx] = prefebIdxs[i];
            prefebIdxs[i] = term;
        }

        queue = new Queue<int>(prefebIdxs);

    }

3.리소스를 이용한 스프라이트 설정

  • Resources 폴더를 만들어 이미지들을 저장합니다.
  • 위에서 만든 배열을 이용해 이미지를 가져올 것이기 때문에 이미지 이름 뒤에 숫자를 넣어줍니다. ex)name1, name2,name3
  • 위에 만든 배열을 큐로 만들어 하나씩 가져와 스프라이트 이름을 만들고 
  • transform.Find 로 이미지를 넣을 게임 오브젝트를 찾아 Resources.Load<Sprite>()로 스프라이트를 설정해 줍니다.
    GameObject CreateNewCard(int _x,int _y)
    {
        int idx = queue.Dequeue();
      
      string name = "name" + idx.ToString();
      
      	float x = -boardSize / 2f + _x + 0.5f;
        float y = -boardSize / 2f + _y + 0.5f;
        GameObject newCard = Instantiate(card, new Vector3(x,y,0), Quaternion.identity);      
        newCard.GetComponent<Card>().SetCoord(_x, _y);

      newCard.transform.Find("Front").GetComponent<SpriteRenderer>().sprite = Resources.Load<Sprite>(name);
       
       	newCard.transform.localScale = Vector3.one * (1 - outLinePercent) * 1.3f;
        newCard.transform.parent = board;

        return newCard;
    }
728x90