김김김의 게임개발
  • Unity 게임 개발 #6 - 카드 매칭 게임<Teammate-Cardgame> 2
    2023년 08월 07일 20시 57분 45초에 업로드 된 글입니다.
    작성자: noun06

    유니티를 사용하여 개발한 카드 맞추기 게임입니다. 팀 미니 프로젝트로 진행하였습니다.


    1. 일정 시간이 되면 타이머 색상 변화

    • 타이머 시간 줄어들게 변경, 10초 이하일 때 색을 빨갛게 변경하는 ChangeTimerColor() 함수 호출.
    //GameManager.cs
    
    void Update()
        {
            time -= Time.deltaTime;
            timeText.text = time.ToString("N2");
    
            if(time <= 0f)
            {
                endText.SetActive(true);
                Time.timeScale = 0.0f;
            }else if(time <= 10.0f)
            {
                ChangeTimerColor(); //10초 이하일 때 함수 호출
            }
        }
    
    void ChangeTimerColor()
        {
            GameObject.Find("timeText").GetComponent<Text>().color = Color.red; 
            //timeText라는 object의 색상 컴포넌트 변경
        }

     

    2. 뒤집힌 카드 색상 변경

    • 카드가 매칭되지 않은경우 closeCard() 함수 호출 후 카드 색상을 바꾸는 ChangeCardColor() 함수 호출.
    • 코루틴을 통해 카드 색상이 변경되고 1초 후 색상 원상태로 복구. 

    • 코루틴은 함수를 호출한 후 일시 중단하고 재개할 수 있는 기능을 제공함.
    • StartCoroutine() : 코루틴을 시작하는 메서드, 함수를 실행
    • 코루틴은 IEnumerator라는 반환형으로 시작해야함.
    • yield return : 코루틴 내 일시 중단하고 다음 프레임에서 계속 실행할 위치 지정(필수적으로 사용).
    • 지금 사용한 yield return new WaitForSeconds()는 매개변수에 해당하는 초 만큼 기다렸다가 함수 내용을 실행함.

    • 사실 처음에 invoke()함수를 사용해서 원래 색상으로 변하는 것을 구현하려고 했음. 하지만 Invoke사용 시 함수 내의 매개변수인 cardTransformRevert 지정할 수 없기 때문에 간결성이 많이 떨어졌고 그 이유로 코루틴을 사용하게 됨.
    //GameManager.cs
    
    public void isMatched()
        {
            //...
            else
            {
                firstCard.GetComponent<card>().closeCard();
                secondCard.GetComponent<card>().closeCard();
                ChangeCardColor(firstCard.transform); //카드 색 변경 함수 호출
                ChangeCardColor(secondCard.transform); //카드 색 변경 함수 호출
            }
    
            firstCard = null;
            secondCard = null;
        }
        
    void ChangeCardColor(Transform cardTransform) //카드 색상 회색으로 변경
        {
            cardTransform.Find("back").GetComponent<SpriteRenderer>().color = Color.gray;
    
            StartCoroutine(ReturnCardColorCoroutine(cardTransform));
        }
    
    private IEnumerator ReturnCardColorCoroutine(Transform cardTransformRevert) //카드 색상 원상태로 변경
        {
            yield return new WaitForSeconds(1.0f);
            cardTransformRevert.Find("back").GetComponent<SpriteRenderer>().color = Color.white;
        }

     

    3. 매칭 시도 횟수 카운팅

    • 카드가 오픈되었을 때 flipCount 변수를 증가시켜 업데이트하는 flipCounter() 함수 호출.
    //gameManager.cs
    
    public GameObject endCanvas;
    public Text flipCountText; 
    private int flipCount = 0;
    
    public class gameManager : MonoBehaviour
    {
    	void Update()
        {
            //...
            if(time <= 0f)
            {
                endText.SetActive(true);
                Time.timeScale = 0.0f;
                ShowEndCanvas(); //게임 종료 시 게임 종료 캔버스 활성화
            }
            //...
        }
        
    	public void isMatched()
        {
            string firstCardImage = firstCard.transform.Find("front").GetComponent<SpriteRenderer>().sprite.name;
            string secondCardImage = secondCard.transform.Find("front").GetComponent<SpriteRenderer>().sprite.name;
    
            if (firstCardImage == secondCardImage)
            {
               	//...
                if (cardsLeft == 2)
                {
                    endText.SetActive(true);
                    Time.timeScale = 0.0f;
                    Invoke("GameEnd", 1f);
                    ShowEndCanvas(); //게임 종료 시 게임 종료 캔버스 활성화
                }
            }
            //...
        }
        
    	public void FlipCounter() //시도 횟수 카운팅
        	{
            	flipCount++;
        	}
    
        	private void FlipCountText() //flipCount 텍스트로 변환
        	{
            	flipCountText.text = flipCount.ToString() + " 회";
        	}
    
        	private void ShowEndCanvas()
        	{
            	endCanvas.SetActive(true);
            	FlipCountText(); // 종료 시 flipCount 텍스트 업데이트
        	}
    }
    //card.cs
    
    public void OpenCard()
        {
            ..//
            gameManager.I.FlipCounter(); //FlipCounter 함수 호출
        }

     

    4. 결과물

     

     

     

     

    댓글