본문 바로가기
유니티

Day 3 - 카드 색상 3단계로 변경(매개변수&리스트 활용)

by shin0707 2024. 4. 17.
728x90

  • 주제

>> 기존 기능 업그레이드

1.색상변경 함수(ChangeColor)에 매개변수를 추가하여 효율적으로 함수 사용/이미지 변경 방법 추가

2.SwitchColor.cs를 생성하여, 매칭 실패시마다 카드 색상이 회색 -> 초록 -> 빨강 -> 검정 순으로 변경하는 함수 추가

3.검정 카드 2장을 매칭 후 실패하면 게임 종료


  • 구현과정

1. ChangeColor함수에 매개변수 추가

(sprite square의 색깔을 단순하게 변경하는 방법)

ChangeColor 함수에 string Backcolor 매개변수를 추가하여, 매개변수에 색깔을 적으면 카드색상을 변경하도록 설정한다.

    public void ChangeColor(string Backcolor)
    {
        if (Backcolor == "green")
        {
            backColor.color = new Color( 29f/ 255f, 179f/ 255f, 172f/ 255f);
        }
        else if (Backcolor == "red")
        {
            backColor.color = new Color( 227f/ 255f, 51f/ 255f, 51f/ 255f);
        }
        else if (Backcolor == "black")
        {
            backColor.color = new Color( 0f/ 255f, 0f/ 255f, 0f/ 255f);
        }
       
    }

 

(4종류의 색상 카드 이미지를 활용하여, 경우에 따라 각각의 색상이미지로 변경하는 방법)

    public GameObject ImageChange;
 
    public void ChangeColor(string Backcolor)
    {
        if (Backcolor == "green")
        {
            ImageChange.GetComponent<ImageChange>().ChangeGreen();
        }
        else if (Backcolor == "red")
        {
            ImageChange.GetComponent<ImageChange>().ChangeRed();
        }
        else if (Backcolor == "black")
        {
            ImageChange.GetComponent<ImageChange>().ChangeBlack();
        }
    }
}

 

ImageChange.cs

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;

public class ImageChange : MonoBehaviour
{
    public Sprite green_img;
    public Sprite red_img;
    public Sprite black_img;

    Image thisImg;

    // Start is called before the first frame update
    void Start()
    {
        thisImg = GetComponent<Image>();
    }

    // Update is called once per frame

    public void ChangeGreen()
    {
        thisImg.sprite = green_img;
    }
    public void ChangeRed()
    {
        thisImg.sprite = red_img;
    }
    public void ChangeBlack()
    {
        thisImg.sprite = black_img;
    }
}

 


2. 매칭 실패시마다 카드색상 3단계로 변경

2-1. SwitchColor.cs 생성

 using System.Collections;
 using System.Collections.Generic;
 using UnityEngine;

 public class SwitchColor : MonoBehaviour
 { 

 

2-2. 오픈한 카드의 색깔을 구분하기 위해, 카드 위치를 담을 리스트와 변수 생성

    List<string> GreenPos = new List<string>(); //그린카드 위치 리스트
    List<string> RedPos = new List<string>(); //레드카드 위치 리스트
    List<string> BlackPos = new List<string>(); //블랙카드 위치 리스트
 
    Vector2 fPos; //첫번째 카드 위치
    Vector2 sPos; //두번째 카드 위치

 

2-3. 문자열 변수 생성

    string fL;
    string sL;

 

2-4. switchColor 함수 생성, 카드 매칭 실패시 GameManager에서 카드 위치 받아와서 문자형태로 변경

    public void switchColor()
    {
        fPos = GameManager.instance.firstCard.transform.position; //첫번째 카드 위치
        fL = "'" + fPos + "'"; //위치를 문자열로 변경
        sPos = GameManager.instance.secondCard.transform.position; //첫번째 카드 위치
        sL = "'" + sPos + "'"; //위치를 문자열로 변경
 

 

2-5. 경우에 따라 카드 위치를 특정 리스트에 추가

-두 카드 전부 흰색인 경우, 둘 다 그린리스트에 추가하고 색상 그린으로 변경.

             //두 카드 전부 흰색이면,
             if (!GreenPos.Contains(fL) && !GreenPos.Contains(sL) && !RedPos.Contains(fL) && !RedPos.Contains(sL) && !BlackPos.Contains(fL) && !BlackPos.Contains(sL))
             {
                 GreenPos.Add(fL); //첫번째 카드위치 그린리스트에 추가
                 firstCard.ChangeColor("green"); //첫 카드 그린색상
                 GreenPos.Add(sL); //두번째 카드위치 그린리스트에 추가
                 secondCard.ChangeColor("green"); //두번째 카드 그린색상
              }      

 

-둘 다 그린인 경우, 둘 다 레드리스트에 추가하고 색상변경. + 그린리스트에서 제거.

 
             else if (GreenPos.Contains(fL) && GreenPos.Contains(sL)) //둘다 그린,
             {
                 RedPos.Add(fL); //첫째 레드리스트에 추가
                 GreenPos.Remove(fL); //첫째 그린리스트에서 삭제
                 firstCard.ChangeColor("red");  
                 RedPos.Add(sL); 
                 secondCard.ChangeColor("red");
                 GreenPos.Remove(sL);
             }

…(모든 경우의 수를 else if로 추가)

 

참고사이트

https://pleasefixthebug.tistory.com/entry/unityListUsing

 

[UNITY] C# list 사용법

◎ List선언 list 변수명 = new List() ; list 변수명 = new List() {.... } ; 더보기 List num = New List(); List num2 = new List() {1,2,3,4} ◎ 배열 추가 : Add(값) List num = new List(); num.Add(0); ◎ 중간에 넣기 : Insert(인덱스,

pleasefixthebug.tistory.com

2-6. 게임이 끝날때마다 각각의 위치리스트를 초기화하는 함수 생성

    public void resetList() //위치리스트 초기화 함수
    {
        GreenPos.Clear();
        RedPos.Clear();
        BlackPos.Clear();
    }      
}

3. 매칭 실패한 카드 색상이 둘 다 블랙인 경우, 게임종료(BlackOver함수 실행)

 
             else if (BlackPos.Contains(fL) && BlackPos.Contains(sL)) //둘 다 블랙인 경우
             {
                 BlackOver();
             }
 

 

GameManager.cs

 
    public void BlackOver()
    {
        endTxt.SetActive(true);
        Time.timeScale = 0.0f;
        this.audioSource.Stop();
        GreenPos.Clear(); //그린리스트 초기화
        RedPos.Clear(); //레드리스트 초기화
        BlackPos.Clear(); //블랙리스트 초기화
    }

  • 회고

>> 경우의 수를 다 적다보니 if절 뒤로 else if가 많아져서 코드가 너무 길어졌다.

다음에는 좀 더 간결한 코드를 짤 수 있도록 노력해야겠다.

728x90
반응형