내용
오늘의 학습 키워드
- 깃허브
오늘 학습한 내용
- 깃허브를 이용하여 협업이 가능하다.
1. Create - 작업공간에 Git으로 설정 ignore에서 유니티와 visual studio를 체크하면 필요한 파일 위주로 볼 수 있다.
2. Github에서 원격 저장소에 있는 파일을 로컬 저장소로 다운이 가능하다.
3. Init - 저장소를 만드는 것
4. Clone - 최초 원격 저장소에서 로컬 저장소로 다운로드 한 파일
5. Commit - 작업 내용을 로컬 저장소에 저장 => 원격에는 반영되지 않음.
6. Push - 로컬 저장소에서 원격 저장소로 업로드 하는 것
7. Pull - 원격 저장소에서 로컬 저장소로 저장하는 것
8. Branch - 별도의 작업 공간 B에서 작업하는 것? 원격 저장소에 업로드해도 A 브런치가 아닌 B에 업로드 되기에 A에 영향을 주지 않는다.?
9. Merge - 브런치간 데이터를 합치는 것
- 팀원 소개 카드게임 - firstCard 고르고 5초 간 카운트 다운 - 안 고르면 다시 닫기
1. 어떻게 기능을 추가 할 것인지
5초 카운트다운을 해야하니 countdownTxt를 추가해야 겠다고 생각하고 위치는 timeTxt 아래에 표시
30초 제한을 나타내는 gameManager.cs의 Update()에 5초를 카운트하는 코드 추가
2. 진행과정
처음에는 card.cs에 기능을 추가하면 되겠다고 생각했으나 도저히 방법을 찾을 수 없었다.... 결국 30초의 게임 제한 시간을 표시 기능을 가진 gameManager.cs의 Update()에 5초 타이머를 추가하기로 결정했다. 타이머를 구현하는 것은 간단했지만 진행이 막힌 채 시간만 지나가 튜터님을 찾아가려 했으나 조금만 더 생각하고 검색하기로 했고 어느 정도 방법에 접근 할 수 있었다. gameManager.cs의 필드에 public bool countDownCheck = false;
float countDown = 5f;을 추가하고 Update()에 코드를 추가했다.
if (countDownCheck)
{
countDown -= Time.deltaTime;
countDownTxt.text = countDown.ToString("N1");
if (countDown <= 0f)
{
firstCard.GetComponent<card>().CountDown();
countDown = 5f;
}
}
card.cs의 openCard()에서 첫번째 카드 일 때 countdowncheck값이 true가 되게 하고 card.cs에 countdown 함수 추가했다.
public void CountDown()
{
if(gameManager.I.firstCard != null && gameManager.I.secondCard == null)
{
Invoke("closeCardInvoke", 0f);
}
}
첫 번째 카드를 누르면 5초 카운트가 시작되고 5초가 지나면 카드가 뒤집히는 것을 확인했다.
그런데 두번째 카드를 누를 경우 시간 초기화도 되지 않고 세번째에 초기화가 되고 같은 쌍을 고르면 5초 타이머가 지나고 게임이 멈추는 오류가 발생했다.
NullReferenceException: Object reference not set to an instance of an object
gameManager.Update () (at Assets/Scripts/gameManager.cs:67) // firstCard.GetComponent<card>().CountDown(); 오류
우선 5초가 지나고 첫 번째 카드가 뒤집히고도 두번 째 카드를 고를 때 시간이 초기화되지 않는 문제를 해결하고자 했다. card.cs의 openCard함수에서 firstCard에 게임오브젝트가 할당되었기 때문에 다시 firstCard를 공백으로 만들어야 5초후 클릭하는 카드가 firstcard가 된다는 것을 발견했다.
gamemanager.cs의 update에 5초가 지났을 때 firstCard를 다시 비우게 했다.
if (countDownCheck)
{
countDown -= Time.deltaTime;
countDownTxt.text = countDown.ToString("N1");
if (countDown <= 0.001f)
{
firstCard.GetComponent<card>().CountDown();
firstCard = null; // 다시 값을 비움
countDown = 5.001f;
}
}
5초가 지나고 다시 카드를 고르면 5초 카운트가 시작되나 2번째 카드를 골라도 시간이 지나가고 같은 카드를 고르고 시간이 5초가 지나면 8번에서 발생하는 오류가 발생했다.
우선 다른 2개의 카드를 고르면 시간이 다시 5초로 초기화되도록 해보자고 생각하고 타이머는 countdowncheck가 true일 때만 진행되므로 2개가 다른 카드면 countdowncheck를 false로 바꾸고 countdown값을 다시 5초로 설정하면되겠다고 생각했다.
gamemanager.cs의 ismatched함수의 else에 코드추가
else
{
firstCard.transform.Find("back").GetComponent<SpriteRenderer>().color = new Color(180 / 255f, 180 / 255f, 180 / 255f, 255f);
secondCard.transform.Find("back").GetComponent<SpriteRenderer>().color = new Color(180 / 255f, 180 / 255f, 180 / 255f, 255f);
firstCard.GetComponent <card>().closeCard();
secondCard.GetComponent<card>().closeCard();
countDownCheck = false; //추가
countDown = 5.001f; // 추가
}
두 개의 카드가 일치할 경우도 타이머가 초기화가 되지 않는 것을 발견하고 ismatched함수의 if에 코드를 추가했다.
오늘의 회고
- 힘들지만 보람있는 하루였다. 계속 시행착오를 겪을 때는 정말 괴로웠지만 기능이 구현되는 장면을 봤을 때 정말 기분이 좋았다.
- 20시에 팀원들과 회의를 할 때 마지막에 좋은 반응을 보여줘서 정말 고마웠다. 강성원 팀원님이 조언해 준 내용인 코루틴에 대해서 알아봐야 겠다.
- 프로젝트 명을 임의로 변경했는데 Scene 이름이 변경한 이름으로 바뀌어 있었다. 관련 내용을 기억해 둬야겠다.
- (12/26일 추가) 에러가 나는 이유에 대해서 생각해보니 CountDown함수의 조건에 맞지 않는데 함수를 불러오려 해서 그런 것이었고 코드 추가 후에 에러가 발생하지 않은 것은 countDown의 값을 다시 5초로 변경해 줬기 때문인 것 같다.
내일 할 일
- 에너지 재충전하기
- 코루틴 찾아보기
'TIL' 카테고리의 다른 글
내일배움캠프 6일차 TIL (C# 문법 종합) (0) | 2023.12.29 |
---|---|
내일배움캠프 5일차 TIL (미니 팀 프로젝트) (0) | 2023.12.28 |
내일배움캠프 4일차 TIL (미니 팀 프로젝트) (0) | 2023.12.27 |
내일배움캠프 3일차 TIL (미니 팀 프로젝트) (2) | 2023.12.26 |
내일배움캠프 시작 TIL (미니 팀 프로젝트) (0) | 2023.12.21 |