금일 작업 :
- 이미지 작업. 동일크기로 수정
- 카드 셔플 새로 구현
- 결과 저장 및 UI 노출
- 게임 버그수정 (4장이 남은 상황에서 짧은시간 안에 연속으로 맞추는 경우 정상종료 안됨.)
- 깃 사용 테스트
이슈 :
- 깃을 통해 풀을 수행하는 중 충돌이 나는 경우 완벽하게 풀이 완료되지 않아 유니티상 오브젝트 안에 세팅이 제대로 안되는 경우가 있다.
- github의 pull requests를 처음 사용해봄. 일하면서 깃허브를 사용할 일이 없다보니 이런 문화?나 프로세스가 적응이 바로되진 않음.
- GameManager 내에서 많은걸 하고 있는데 이를 굳이 파일 분할을 할 필요가 있을지, 나누게 되면 오히려 관계가 복잡해질것같아 고민된다.
- 유니티에서 오브젝트나 밸류를 받아오는 것이 과해진 느낌. 실무에서는 결과물만 봤지 실제 개발하는 중간에는 본적이 없어서 차후 데이터파일로 설정값들을 빼는 경우 어떻게 컨트롤 할지 궁금
코드 :
GameManager.cs
List<int> rtans = new List<int>(); // 카드패
int maxScore;
int curScore;
int tryCount;
int correctCount;
int cardObjectCount = 16;
...
// 카드 리스트 생성
void InitGame(int difficulty)
{
InitScore();
switch (difficulty)
{
case (int)Difficulty.easy:
// 쉬움
cardObjectCount = 12;
col = 4;
row = 3;
scale = 1f;
break;
case (int)Difficulty.normal:
cardObjectCount = 16;
// 보통
col = 4;
row = 4;
scale = 0.95f;
break;
case (int)Difficulty.hard:
cardObjectCount = 24;
// 어려움
col = 6;
row = 4;
scale = 0.9f;
break;
default:
// 에러
break;
}
for (int i = 0; i < cardObjectCount / 2; i++)
{
rtans.Add(i);
rtans.Add(i);
}
}
// 카드 셔플
void ShuffleCard()
{
int cardCount = rtans.Count;
for (int i = 0; i < cardCount; i++)
{
// 위치 바꿀 자리 선택
int shuffleIndex = Random.Range(i, cardCount);
// 위치 교환
int tmp = rtans[shuffleIndex];
rtans[shuffleIndex] = rtans[i];
rtans[i] = tmp;
}
}
// 카드 생성
void GenCard()
{
for (int i = 0; i < rtans.Count; i++)
{
GameObject newCard = Instantiate(card);
newCard.transform.parent = GameObject.Find("Cards").transform;
float x = (i / col) * (float)(6.0 / row) - ((float)(6.0 / row) * (row - 1)) / 2;
float y = (i % col) * (float)(8.0 / col) - ((float)(8.0 / col) * (col - 1)) / 2 - 1f;
//newCard.transform.position = new Vector3(x, y, 0);
StartCoroutine(SpiralEffect(newCard, 1f, new Vector3(x, y, 0)));
string rtanName = "rtan" + rtans[i].ToString();
newCard.transform.Find("Front").GetComponent<SpriteRenderer>().sprite = Resources.Load<Sprite>(rtanName);
}
GameObject.Find("Cards").transform.localScale = new Vector3(scale, scale, 1f);
}
// 게임 시작시 초기화
void Start()
{
Time.timeScale = 1.0f;
time = maxTime;
InitGame(DataManager.Instance.level);// 파라미터는 난이도
ShuffleCard();
GenCard();
}
...
// 그림을 맞췄을때 점수 계산 및 저장 실행
public void IsMatched()
{
string firstCardImage = firstCard.transform.Find("Front").GetComponent<SpriteRenderer>().sprite.name;
string secondCardImage = secondCard.transform.Find("Front").GetComponent<SpriteRenderer>().sprite.name;
// 매칭 시도 횟수 카운트
tryCount++;
if (tryCount % 10 == 0)
{
// 시도 10회마다 -10점
curScore -= 5;
}
if (firstCardImage == secondCardImage)
{
//audioSource.PlayOneShot(match);
audioSource.PlayOneShot(correct);
nameTime = 0f;
// 텍스트 켜기
nameTxt.gameObject.SetActive(true);
// 스프라이트에서 번호 추출하여 해당하는 이름으로 세팅하기
nameTxt.text = names[ExtractNumber(firstCardImage)];
firstCard.GetComponent<Card>().DestroyCard();
secondCard.GetComponent<Card>().DestroyCard();
// 맞춘 점수 +10
curScore += 10;
correctCount++;
Card[] leftCards = GameObject.Find("Cards").transform.GetComponentsInChildren<Card>();
foreach (Card card in leftCards)
{
card.transform.Find("Back").GetComponent<SpriteRenderer>().color = Color.white;
card.transform.Find("Front/Front_Bg").GetComponent<SpriteRenderer>().color = Color.white;
}
//int cardsLeft = GameObject.Find("Cards").transform.childCount;
//if (cardsLeft == 2)
if (correctCount == cardObjectCount / 2)
{
if (DataManager.Instance.level < 2)
{
DataManager.Instance.level++;
nextGameText.SetActive(true);
}
else
{
DataManager.Instance.level = 0;
endText.SetActive(true);
}
Time.timeScale = 0.0f;
// 점수계산 및 저장
//gameScore += Mathf.FloorToInt(maxTime - time) * 10;
curScore += Mathf.FloorToInt(time * 10);
SaveScore();
}
}
else
{
nameTime = 0f;
// 텍스트 켜기
nameTxt.gameObject.SetActive(true);
nameTxt.text = "실패";
audioSource.PlayOneShot(incorrect);
firstCard.GetComponent<Card>().CloseCard();
secondCard.GetComponent<Card>().CloseCard();
// 틀려서 감점 -1
curScore -= 1;
}
firstCard = null;
secondCard = null;
}
...
// 점수 초기 세팅
void InitScore()
{
if (!PlayerPrefs.HasKey("MaxScore"))
{
// 최고점수 기록이 없으면 초기화
PlayerPrefs.SetInt("MaxScore", 0);
}
maxScore = PlayerPrefs.GetInt("MaxScore");
curScore = 0;
tryCount = 0;
correctCount = 0;
highScoreText.text = maxScore.ToString();
curScoreText.text = curScore.ToString();
curTryText.text = tryCount.ToString();
}
// 점수 결과 저장
void SaveScore()
{
//한번 더 검증 후 저장
if (maxScore < curScore)
{
maxScore = curScore;
}
// 이전기록 비교
PlayerPrefs.SetInt("MaxScore", maxScore);
}
'TIL' 카테고리의 다른 글
20231229 TIL (1) | 2023.12.29 |
---|---|
20231228 TIL (0) | 2023.12.28 |
20231227 TIL (0) | 2023.12.27 |
20231226 TIL (1) | 2023.12.26 |
20231221 TIL (0) | 2023.12.21 |