2024년 4월 17일 수요일 개발일지 / GitHub에 대해서와 PlayerPrefs 기능

2024. 4. 17. 21:36나의 개발자 기록/본 캠프 개발 일지

2024년 4월 17일 수요일


 

오늘은 9시에 ZEP에 들어가 팀 프로젝트 회의하기 전에 복습할 거 간단하게 복습하고, 30분부터 팀 미니 프로젝트 회의를 진행하였습니다.  저희가 구현 했던 기능들을 정리하고, 남은 기능들 중에서 Stage와 관련된 기능들은 기존의 MainScene을 완성하고나서 복사해야하기 때문에, MainScene에 있는 내용들을 조금 더 정리해서, Stage를 몇개할 것인지 의논하여 나온 것이 총 4개의 Stage였습니다. 그렇게 팀장님께서 카드 배분 같은 스테이지 별로 영향이 있는 것들은 Switch Case로 세분화 해주셨고, StartScene과 MainScene을 각 스테이지 별로 Stage1Scene 등등 각 팀 5명씩 맡아서 작업을 했습니다.

 

1스테이지는 8개, 2스테이지는 12개, 3스테이지는 16개, 4스테이지는 20개로 보드 스크립트에서 수정하는 것과, GameManager에 있는 시간을 스테이 별로 조절하는 것만 수정하는 것이기 때문에 어렵지 않은 작업이었습니다. 저는 MainScene의 기반이 되었던 3Stage를 담당했기 때문에 별 다른 작업을 하지 않았고, 무슨 오류가 없었는지, 뭐가 빠지지는 않았는지 체크하였고, 그렇게 점심시간이 되어 점심을 먹고, 2시에 있을 GitHub 강의에 참여를 하여 강의를 들었습니다. 튜터님께서 너무 잘 설명해주셔서 알아 듣기 매우 쉬웠고, 이번 기회에 개발일지에다가 강의 해주셨던 내용을 간단하게 요약해보려고 합니다.


Git과 GitHub 강의 요약

 

Git이란?

- 팀 프로젝트 작업물을 공유하기 위해, 그리고 팀 프로젝트 협업을 위해 사용하는 버전 관리 시스템

- Git을 사용하는 이유는 서로의 작업물을 공유를할 때 여러가지 문제점을 방지하기 위한 것

 

 

각종 용어들

- Local Repository : 개인 컴퓨터 저장소.

- Remote Repository : 원격 저장소.

 

- History : 지금까지 작업했던 것들을 로그, 기록으로 표시해주는 것.

- Commit : 작업한 것을 제출하는 것.

- Push : 작업한 것을 원격 저장소에 업로드하는 것.

- Pull : 다른 사람이 작업한 것을 받아 오는 것.

 

- Branch : 세분화 시키는 것.

- Merge : Branch에서 작업한 것들을 합병하는 것.

 

GitHub란?

왼쪽이 Git, 오른쪽이 GitHub

 

기존의 Git을 사용하기엔 저와 같은 노베이스 개발자들에게 있어서 사용하기 어렵기 때문에 간단하게 사용할 수 있는 GitHub Desktop을 사용한다고 합니다.

 

대규칙

하나의 파일을 여러명이 동시에 작업하지 말 것

→ 깃플로우 전략과 깃 컨벤션

깃 플로우 전략

깃 플로우 전략은 Branch를 사용하여 각 기능들 별로 따로 빼와서 작업을 한 뒤에 이상이 없을 경우 기존의 main Branch에 패치하는 방식이라고 합니다.

 

깃 컨벤션

 

그리고 깃 컨벤션은 팀마다 Branch와 Merge할 때의 룰을 정해서 History 기록을 좀 더 깔끔하고 알아보기 쉽게 서로 정하는 약속이라고 한다네요.


오후에 했던 작업과 문제점들

 

강의가 끝나고 나서 저와 저희 팀원분들은 다 같이 모여서 GitHub에 대해서 이야기를 나누었고, 저희가 저번에 코드가 날라갔던 이유가 같은 스크립트를 서로 건들여서 한쪽의 내용이 날아갔던 문제인 것을 강의 덕분에 알게 되었습니다. 그 다음에 저희가 오전에 작업하는 것과 챌린지 기능외에도 추가로 또 다른 기능이 필요한다거나 쓸만한 것을 이야기하다가 다른 팀원분은 정지 버튼을 만드셨고, 저는 Scene이 늘어난 것에 따른 Next 버튼에다가 해당 씬을 불러오는 기능을 만들었습니다. 이 기능은 기존에 사용하던 MainScene 관련 로드를 각각의 스테이지 별로 추가만 하는 작업이였기 때문에 크게 문제가 생기지 않았습니다.그 다음으로 한 작업은 EndPanel 애니메이션이 시간이 지나면 뜨지만, 카드 스크립트를 다 맞췄을 때는 안뜨는 문제가 있어서 봤더니 카드를 다 맞췄을 때 애니메이션이 나오는 스크립트를 포함하지 않았었습니다. 그래서 바로 추가해주고, 팀장님께서 EndPanel에 있는 현재 점수최고 점수를 메인 게임 화면에도 추가하는 게 좋을 것 같다고 하셨기 때문에, 저는 바로 그 작업에 들어갔습니다.

 

