본문 바로가기

Unity/Unity 스파르타

1주차 시작 + 카드 게임 기능 구현

728x90

본 캠 시작에 앞서, 내가 잘 해 나갈 수 있을지 너무나 걱정된다..

앞으로 다가올 수많은 실패와 좌절들에 벌써부터 손발에 땀이 나고 가슴이 뛰고...

하지만 실패와 좌절을 딛고 나아가는 것이야말로 보스 레이드의 꽃이 아닐까

앞으로 수많은 레이드를 위해 내실을 착실하게 쌓아 올려보자!

 

 

 


오늘의 구현

  1. 카드 랜덤하게 섞는 부분 구현
  2. 카드 짝 맞추는 것을 실패할 때마다 시간 감소 효과 구현
  3. 카드 뒤집히는 효과 구현
  4. 짝 맞추기 카드 개수 조절
  5. 카드를 뒤집을 때마다 카드 색 점점 어둡게 만들기

1. 카드 랜덤하게 섞는 부분 구현

 

카드의 스프라이트 이미지는 Resources로 가져올 것이며 스프라이트 이미지 파일 이름 뒤에 붙은 숫자들로 카드에 이미지를 넣을 것입니다. (ex. image1, image2, image3 ∙∙∙)

현재 보드판의 크기만큼 int 배열을 생성해 줍니다.

prefebIdxs = new int[boardSize * boardSize];

위 배열을 섞어줍니다.

배열에 짝을 맞춰 생성해 줍니다. ex) 0,0,1,1,2,2,3,3,4,4∙∙∙ , 가지고 있는 사진의 개수를 넘지 않게 %로 나눠줍니다.

간단한 Fisher-Yates 알고리즘으로 카드를 섞어줍니다.

섞어준 배열을 큐로 만들어줍니다. (간편하게 뽑아 쓰기 위해)

 void Shuffle()
    {
        for(int i = 0; i< boardSize * boardSize; i++)
        {
            prefebIdxs[i] = (i / 2) % spriteMaxCount;
        }
        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);
    }

만들어진 카드 오브젝트에 카드 앞면 스프라이트 렌더러를 찾아 이미지를 설정해 줍니다.

int idx = queue.Dequeue();
string name = "rtan" + idx.ToString();
newCard.transform.Find("Front").GetComponent<SpriteRenderer>().sprite = Resources.Load<Sprite>(name);

 

2. 카드 짝 맞추는 것을 실패할 때마다 시간 감소 효과 구현

두개의 카드가 일치하지 않을 때 시간을 감소시키면서 타이머에 애니메이션을 추가해줍니다.

   void TimeDeduction()
    {
        timeLimit -= 1f;
        timeAnimator.SetTrigger("TimeDeduction");
    }

 

3. 카드 뒤집히는 효과 구현

뒷면 카드가 y축으로 90도 돌아가면 앞면 카드를 90도에서 0도로 되돌려줍니다.

 IEnumerator CardFlip(GameObject front,GameObject back)
    {
        for(int i = 0; i< 90; i++)
        {
            back.transform.rotation = Quaternion.Euler(0, i, 0);
            yield return null;
        }
        back.SetActive(false);
        front.SetActive(true);
        for (int i = 90; 0<i; i--)
        {
            front.transform.rotation = Quaternion.Euler(0, i, 0);
            yield return null;
        }
    }

 

4. 짝 맞추기 카드 개수 조절

boardSize에 따라 카드의 개수를 생성하기 위해 함수를 만들어 줍니다.

화면의 정중앙 기준으로 카드들을 생성할 것입니다.  카드가 정중앙을 기준으로 만들어지기 위해서 보드 사이즈 기준으로 x 와 y값을 구해주고 카드의 생성 위치를 지정해줍니다.

카드의 아웃라인을 만들어 카드들이 서로 떨어져 있는 것 처럼 보이게 만들어 줍니다.

IEnumerator  CreateNewCard()
    {
        for (int i = 0; i < boardSize; i++)
        {
            for (int j = 0; j < boardSize; j++)
            {
                int idx = queue.Dequeue();

                float x = (-boardSize / 2f + i + .5f) * cardSizeX;
                float y = (-boardSize / 2f + j + .5f) * cardSizeY;
                GameObject newCard = Instantiate(card, cardStartPot.position, Quaternion.identity);

                newCard.GetComponent<Card>().SetCoord(x, y);
                newCard.name = "Card";

                newCard.transform.localScale = newCard.transform.localScale * (1 - outLinePercent);

                newCard.transform.parent = board;
                cardPack.Add(newCard);

                yield return new WaitForSeconds(.1f);
            }
        }
      
    }

 

 

5. 카드를 뒤집을 때마다 카드 색 점점 어둡게 만들기

카드를 못 맞췄을 때 카드 뒷면을 점점 어둡게 만들 것입니다.

카드를 점점 어둡게 만들 것 이기 때문에 색을 HSV에서 RGB로 변환해 스프라이트 색으로 설정해 줄 것입니다.

HSV(Hue:색상, Saturation:채도, Value:명도)는 0~1 사이의 값을 가집니다.

public float hsvV = 1;

public void DarkenColor()
    {
        colorNum -= 0.1f;
        Color newColor = Color.HSVToRGB(0, 0, colorNum);

        back.GetComponent<SpriteRenderer>().color = newColor;
    }
728x90