>> 기존 기능 업그레이드
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. 문자열 변수 생성
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
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가 많아져서 코드가 너무 길어졌다.
다음에는 좀 더 간결한 코드를 짤 수 있도록 노력해야겠다.