public void GameOver()
{

    Invoke("GameEnd", 0.3f);

    if (PlayerPrefs.HasKey(key))
    {
        int best = PlayerPrefs.GetInt(key);
        if (best < score)
        {
            PlayerPrefs.SetInt(key, score);
            bestScore.text = score.ToString();
        }
        else
        {
            bestScore.text = best.ToString();

        }

    }
    else
    {
        PlayerPrefs.SetInt(key, score);
        bestScore.text = score.ToString();
    }
    //이번판 점수 저장
    nowScore.text = score.ToString();
    endPanel.SetActive(true);
}

 

일단 코드를 확인해 본 결과 GameOver라는 함수에 데이터를 저장하는 함수인 PlayerPrefs가 들어 있었는데, 이건 다른 분이 작업하셨던 거였고, 저는 이제 메인 화면에도 해당 데이터를 띄워야하기 때문에 유니티 내에서 오브젝트를 만들고 스크립트 내에도 기존에 EndPanel에서 했던 것처럼 만들었습니다. 그런데 GameOver라는 함수에 들어가 있어서 게임이 종료되었을 때에만 적용이 된다면, 메인 화면에서는 적용하기 힘들기 때문에 저는 데이터 저장 부분을 BestScore라는 이름으로 함수를 만들어 따로 빼둔 뒤에 업데이트 문에다가도 실행할 수 있게 끔 설정했습니다. 여기까지는 문제가 없이 잘 작동을 했지만, 가장 큰 문제는 스테이지가 4개가 되었기 때문에 각 스테이지 별로 최고 점수가 다르게 적용되어야 하는 문제였습니다.

 

일단 생각을 좀 해본 결과 팀장님께서 사용하셨던 Switch Case를 사용하면 어떨까하는 생각이 들었지만, 그렇게 했을 경우 코드가 너무 길어지기 때문에 좀더 생각을 해보았습니다. 그렇게 생각한 것이 팀장님께서 스테이지를 불러오는 것이 "숫자"인점을 생각하여 기존의 Key에다가 배열을 추가하여 StageIdx를 넣으면 해결이 될 것 같아서 일단 진행을 해보았습니다.

 

string[] key = { "bestScore","BestScore1", "BestScore2", "BestScore3", "BestScore4" };

public void GameOver()
{
    Invoke("GameEnd", 0.3f);
    endPanel.SetActive(true);
}

public void BestScore()
{
    if (PlayerPrefs.HasKey(key[stageIdx]))
    {
        int best = PlayerPrefs.GetInt(key[stageIdx]);
        if (best < score)
        {
            PlayerPrefs.SetInt(key[stageIdx], score);
            bestScore.text = score.ToString();
            mainBestScore.text = score.ToString();
        }
        else
        {
            bestScore.text = best.ToString();
            mainBestScore.text = best.ToString();

        }

    }
    else
    {
        PlayerPrefs.SetInt(key[stageIdx], score);
        bestScore.text = score.ToString();
        mainBestScore.text = score.ToString();
    }
    //이번판 점수 저장
    nowScore.text = score.ToString();
    mainNowScore.text = score.ToString();
}

 

이렇게 하니까 Swtich Case를 쓰는 것보다 코드 줄 절약이 되고, 유니티 내에서 잘 적용이 되는 것을 확인 했습니다. 이렇게 하고나서 생각을 해보니까 제가 스스로 배운 내용에 대해서 생각을하고 어떤 방식으로 코드를 짜면 작동을 하겠구나... 라는 뭐랄까 제 스스로 뭔가를 이루어냈다라는 달성감이 생겨서 코딩에 좀 더 빠지는 계기가되지 않았나 싶습니다.

1스테이지와 2스테이지, 3스테이지

이렇게 팀 프로젝트를 진행하면서 다양한 기능을 추가하고, 다 같이 게임을 만든다는 것 자체가 굉장히 신기하고, 뭔가 뿌듯하면서 재미있는 시간이 되었던 것 같습니다. 아직 완성이 된 건 아니지만 내일 또 팀원분들과 회의를 진행해서 기존에 있던 르탄이 이미지들 대신에 저희들의 사진이나 슬랙 이미지 같은 것을 넣을 예정이기도 하고, 시간이 남는다면 디자인적으로도 바꿀 생각이 있는지라 좀 더 힘을 내서 만들어야할 것 같습니다!